为了允许订阅节点即使在发布节点宕机的情况下也能继续从发布节点复制数据,必须存在一个与发布节点相对应的物理备用节点。可以通过在创建订阅时指定 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
) 为真,那么现有的订阅现在可以继续订阅新主服务器上的出版物。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。