为了允许订阅节点在发布节点宕机时继续从发布节点复制数据,必须有一个与发布节点对应的物理备用节点。
可以通过在创建订阅时指定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
)为真,那么现有订阅可以继续订阅
现在新主服务器上的发布。