为了允许订阅节点在发布节点宕机时继续从发布节点复制数据,必须有一个与发布节点对应的物理备用节点。
可以通过在创建订阅时指定failover = true,将主服务器上对应订阅的逻辑槽同步到备用服务器。
详情请参见Section 47.2.3。
启用
failover
参数确保备用节点升级后这些订阅能够无缝切换,继续订阅新主服务器上的发布内容。
由于槽同步逻辑是异步复制的,因此在故障切换发生之前,必须确认复制槽已同步到备用服务器。
为确保故障切换成功,备用服务器必须领先于订阅者。可以通过配置
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来识别应同步到我们计划提升的备用节点的表同步槽。 该查询需要在包含启用故障转移订阅的每个数据库上运行。请注意,只有当表复制完成时, 表同步槽才应同步到备用服务器 (参见 Section 51.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)
如果备用服务器上存在所有槽,并且上述SQL查询的结果
(failover_ready)为真,那么现有订阅可以继续订阅
现在新主服务器上的发布。