即使发布者节点宕机,为了让订户节点可以继续从发布者节点复制数据,必须有一个与其相对应的实际备用节点。如果在创建订阅时指定了 failover = true
,那么主服务器上与订阅相对应的逻辑槽便可以同步至备用服务器。有关详情,请参见 第 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 识别应该同步到我们计划提升的备用服务器的表同步槽。该查询需要在包含故障转移功能已启用的订阅的每个数据库上运行。请注意,只有在表副本完成同步后,才能将该表同步槽同步到备用服务器(请参阅第 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
)为真,那么这时现有订阅可以继续订阅新的主服务器上的发布。