pg_createsubscriber
Эта страница переведена при помощи нейросети GigaChat.
pg_createsubscriber
– преобразовывает физическую реплику в новую логическую реплику.
Синтаксис
pg_createsubscriber [option...] { -d | --database }dbname { -D | --pgdata }datadir { -P | --publisher-server }connstr
Описание
pg_createsubscriber
создает новую логическую реплику из физического резервного сервера. Все таблицы указанной базы данных включаются в настройку логической репликации. Для каждой базы данных создается пара объектов публикации и подписки. Команда должна выполняться на целевом сервере.
После успешного выполнения состояние целевого сервера аналогично состоянию свежей настройки логической репликации. Основное различие между настройкой логической репликации и pg_createsubscriber
заключается в том, как выполняется синхронизация данных. pg_createsubscriber
не копирует начальные данные таблиц. Он выполняет только фазу синхронизации, которая обеспечивает приведение каждой таблицы к синхронному состоянию.
pg_createsubscriber
предназначен для больших систем баз данных, поскольку при настройке логической репликации большая часть времени тратится на первоначальное копирование данных. Кроме того, побочным эффектом длительного времени, затрачиваемого на синхронизацию данных, обычно является большое количество изменений, подлежащих применению (которые были произведены во время первоначального копирования данных), что еще больше увеличивает время доступности логической реплики. Для небольших баз данных рекомендуется настроить логическую репликацию с начальной синхронизацией данных. Подробности см. в параметре CREATE SUBSCRIPTION
copy_data
.
Параметры
pg_createsubscriber
принимает следующие аргументы командной строки:
-d
dbname
--database=
dbname
: Имя базы данных, в которой будет создана подписка. Несколько баз данных можно выбрать, указав несколько переключателей -d
.
-D
directory
--pgdata=
directory
: Целевая директория, содержащая каталог кластера физической реплики.
-n
--dry-run
: Выполнить все действия, кроме фактического изменения целевой директории.
-p
port
--subscriber-port=
port
: Номер порта, на котором целевой сервер прослушивает соединения. По умолчанию целевой сервер запускается на порту 50432, чтобы избежать непреднамеренных клиентских соединений.
-P
connstr
--publisher-server=
connstr
: Строка подключения к публикующему серверу. Подробнее см. раздел «Строки подключения».
-s
dir
--socketdir=
dir
: Директория, используемая для сокетов постмастера на целевом сервере. Значением по умолчанию является текущая директория.
-t
seconds
--recovery-timeout=
seconds
: Максимальное количество секунд ожидания окончания восстановления. Установка значения 0
отключает ожидание. Значение по умолчанию равно 0
.
-U
username
--subscriber-username=
username
: Имя пользователя для подключения к целевому серверу. По умолчанию используется имя текущего пользователя операционной системы.
-v
--verbose
: Включить подробный режим. Это приведет к тому, что pg_createsubscriber
будет выводить сообщения о ходе выполнения и подробную информацию о каждом шаге на стандартный вывод ошибок. Повторное указание опции приводит к появлению дополнительных сообщений уровня отладки на стандартном выводе ошибок.
--config-file=
filename
: Используйте указанный основной файл конфигурации сервера для целевой директории данных. pg_createsubscriber
внутренне использует команду pg_ctl
для запуска и остановки целевого сервера. Она позволяет указать реальный конфигурационный файл postgresql.conf
, если он хранится вне директории данных.
--publication=
name
: Имя публикации для настройки логической репликации. Можно указать несколько публикаций, написав несколько переключателей --publication
. Число указанных имен публикаций должно соответствовать числу указанных баз данных, иначе будет сообщено об ошибке. Порядок нескольких переключателей имени публикации должен совпадать с порядком переключателей базы данных. Если этот параметр не указан, публикуется автоматически назначенное имя.
--replication-slot=
name
: Имя слота репликации для настройки логической репликации. Можно указать несколько слотов репликации, написав несколько переключателей --replication-slot
. Число указанных имен слотов репликации должно соответствовать числу указанных баз данных, иначе будет сообщено об ошибке. Порядок нескольких переключателей имени слота репликации должен совпадать с порядком переключателей базы данных. Если этот параметр не указан, имя подписки присваивается имени слота репликации.
--subscription=
name
: Имя подписки для настройки логической репликации. Можно указать несколько подписок, написав несколько переключателей --subscription
. Число указанных имен подписок должно соответствовать числу указанных баз данных, иначе будет сообщено об ошибке. Порядок нескольких переключателей имени подписки должен совпадать с порядком переключателей базы данных. Если этот параметр не указан, публикуется автоматически назначенное имя.
-V
--version
: Вывести версию pg_createsubscriber
и завершить работу.
-?
--help
: Показать справку по аргументам командной строки команды pg_createsubscriber
и выйти.
Примечания
Предварительные условия
Для преобразования целевого сервера в логическую реплику с помощью pg_createsubscriber
необходимо выполнить некоторые предварительные условия. В случае их невыполнения будет сообщено об ошибке. Исходный и целевой серверы должны иметь ту же основную версию, что и у pg_createsubscriber
. Указанная целевая директория данных должна иметь тот же идентификатор системы, что и исходная директория данных. Пользователь базы данных, указанный для целевой директории данных, должен иметь привилегии на создание подписок и использование pg_replication_origin_advance()
.
Целевой сервер должен использоваться в качестве физического резерва. Целевой сервер должен иметь параметры max_replication_slots и max_logical_replication_workers, настроенные на значение большее или равное количеству указанных баз данных. Целевой сервер должен иметь параметр max_worker_processes, настроенный на значение большее количества указанных баз данных. Целевой сервер должен принимать локальные соединения.
Исходный сервер должен принимать соединения от целевого сервера. Исходный сервер не должен находиться в режиме восстановления. На исходном сервере параметр wal_level должен иметь значение logical
. Параметр max_replication_slots на исходном сервере должен быть настроен на значение большее или равное количеству указанных баз данных плюс существующие слоты репликации. Параметр max_wal_senders на исходном сервере должен быть настроен на значение большее или равное количеству указанных баз данных и существующих процессов отправки WAL.
Предупреждения
Если команда pg_createsubscriber
завершается неудачей после того, как целевой сервер был повышен до ведущего, каталог данных, скорее всего, находится в состоянии, которое невозможно восстановить. В таком случае рекомендуется создать новый резервный сервер.
Обычно во время преобразования pg_createsubscriber
запускает целевой сервер с другими параметрами подключения. Следовательно, соединения с целевым сервером должны завершаться ошибкой.
Поскольку команды DDL не реплицируются логической репликацией, избегайте выполнения команд DDL, изменяющих схему базы данных, при выполнении pg_createsubscriber
. Если целевой сервер уже преобразован в логический репликант, команды DDL могут не реплицироваться, что может привести к ошибке.
Если выполнение pg_createsubscriber
прерывается из-за ошибки, объекты (публикации, слоты репликации), созданные на исходном сервере, удаляются. Удаление может завершиться неудачей, если целевой сервер не может подключиться к исходному серверу. В этом случае предупреждение сообщит об оставшихся объектах. Если целевой сервер запущен, он будет остановлен.
Если для репликации используется primary_slot_name, она будет удалена с исходного сервера после настройки логической репликации.
Если целевой сервер является синхронным репликантом, фиксация транзакций на ведущем узле может ожидать завершения репликации во время работы pg_createsubscriber.
Команда pg_createsubscriber
настраивает логическую репликацию с отключенным двухфазным подтверждением транзакций. Это означает, что любые подготовленные транзакции будут реплицированы по состоянию на момент COMMIT PREPARED
, без предварительной подготовки. После завершения настройки можно вручную удалить подписку(и) и заново создать ее(их) с включенной опцией two_phase
.
Команда pg_createsubscriber
изменяет системный идентификатор с помощью pg_resetwal
. Это позволяет избежать ситуаций, когда целевой сервер мог бы использовать файлы WAL с исходного сервера. Если у целевого сервера есть резервная копия, репликация нарушится, и следует создать свежую резервную копию.
Как это работает
Основная идея заключается в том, чтобы начать процесс репликации с точки начала репликации на исходном сервере и настроить логическую репликацию, начиная с этой точки:
- Запустите целевой сервер с указанными параметрами командной строки. Если целевой сервер уже запущен,
pg_createsubscriber
завершится с ошибкой. - Проверьте возможность преобразования целевого сервера. Также выполняются несколько проверок исходного сервера. Если какие-либо предварительные условия не выполнены, pg_createsubscriber завершится с ошибкой.
- Создайте публикацию и слот репликации для каждой указанной базы данных на исходном сервере. Каждая публикация создается с использованием
FOR ALL TABLES
. Если не указана опция--publication
, название публикации имеет следующий шаблон: «pg_createsubscriber_%u_%x
» (параметры: база данныхoid
, случайное числоint
). Если не указана опция--replication-slot
, имя слота репликации имеет следующий шаблон: «pg_createsubscriber_%u_%x
» (параметры: база данныхoid
, случайное числоint
). Эти слоты репликации будут использоваться подписками на следующем этапе. Последняя позиция LSN слота репликации используется в качестве контрольной точки остановки параметра recovery_target_lsn и подписками в качестве начальной точки репликации. Это гарантирует отсутствие потери транзакций. - Запишите параметры восстановления в каталог данных целевого сервера и перезапустите целевой сервер. Он задает позицию журнала упреждающей записи (LSN) recovery_target_lsn, до которой будет выполняться восстановление. Кроме того, задается действие
promote
, которое сервер должен выполнить после достижения цели восстановления. Добавляются дополнительные параметры восстановления recovery parameters, чтобы предотвратить неожиданное поведение во время процесса восстановления, например завершение восстановления сразу после достижения согласованного состояния (журнал упреждающей записи должен применяться до места начала репликации) и наличие нескольких целей восстановления, что может вызвать сбой. Этот шаг завершается, когда сервер выходит из режима ожидания и принимает операции чтения-записи. Если установлена опция--recovery-timeout
, pg_createsubscriber прекращает работу, если восстановление не заканчивается в течение указанного количества секунд. - Создать подписку для каждой указанной базы данных на целевом сервере. Если не указана опция
--subscription
, подписка имеет следующее имя шаблона: «pg_createsubscriber_%u_%x
» (параметры: база данныхoid
, случайное числоint
). Она не копирует существующие данные с исходного сервера. Она также не создает слот репликации. Вместо этого она использует слот репликации, созданный на предыдущем шаге. Подписка создана, но пока еще не включена. Причина в том, что перед началом репликации необходимо установить прогресс репликации на точку начала репликации. - Удалить публикации на целевом сервере, которые были реплицированы, так как они были созданы до местоположения начала репликации. Они бесполезны на подписчике.
- Установить прогресс репликации на начальную точку репликации для каждой подписки. Когда целевой сервер начинает процесс восстановления, он догоняет до точки начала репликации. Именно эта позиция LSN должна использоваться в качестве начальной позиции репликации для каждой подписки. Имя источника репликации получено, поскольку подписка была создана. Имя источника репликации и точка начала репликации используются в команде
pg_replication_origin_advance()
для установки начальной позиции репликации. - Включить подписку для каждой указанной базы данных на целевом сервере. Подписка начинает применять транзакции с момента начала репликации.
- Если резервный сервер использовал primary_slot_name, теперь оно больше не нужно, поэтому его можно удалить.
- Если на резервном сервере имеются слоты репликации переключения, их нельзя синхронизировать дальше, поэтому их следует удалить.
- Обновляет системный идентификатор на целевом сервере. Команда pg_resetwal выполняется для изменения системного идентификатора. Целевой сервер останавливается согласно требованию
pg_resetwal
.
Примеры
Чтобы создать логического репликанта для баз данных hr
и finance
из физического репликанта на foo
:
$ pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance