Backup Postgresql hot-standby

Есть кластер Postgres с нативной репликацией, то есть streaming replication. Бэкапом нагружать мастер сервер не хочется, потому надо бэкапить со слейва. Но вот незадача. База большая, более 700 гигов.  И если запускать дамп, то дамп падает, когда приходят всякие длинные запросы.

Как вариант, можно делать вот так на слейве.

psql -U pgsql  postgres -c “SELECT pg_xlog_replay_pause()”

То есть ставим реплику на паузу, а потом после того как закончился бэкап, обратно стартуем реплику командой

psql -U pguser -p 9125 postgres -c “SELECT pg_xlog_replay_resume()”

Но, если база большая, бэкап занимает несколько часов  и потом мы рискуем тем, что slave просто не стартанет, потому что будет рассинхрон базы и не будет нужных WAL логов, потому что мастер их уже удалил.

Тут начиная с версии 9.4 нам на помощь приходит такая штука как replication slot.

В конфиге мастера добавляем. Можно добавлять больше, все зависит сколько у вас слейвов.

max_replication_slot = 1

На мастере создаем слот, для хранения запросов.

 

SELECT pg_create_physical_replication_slot(‘standby_slot_slave’);

На слейве его указываем в файле recovery.conf

primary_slot_name = ‘standby_slot_slave’

И там и там придется рестартануть postgres.  И после этого можно спокойно ставить на паузу реплику и делать дампы. Даже если из-за сбоя сети или железа упадет слейва, то когда он вернется  в работу – он заберет все логи с мастера и синхронизируется. А мастер будет держать запросы до тех пор, пока слейв их не заберет.

Внимание! В этом случае контролируйте свободное место на мастере!

Итого. Делаем дамп не слейве таким образом.

psql -U pgsql  postgres -c “SELECT pg_xlog_replay_pause()”

/usr/local/bin/pg_dump -Fc -d  testdb -U pgsql > /backup/testdb

psql -U pgsql  postgres -c “SELECT pg_xlog_replay_resume()”

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *