PostgreSQL: Могу ли я сделать pg_start_backup () на живом, работающем БД под нагрузкой?

19

Наша установленная репликация не работает («запрошенный сегмент WAL уже удален» во время простоя) Мы не можем легко снова остановить мастер.

Можем мы сделать

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ хозяин рабу,
  3. pg_stop_backup()

... в то время как мастер postgresql все еще находится под полной нагрузкой? (Или pg_start_backup()приведет к

  • настольные замки,
  • Блоки ввода / вывода,
  • несогласованности,
  • Пожарная тревога,
  • медленный ответ дБ

Другими словами, pg_start_backup()повлияет ли наше приложение?

Даниил
источник
Вы проверили документы ? Он говорит: «По умолчанию pg_start_backup может занять много времени, чтобы закончить. Это потому, что он выполняет контрольную точку, и ввод-вывод, необходимый для контрольной точки, будет распределен в течение значительного периода времени, по умолчанию половина вашей промежуточной контрольной точки интервал (см. параметр конфигурации checkpoint_completion_target). Обычно это то, что вы хотите, потому что это минимизирует влияние на обработку запросов. " Что это означает на практике (и в вашем случае), однако, не совсем понятно.
Дезсо

Ответы:

11

pg_start_backupбудет выполнять контрольно-пропускной пункт, как отмечает Дезсо. Это оказывает влияние, но ваша база данных в любом случае выполняет контрольные точки довольно регулярно, и должна работать так, чтобы они явно не были для вас проблемой. Ранняя контрольная точка означает, что было накоплено меньше данных, а это означает, что контрольная точка, с которой она работает, pg_start_backupбудет иметь меньшее воздействие, чем обычно.

Где вам нужно беспокоиться, это rsync или эквивалентный pg_basebackupшаг. Чтение ввода-вывода из этого не будет слишком плохим, поскольку оно последовательное, но оно все же, вероятно, значительно ухудшит производительность ввода-вывода вашей базы данных, а также будет стремиться вытеснить горячие данные из кеш-памяти в пользу меньшего количества -используемые данные, что приводит к перебоям в кеше, поскольку более необходимые данные затем считываются обратно.

Вы можете использовать niceи, ioniceчтобы помочь ограничить влияние ввода-вывода (но не влияние кэша); Тем не менее, есть цена для этого. Резервное копирование займет больше времени, и до тех пор, пока вы не завершите резервное копирование и не запустите pg_stop_backupсвою систему - как я понимаю, - накапливается WAL, который она не может удалить, накапливает задолженность контрольных точек для БОЛЬШОЙ контрольной точки в конце выполнения резервного копирования и накапливает таблицу и индекс раздувать, потому что он не может очистить мертвые ряды. Таким образом, вы действительно не можете позволить себе резервное копирование навсегда, особенно если у вас очень высокие показатели оттока.

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

К сожалению, вам в значительной степени нужно проверить это и посмотреть.

Если вы можете, то, возможно, стоило бы выпустить CHECKPOINTатомный снимок тома, на котором находится ваша база данных, вместо этого, используя LVM, инструменты вашей SAN, EBS или что-то еще. Если вы можете сделать это, вы можете скопировать снимок на досуге. Этот подход не подходит для создания базовой резервной копии для PITR / горячего резервирования / горячего резервирования, но он идеально подходит для статической резервной копии и оказывает гораздо меньшее влияние на систему. Вы можете сделать это только в том случае, если ваши снимки являются атомарными, а вся база данных, включая WAL, находится на одном томе.

Одна возможность, которую я еще не исследовал, - это объединение двух подходов. Мне приходит в голову, что кто-то может ( непроверенный и, возможно, неправильный и небезопасный , я еще не знаю):

  • pg_start_backup
  • Триггерные снимки всех табличных пространств, основного каталога данных и тома xlog
  • pg_stop_backup
  • Скопируйте WAL до окончательного архива из pg_stop_backup
  • Скопируйте данные из томов моментальных снимков

По сути, идея состоит в том, чтобы сократить длительность задержки БД на своих контрольных точках, используя момент времени для каждого тома, который вы можете скопировать на досуге.

Крейг Рингер
источник
Поняв, что pg_start_backup () в основном является «объектом контролируемой проверки», мы заработали уверенность, чтобы просто попробовать и посмотреть. Кажется, влияние на работающее приложение было незначительным. (основной источник данных по SSD) :-) Идея "непроверенного и, возможно, небезопасного", которую вы предложили, немного выше нашего уровня компетентности и жажды приключений.
Даниэль
О, и мы не сделали rsync с первой попытки. Потому что мы действительно хотели увидеть дополнительную нагрузку на мастера. Поскольку нам никогда не требовался второй прогон rsync, все хорошо. Мы чему-то научились из этого.
Даниэль
7

Это могила, но я должен кое-что исправить здесь.

Предыдущий ответ гласит:

Вы можете использовать nice и ionice, чтобы ограничить влияние ввода-вывода (но не влияние кэша); Тем не менее, есть цена для этого. Резервное копирование займет больше времени, и пока вы не завершите резервное копирование и не запустите pg_stop_backup, ваша система - как я понимаю, - накапливает WAL, который она не может удалить, накапливает долг контрольной точки для БОЛЬШОЙ контрольной точки в конце выполнения резервного копирования и накапливает таблицу и раздувание индекса, потому что он не может очистить мертвые строки. Таким образом, вы действительно не можете позволить себе резервное копирование навсегда, особенно если у вас очень высокие показатели оттока.

Это не правда. Система сохранит количество WAL, указанное в вашей конфигурации (см. Онлайн-документацию ). Таким образом, в основном, чем выше значение между:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Давайте представим этот случай:

  • Ваша резервная копия занимает много времени, так как есть сотни гигов для копирования
  • у вас есть небольшое удержание WAL (например, checkpoint_segments до 3)
  • у вас нет настройки архивации WAL

затем после запуска pg_start_backup () ваши файлы WAL будут вращаться во время резервного копирования. Когда резервное копирование будет завершено, вы попытаетесь восстановить его на другом ядре базы данных. Движок при запуске будет запрашивать как минимум файл WAL, сгенерированный при запуске pg_start_backup ().

pg_start_backup 
-----------------
B/D0020F18
(1 row)

База данных не примет загрузку, пока вы не предоставите файл WAL «0000000x0000000B000000D0» (где x - ваш TimelineID ). Этот файл WAL является минимальным для загрузки системы. Конечно, только с этим файлом вы потеряете данные, так как остальные данные находятся в файлах WAL, которых у вас нет, но, по крайней мере, у вас будет работающее ядро ​​базы данных.

Таким образом, либо вы должны выполнить архивирование WAL, либо вы должны сохранить необходимые файлы WAL самостоятельно, но Postgresql не сделает это за вас.

sterfield
источник
3
Очень хорошее наблюдение. Этого можно избежать, pg_basebackup --xlog-method=streamхотя, если я не ошибаюсь.
tomorrow__
2
Да, начиная с PG 9.2, вы можете передавать WAL с помощью базовой резервной копии. Он откроет второй поток, поэтому вам нужно max_wal_sendersустановить минимум на 2. Это хороший способ избежать проблемы «отсутствующего WAL» в конце резервного копирования.
Стерфилд
4

Что касается моего опыта работы с PostgreSQL, то это относительно безопасная операция, если вы не оказываете существенного влияния на производительность в этот момент. Если он у вас есть, то лучше временно приостановить запись от всех ваших клиентов.

У меня был только один критический случай при синхронизации моего мастера с ведомым устройством под нагрузкой, и это было вызвано OOM killer (да, вам действительно следует ПОЛНОСТЬЮ отключить OOM Killer на узлах базы данных, я не знал этого в тот день).

Поэтому я восстановил базу данных из ночной резервной копии и передал postgres все сегменты WAL из каталога pg_archive для воспроизведения (просто скопировал их в папку pg_xlog). Все прошло нормально, но простои были неизбежны, конечно.

Riki_tiki_tavi
источник