pg_createsubscriber#

pg_createsubscriber

pg_createsubscriber

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

Строка подключения к издателю. Подробности см. в Раздел 30.1.1.

-s dir
--socketdir=dir

Каталог для использования сокетов postmaster на целевом сервере. По умолчанию используется текущий каталог.

-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 файлы с исходного сервера. Если у целевого сервера есть резервный сервер, репликация будет нарушена, и следует создать новый резервный сервер.

Как это работает

Основная идея заключается в том, чтобы иметь начальную точку репликации с исходного сервера и настроить логическую репликацию, чтобы начать с этой точки:

  1. Запустите целевой сервер с указанными параметрами командной строки. Если целевой сервер уже запущен, pg_createsubscriber завершится с ошибкой.

  2. Проверьте, может ли целевой сервер быть преобразован. Также есть несколько проверок на исходном сервере. Если какие-либо из предварительных условий не выполнены, pg_createsubscriber завершится с ошибкой.

  3. Создайте публикацию и слот репликации для каждой указанной базы данных на исходном сервере. Каждая публикация создается с использованием FOR ALL TABLES. Если параметр --publication не указан, публикация имеет следующий шаблон имени: pg_createsubscriber_%u_%x (параметры: база данных oid, случайное int). Если параметр --replication-slot не указан, слот репликации имеет следующий шаблон имени: pg_createsubscriber_%u_%x (параметры: база данных oid, случайное int). Эти слоты репликации будут использоваться подписками на следующем этапе. Последний LSN слота репликации используется как точка остановки в параметре recovery_target_lsn и подписками как начальная точка репликации. Это гарантирует, что ни одна транзакция не будет потеряна.

  4. Запишите параметры восстановления в целевой каталог данных и перезапустите целевой сервер. Это указывает LSN (recovery_target_lsn) местоположения журнала предзаписи, до которого будет происходить восстановление. Также указывается promote как действие, которое сервер должен выполнить после достижения цели восстановления. Дополнительные параметры восстановления добавляются, чтобы избежать неожиданного поведения в процессе восстановления, такого как завершение восстановления, как только будет достигнуто согласованное состояние (WAL должен применяться до начала репликации) и несколько целей восстановления, которые могут вызвать сбой. Этот шаг завершается, как только сервер выходит из режима ожидания и начинает принимать транзакции на запись-чтение. Если установлена опция --recovery-timeout, pg_createsubscriber завершает работу, если восстановление не заканчивается в течение заданного количества секунд.

  5. Создайте подписку для каждой указанной базы данных на целевом сервере. Если параметр --subscription не указан, подписка имеет следующий шаблон имени: pg_createsubscriber_%u_%x (параметры: база данных oid, случайное int). Она не копирует существующие данные с исходного сервера. Она не создает слот репликации. Вместо этого используется слот репликации, который был создан на предыдущем шаге. Подписка создается, но еще не включена. Причина в том, что прогресс репликации должен быть установлен на начальную точку репликации перед началом репликации.

  6. Удалите публикации на целевом сервере, которые были реплицированы, потому что они были созданы до начальной точки репликации. Они не имеют смысла на подписчике.

  7. Установите прогресс репликации на начальную точку репликации для каждой подписки. Когда целевой сервер начинает процесс восстановления, он догоняет до начальной точки репликации. Это точный LSN, который будет использоваться в качестве начального местоположения репликации для каждой подписки. Имя источника репликации получается с момента создания подписки. Имя источника репликации и начальная точка репликации используются в pg_replication_origin_advance() для установки начального местоположения репликации.

  8. Включите подписку для каждой указанной базы данных на целевом сервере. Подписка начинает применять транзакции с начальной точки репликации.

  9. Если резервный сервер использовал primary_slot_name, он больше не нужен, поэтому удалите его.

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

  11. Обновите системный идентификатор на целевом сервере. pg_resetwal запускается для изменения системного идентификатора. Целевой сервер остановлен в соответствии с требованием pg_resetwal.

Примеры

Чтобы создать логическую реплику для баз данных hr и finance из физической реплики на foo:

$ pg_createsubscriber -D /opt/tantor/db/17/data -P "host=foo" -d hr -d finance

См. также

pg_basebackup