Для обеспечения непрерывной репликации данных на узлы-подписчики в случае сбоя издателя необходимо наличие физического резервного сервера, соответствующего узлу-издателю. Логические слоты на основном сервере, соответствующие подпискам, могут быть синхронизированы с резервным сервером при указании значения failover = true в процессе создания подписок. Подробности см. в
Раздел 5.12.2.3 .
Использование параметра
Отработка отказа
гарантирует бесшовный переход этих подписок после повышения роли резервного сервера. Подписчики могут продолжать работу с публикациями на новом основном сервере.
Так как синхронизация слотов происходит асинхронно, перед выполнением отработки отказа необходимо убедиться, что слоты репликации были полностью синхронизированы с резервным сервером. Для обеспечения успешной отработки отказа резервный сервер должен опережать подписчика. Это может быть достигнуто путем настройки
synchronized_standby_slots.
Чтобы подтвердить готовность резервного сервера к отработке отказа, выполните следующие шаги для проверки синхронизации всех необходимых слотов логической репликации с резервным сервером:
На узле-подписчике выполните следующий SQL-запрос, чтобы определить слоты репликации, которые должны быть синхронизированы с резервным сервером, планируемым к повышению. Данный запрос вернет соответствующие слоты репликации, связанные с подписками, для которых активирована функция отработки отказа.
test_sub=# SELECT
array_agg(quote_literal(s.subslotname)) AS slots
FROM pg_subscription s
WHERE s.subfailover AND
s.subslotname IS NOT NULL;
slots
-------
{'sub1','sub2','sub3'}
(1 row)
На узле-подписчике выполните следующий SQL-запрос, чтобы определить слоты синхронизации таблиц, которые должны быть синхронизированы с резервным сервером, планируемым к повышению. Данный запрос необходимо выполнить в каждой базе данных, содержащей подписки с включенной функцией отработки отказа. Обратите внимание, что слот синхронизации таблицы должен быть синхронизирован с резервным сервером только при условии завершения копирования таблицы (см. Раздел 7.2.55). Обеспечение синхронизации слотов синхронизации таблиц в других сценариях не требуется, так как в этих случаях они будут либо удалены, либо повторно созданы на новом основном сервере.
test_sub=# SELECT
array_agg(quote_literal(slot_name)) AS slots
FROM
(
SELECT CONCAT('pg_', srsubid, '_sync_', srrelid, '_', ctl.system_identifier) AS slot_name
FROM pg_control_system() ctl, pg_subscription_rel r, pg_subscription s
WHERE r.srsubstate = 'f' AND s.oid = r.srsubid AND s.subfailover
);
slots
-------
{'pg_16394_sync_16385_7394666715149055164'}
(1 row)
Проверьте, что определенные выше слоты логической репликации существуют на резервном сервере и готовы к отработке отказа.
test_standby=# SELECT slot_name, (synced AND NOT temporary AND NOT conflicting) AS failover_ready
FROM pg_replication_slots
WHERE slot_name IN
('sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164');
slot_name | failover_ready
--------------------------------------------+----------------
sub1 | t
sub2 | t
sub3 | t
pg_16394_sync_16385_7394666715149055164 | t
(4 rows)
Если все слоты присутствуют на резервном сервере и результат
(failover_ready) приведенного выше SQL-запроса истинен (true), то
существующие подписки могут продолжать работу с публикациями на
новом основном сервере.