9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

29.3. 逻辑复制故障切换 #

为了允许订阅节点在发布节点宕机时继续从发布节点复制数据,必须有一个与发布节点对应的物理备用节点。 可以通过在创建订阅时指定failover = true,将主服务器上对应订阅的逻辑槽同步到备用服务器。 详情请参见Section 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来识别应同步到我们计划提升的备用节点的表同步槽。 该查询需要在包含启用故障转移订阅的每个数据库上运行。请注意,只有当表复制完成时, 表同步槽才应同步到备用服务器 (参见 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)
    
  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)为真,那么现有订阅可以继续订阅 现在新主服务器上的发布。