28.3. Переключение на резервную копию логической репликации#
28.3. Переключение на резервную копию логической репликации #
Чтобы узлы подписчиков могли продолжать репликацию данных с узла издателя даже в случае его отказа, должен существовать физический резервный узел, соответствующий узлу издателя. Логические слоты на основном сервере, соответствующие подпискам, могут быть синхронизированы с резервным сервером, указав failover = true при создании подписок. Подробности см. в Раздел 45.2.3. Включение параметра failover обеспечивает беспрепятственный переход этих подписок после повышения резервного узла. Они могут продолжать подписываться на публикации на новом основном сервере.
Поскольку логика синхронизации слотов копирует асинхронно, необходимо подтвердить, что слоты репликации были синхронизированы с резервным сервером до того, как произойдет переключение. Чтобы обеспечить успешное переключение, резервный сервер должен быть впереди подписчика. Это можно достичь, настроив
synchronized_standby_slots.
Чтобы убедиться, что резервный сервер действительно готов к переключению для данного подписчика, выполните следующие шаги, чтобы проверить, что все слоты логической репликации, необходимые этому подписчику, были синхронизированы с резервным сервером:
На узле подписчика используйте следующий SQL, чтобы определить, какие слоты репликации должны быть синхронизированы с резервным узлом, который мы планируем повысить. Этот запрос вернет соответствующие слоты репликации, связанные с подписками, поддерживающими отказоустойчивость.
/* 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, чтобы определить, какие слоты синхронизации таблиц должны быть синхронизированы с резервным сервером, который мы планируем повысить. Этот запрос необходимо выполнить в каждой базе данных, которая включает подписки с поддержкой отказа. Обратите внимание, что слот синхронизации таблицы должен быть синхронизирован с резервным сервером только в том случае, если копирование таблицы завершено (см. Раздел 50.55). Нам не нужно обеспечивать синхронизацию слотов синхронизации таблиц в других сценариях, так как они будут либо удалены, либо воссозданы на новом основном сервере в этих случаях.
/* 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)Проверьте, что логические слоты репликации, указанные выше, существуют на резервном сервере и готовы к переключению.
/* standby # */ SELECT slot_name, (synced AND NOT temporary AND invalidation_reason IS NULL) 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, то
существующие подписки могут продолжать подписываться на публикации на новом
основном сервере.
Первые два шага в приведённой выше процедуре предназначены для подписчика Tantor BE. Рекомендуется выполнять эти шаги на каждом узле-подписчике, который будет обслуживаться назначенным резервным сервером после переключения, чтобы получить полный список слотов репликации. Этот список затем можно проверить на Шаге 3 для обеспечения готовности к переключению. Подписчики, не использующие Tantor BE, с другой стороны, могут использовать свои собственные методы для определения слотов репликации, используемых их соответствующими подписками.
В некоторых случаях, например, при запланированном переключении на резервный сервер (failover), необходимо убедиться, что все подписчики, будь то Tantor BE или не-Tantor BE, смогут продолжить репликацию после переключения на выбранный резервный сервер. В таких случаях используйте следующий SQL-запрос вместо выполнения первых двух шагов, чтобы определить, какие слоты репликации на основном сервере необходимо синхронизировать с резервным сервером, который планируется повысить. Этот запрос возвращает соответствующие слоты репликации, связанные со всеми подписками с поддержкой переключения (failover-enabled).
/* primary # */ SELECT array_agg(quote_literal(r.slot_name)) AS slots
FROM pg_replication_slots r
WHERE r.failover AND NOT r.temporary;
slots
-------
{'sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'}
(1 row)