Рубрики
Uncategorized

Ускорение Postgres восстанавливает

Как я почувствовал во всем этом процессе Первоначально опубликовано на ProCrastinatingDev.com Недавно я сел … Помечено Postgres, Devops, SoftWaredEvelopment, база данных.

Как я почувствовал во всем этом процессе

Первоначально опубликовано procrastinatingdev.com

Недавно я сел, чтобы ускорить процесс восстановления базы данных в нашей среде разработки. Как и большинство проектов, наша база данных началась небольшая и значительно выросла в течение многих лет. Когда мы начали базу данных, была просто пара MB несжатых. Теперь это почти 2 ГБ сжатый (50 ГБ несжатый). Мы восстанавливаем нашу Dev Environment раз в неделю в среднем, и старый способ сделать восстания больше не работал. Когда я видел » db восстановить foos? «В нашем слабом канале я знал, что пришло время исправить это.

Ниже приведен процесс, который я принял, чтобы ускорить нашу БД восстанавливает.

Наивный подход

Ниже приведено в основном наша первая версия резервного копирования и восстановления. В нашей базе данных Main Postgres мы проведем простую pg_dump и трубу вывода в gzip. Когда мы хотели восстановить нашу среду Dev Dev, мы превысим сжатый файл, Расдайте его, а затем просто загрузите его через команду PSQL.

$ pg_dump db | gzip > dump.gz

real 7m9.882s
user 5m7.383s
sys 2m56.495s

$ gunzip dump.gz

real 2m27.700s
user 1m28.146s
sys 0m41.451s

$ psql db < dump

real 30m4.237s
user 0m21.545s
sys 0m44.331s

Общее время на наивный подход: 39 минут, 41 секунды (32,5 минуты восстановления Dev)

Это работает довольно хорошо в течение длительного времени. Это просто, легко настроить и было быстро, когда наша БД была всего несколько сотен МБ. Очевидно, что 32,5 минуты для восстановления вашей DEV базы данных просто недопустимы.

Труба распаковывать

Моя первоначальная идея для ускорения нашего времени восстановления было просто трусить сжатый файл непосредственно в команду PSQL, используя zcat. . Вы можете подумать о ZCAT как то же самое, что и кот команда, но для сжатых файлов. Это несчастки файла и печатает его на стандартный выход, который вы можете затем терпеть в вашу команду PSQL.

$ pg_dump db | gzip > dump.gz

real 7m9.882s
user 5m7.383s
sys 2m56.495s

$ zcat dump.gz | psql db

real 26m22.356s
user 1m28.850s
sys 1m47.443s

Общее время: 33 минуты, 31 секунды (26,3 минуты восстановления dev, 20% быстрее)

Отлично это поправило процесс на 16% в целом, 20% на фактическом восстановлении. Поскольку ввод/вывод было узким местом, а не писать на диск, спас нас более 6 минут. В целом, хотя я все еще не был счастлив. 26 минут впустую на восстановление нашей базы данных Dev не было достаточно хорошей, я должен был пойти дальше.

Пользовательский формат

Как я выкопал в PG_Dump Документация Я заметил, что по умолчанию PG_Dump экспортирует файл SQL простой текста. Как вы можете видеть выше, мы тогда Гжип, чтобы сделать его меньшим хранить его. Postgres предоставляет пользовательский формат, который по умолчанию использует Zlib для его сжимания. Мое первоначальное мышление было то, что если Postgres уже пишет файл на диск в формате простого текста, было бы быстрее иметь Postgres также сжать его одновременно вместо того, чтобы трусить его в GZIP.

Из-за этого пользовательского формата мне пришлось переключиться на использование PG_RESTORE Поскольку вы не можете перенаправить сжатый файл с помощью PSQL.

$ pg_dump -Fc db > dumpfc.gz

real 6m28.497s
user 5m2.275s
sys 1m16.637s

$ pg_restore -d db dumpfc.gz

real 26m26.511s
user 0m56.824s
sys 0m15.037s

Всего Время 32 минуты, 54 секунды (26,4 минуты восстановления dev).

Я был прав, думая, что фактический процесс резервного копирования будет быстрее, так как нам не пришлось трусить вывод в GZIP. К сожалению, восстановление этого пользовательского формата на вашей локальной машине не привело к тому, что этот процесс не будет быстрее. Вернуться к доске для рисования.

Указание рабочих мест

Первое, что я всегда делаю, когда я ныряю в проблему, — это прочитать документацию и исходный код. Postgres имеет фантастическую документацию с четко выложенными и маркированными вариантами. Одним из этих вариантов является возможность указывать количество заданий, которые выполняются одновременно во время PG_RESTORE, выполняет наибольшее количество времени запчастей, загружать данные, создавать индексы или создавать ограничения.

PG_Restore Docs говорят, что хорошее место для начала с количеством параллельных рабочих мест — использовать количество ядер на вашем компьютере. My Dev Environment VM имеет 4 ядра, но я хотел посмотреть, какие разные ценности на время выполнения.

$ pg_dump -Fc db > dumpfc.gz

real 6m28.497s
user 5m2.275s
sys 1m16.637s

$ pg_restore -d db -j 2 dumpfc

real 25m39.796s
user 1m30.366s
sys 1m7.032s

Общее время 32 минуты, 7 секунд, (25,6 минуты восстановления dev на 3% быстрее, чем просто pg_restore).

Хорошо, это крошечное улучшение, можем ли мы толкать это больше?

$ pg_dump -Fc db > dumpfc.gz

real 6m28.497s
user 5m2.275s
sys 1m16.637s

$ pg_restore -d db -j 4 dumpfc.gz

real 22m6.124s
user 0m58.852s
sys 0m34.682s

Общее время 28 минут, 34 секунды (22,1 минута восстановления DEV на 14% быстрее, чем две работы).

Отлично, указывая четыре рабочих места на два ускорения в целом время восстановления на 14%. На данный момент мы сорвали его с 32,5 минуты на нашей среде Dev до 22,1 минуты, увеличение на 32%!

Мое мышление сейчас было, как далеко я мог бы толкать этот номер?

$ pg_dump -Fc db > dumpfc.gz

real 6m28.497s
user 5m2.275s
sys 1m16.637s

$ pg_restore -d db -j 8 dumpfc.gz

real 16m49.539s
user 1m1.344s
sys 0m39.522s

Общее время 23 минуты, 17 секунд (16,8 минуты восстановления dev, на 24% быстрее, чем четыре рабочих места).

Поэтому указывая удвоение количество рабочих мест, поскольку ядра сократилось время от 22,1 минуты до 16,8 минуты. На данный момент я поправил все время восстановления на 49%, что фантастически.

Могу ли я толкать это еще дальше?

$ pg_dump -Fc db > dumpfc.gz

real 6m28.497s
user 5m2.275s
sys 1m16.637s

$ pg_restore -d db -j 12 dumpfc.gz

real 16m7.071s
user 0m55.323s
sys 0m36.502s

Общее время 22 минуты, 35 секунд (16,1 минута восстановления dev, на 4% быстрее, чем восемь рабочих мест).

Указание 12 одновременных заданий. Способен процесс крошечного бита, но в целом влияет на использование ЦП VM к точке, где она не является чрезмерно полезной, когда восстановление происходит. На данный момент я поселился на восемь задач или удваиваю количество ядер как оптимальное число для использования.

Последние мысли

В конце концов наша активная вырезана почти пополам, от 30 минут до 16 минут. Это экономит нас более 72 часов восстановления времени в год (6 Devs, 52 Восстанавливает год, 14 минут). В целом я очень доволен этими изменениями. В будущем я буду смотреть на просто восстановление данных, а не всю БД и посмотреть, насколько быстрее это.

В Ускорение Postgres восстанавливает часть 2 Мы улучшаем время еще дальше, принося его до 5 минут.

Первоначально опубликовано procrastinatingdev.com

Оригинал: «https://dev.to/adammckerlie/speeding-up-postgres-restores-9ca»