支持的版本:当前 (17)
开发版本:devel

29.3. 逻辑复制故障转移 #

为了允许订阅者节点即使在发布者节点宕机时仍能继续从发布者节点复制数据,必须有一个与发布者节点对应的物理备用节点。通过在创建订阅时指定 failover = true,可以将主服务器上与订阅对应的逻辑槽同步到备用服务器。有关详细信息,请参见第47.2.3节。启用failover参数可确保在备用服务器升级后这些订阅的无缝转换。它们可以继续订阅新主服务器上的发布。

由于槽同步逻辑是异步复制的,因此必须在发生故障转移之前确认复制槽已同步到备用服务器。为了确保故障转移成功,备用服务器必须领先于订阅者。这可以通过配置synchronized_standby_slots来实现。

为了确认备用服务器确实已准备好进行故障转移,请按照以下步骤验证所有必要的逻辑复制槽已同步到备用服务器

  1. 在订阅者节点上,使用以下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)
    
  2. 在订阅者节点上,使用以下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)
    
  3. 检查上述标识的逻辑复制槽是否存在于备用服务器上,并已准备好进行故障转移。

    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,则现有订阅可以继续订阅现在位于新主服务器上的发布。

提交更正

如果您在文档中发现任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。