为了允许订阅节点在发布者节点发生故障时继续从发布者节点复制数据,必须有一个与发布者节点对应的物理备用节点。可以通过在创建订阅时指定 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
)为 true,则现有订阅现在可以继续订阅新主服务器上的发布。
如果您在文档中发现任何不正确、与特定功能不符或需要进一步澄清的内容,请使用此表格报告文档问题。