pg_rewind#
pg_rewind
pg_rewind — синхронизировать каталог данных Tantor BE с другим каталогом данных, который был создан на его основе
Синтаксис
pg_rewind
[option
...] { -D
| --target-pgdata
} directory
{ --source-pgdata=
| directory
--source-server=
} connstr
Описание
pg_rewind - это инструмент для синхронизации кластера PostgreSQL с другой копией того же кластера, после того как временные линии кластеров разошлись. Типичный сценарий - восстановление работы старого основного сервера после сбоя в качестве резервного сервера, который следует за новым основным сервером.
После успешного перемотки состояние целевого каталога данных аналогично базовой резервной копии исходного каталога данных. В отличие от создания новой базовой резервной копии или использования инструмента rsync, pg_rewind не требует сравнения или копирования неизмененных блоков отношений в кластере. Копируются только измененные блоки из существующих файлов отношений; все остальные файлы, включая новые файлы отношений, файлы конфигурации и сегменты WAL, копируются полностью. Поэтому операция перемотки значительно быстрее других подходов, когда база данных большая и только небольшая часть блоков отличается между кластерами.
pg_rewind анализирует историю временных линий исходного и целевого кластеров, чтобы определить точку их расхождения, и ожидает наличия WAL-файлов в каталоге pg_wal
целевого кластера, которые простираются до точки расхождения. Точка расхождения может быть найдена на целевой временной линии, исходной временной линии или их общем предке. В типичном сценарии сбоя, когда целевой кластер был выключен вскоре после расхождения, это не является проблемой, но если целевой кластер работал долгое время после расхождения, его старые WAL-файлы могут отсутствовать. В этом случае вы можете вручную скопировать их из архива WAL в каталог pg_wal
или запустить pg_rewind с опцией -c
, чтобы автоматически получить их из архива WAL. Использование pg_rewind не ограничено только ситуациями сбоя, например, резервный сервер может быть повышен в статус основного, выполнить некоторые транзакции записи, а затем откатиться, чтобы снова стать резервным.
После запуска pg_rewind воспроизведение WAL должно быть завершено, чтобы каталог данных находился в согласованном состоянии. Когда целевой сервер снова запускается, он входит в режим восстановления из архива и воспроизводит все WAL, сгенерированные на исходном сервере с момента последней контрольной точки до точки расхождения. Если некоторые WAL больше не доступны на исходном сервере во время выполнения pg_rewind и, следовательно, не могут быть скопированы сессией pg_rewind, они должны быть доступны при запуске целевого сервера. Это можно сделать, создав файл recovery.signal
в целевом каталоге данных и настроив подходящую restore_command в postgresql.conf
.
pg_rewind требует, чтобы целевой сервер либо имел
включенную опцию wal_log_hints в файле postgresql.conf
,
либо включенные контрольные суммы данных при инициализации кластера с помощью initdb.
По умолчанию ни одно из этих условий не выполняется. Опция full_page_writes
также должна быть установлена в on
, но она включена по умолчанию.
Предупреждение: Ошибки при перемотке назад
Если pg_rewind не удалось выполнить обработку, то скорее всего папка с данными целевой системы находится в состоянии, которое невозможно восстановить. В таком случае рекомендуется создать новую свежую резервную копию.
Как pg_rewind полностью копирует файлы конфигурации с источника, может потребоваться исправить конфигурацию, используемую для восстановления перед перезапуском целевого сервера, особенно если цель снова вводится в качестве резервной копии источника. Если вы перезапустите сервер после завершения операции перемотки, но без настройки восстановления, цель может снова отклониться от основного сервера.
pg_rewind сразу завершится с ошибкой, если обнаружит файлы, в которые невозможно записать напрямую. Это может произойти, например, когда исходный и целевой серверы используют одно и то же отображение файлов для только чтения SSL-ключей и сертификатов. Если такие файлы присутствуют на целевом сервере, рекомендуется удалить их перед запуском pg_rewind. После выполнения операции перемотки, некоторые из этих файлов могут быть скопированы из исходного сервера, в таком случае может потребоваться удалить скопированные данные и восстановить набор ссылок, использованных до перемотки.
Опции
pg_rewind принимает следующие аргументы командной строки:
-D
directory
--target-pgdata=
directory
Этот параметр указывает целевой каталог данных, который синхронизируется с источником. Целевой сервер должен быть корректно остановлен перед запуском pg_rewind
--source-pgdata=
directory
Указывает путь к файловой системе каталога данных исходного сервера для синхронизации с целевым сервером. Для использования этой опции исходный сервер должен быть корректно остановлен.
--source-server=
connstr
Указывает строку подключения libpq для подключения к исходному серверу Tantor BE для синхронизации с целевым сервером. Подключение должно быть обычным (не репликационным) подключением с ролью, имеющей достаточные разрешения для выполнения функций, используемых pg_rewind на исходном сервере (см. раздел Примечания для получения подробной информации) или суперпользовательской ролью. Для использования этой опции требуется, чтобы исходный сервер работал и принимал подключения.
-R
--write-recovery-conf
Создайте файл
standby.signal
и добавьте настройки подключения в файлpostgresql.auto.conf
в выходном каталоге. При использовании этой опции обязательно указывайте--source-server
.-n
--dry-run
Сделайте все, кроме фактической модификации целевого каталога.
-N
--no-sync
По умолчанию
pg_rewind
будет ожидать, пока все файлы будут безопасно записаны на диск. Этот параметр позволяетpg_rewind
вернуться без ожидания, что ускоряет процесс, но означает, что последующий сбой операционной системы может повредить каталог данных. Обычно этот параметр полезен для тестирования, но не следует использовать его в рабочей установке.-P
--progress
Включает отчет о прогрессе. Включение этой опции позволит получать приблизительный отчет о прогрессе при копировании данных из исходного кластера.
-c
--restore-target-wal
Используйте
restore_command
, определенную в конфигурации целевого кластера, чтобы получить файлы WAL из архива WAL, если эти файлы больше не доступны в каталогеpg_wal
.--config-file=
filename
Используйте указанный файл конфигурации основного сервера для целевого кластера. Это влияет на pg_rewind, когда он внутренне использует команду postgres для операции перемотки на этом кластере (при получении
restore_command
с помощью опции-c/--restore-target-wal
и при принудительном завершении восстановления после сбоя).--debug
Выводите подробную отладочную информацию, которая в основном полезна для разработчиков отладки pg_rewind.
--no-ensure-shutdown
Внимание: pg_rewind требует, чтобы целевой сервер был корректно остановлен перед перемоткой. По умолчанию, если целевой сервер не был корректно остановлен, pg_rewind запускает целевой сервер в однопользовательском режиме для завершения восстановления после сбоя и затем останавливает его. При использовании этой опции pg_rewind пропускает этот шаг и немедленно выдает ошибку, если сервер не был корректно остановлен. В таком случае пользователи должны сами обработать ситуацию.
-V
--version
Отобразить информацию о версии, а затем завершить работу.
-?
--help
Показать справку, а затем выйти.
Окружение
Когда используется опция --source-server
, pg_rewind также использует переменные среды, поддерживаемые libpq (см. Раздел 31.15).
Переменная среды PG_COLOR
определяет, следует ли использовать цвет в диагностических сообщениях. Возможные значения: always
, auto
и never
.
Примечания
При выполнении pg_rewind с использованием
онлайн-кластера в качестве источника, можно использовать роль с
достаточными правами для выполнения функций, используемых
pg_rewind на исходном кластере, вместо
суперпользователя. Вот как создать такую роль, названную
rewind_user
здесь:
CREATE USER rewind_user LOGIN; GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) TO rewind_user; GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) TO rewind_user; GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO rewind_user; GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) TO rewind_user;
Как это работает
Основная идея заключается в копировании всех изменений на уровне файловой системы из исходного кластера в целевой кластер.
Сканируйте журнал WAL целевого кластера, начиная с последней контрольной точки перед тем моментом, когда история временных линий исходного кластера отклонилась от целевого кластера. Для каждой записи WAL запишите каждый касаемый блок данных. Это даст список всех блоков данных, которые были изменены в целевом кластере после отклонения исходного кластера. Если некоторые из файлов журнала предзаписи больше недоступны, попробуйте повторно запустить pg_rewind с опцией
-c
, чтобы найти отсутствующие файлы в архиве WAL.Скопируйте все измененные блоки с исходного кластера на целевой кластер, используя либо прямой доступ к файловой системе (
--source-pgdata
), либо SQL (--source-server
). Файлы отношений находятся в состоянии, эквивалентном моменту последней завершенной контрольной точки перед моментом, когда WAL-таймлайны исходного и целевого кластеров разошлись, плюс текущее состояние на исходном кластере любых блоков, измененных на целевом кластере после этого разделения.Скопируйте все остальные файлы, включая новые файлы отношений, сегменты WAL,
pg_xact
и файлы конфигурации из исходного кластера в целевой кластер. Аналогично базовым резервным копиям, содержимое каталоговpg_dynshmem/
,pg_notify/
,pg_replslot/
,pg_serial/
,pg_snapshots/
,pg_stat_tmp/
иpg_subtrans/
не копируется из исходного кластера. Файлыbackup_label
,tablespace_map
,pg_internal.init
,postmaster.opts
,postmaster.pid
и.DS_Store
, а также любые файлы или каталоги, начинающиеся сpgsql_tmp
, не копируются.Создайте файл
backup_label
, чтобы начать воспроизведение WAL на контрольной точке, созданной при сбое, и настройте файлpg_control
с минимальной LSN согласованности, определенной как результатpg_current_wal_insert_lsn()
при перемотке с живого источника или последней LSN контрольной точки при перемотке с остановленного источника.При запуске цели Tantor BE воспроизводит все необходимые WAL, что приводит к состоянию каталога данных в согласованном состоянии.