监控 AlloyDB Omni 中的 pglogical 复制

选择文档版本:

本页面介绍了如何通过检查和验证提供方和订阅方数据库对 pglogical 实现进行监控和问题排查。

准备工作

在对 pglogical 实现进行监控和问题排查之前,请检查提供方和订阅方数据库,了解 pglogical 实现,并验证其配置方式。

如需详细了解 pglogical 扩展程序,请参阅 pglogical 简介

如需了解如何使用 pglogical 进行数据复制,请参阅在 AlloyDB for PostgreSQL 和 AlloyDB Omni 之间复制数据以及在 AlloyDB Omni 和其他数据库之间复制数据

检查 pglogical、复制和 AlloyDB Omni 参数设置

许多配置参数会影响 pglogical 扩展程序的运行,您可以在提供方和订阅方数据库中查看这些参数。请注意,参数值可能会有所不同。

  1. 显示 pglogical 特有的参数的当前设置:

    SELECT name,
        setting,
        source,
        short_desc
    FROM pg_catalog.pg_settings
    WHERE name LIKE '%pglogical%' AND name NOT LIKE '%alloydb%'
    ORDER BY category, name;
    
  2. 显示与逻辑复制相关的其他参数:

    SELECT name,
        setting,
        source,
        short_desc
    FROM pg_catalog.pg_settings
    WHERE name IN ('wal_level',
                 'max_worker_processes',
                 'max_replication_slots',
                 'max_wal_senders',
                 'shared_preload_libraries',
                 'track_commit_timestamp')
    ORDER BY name;
    
  3. 显示 AlloyDB Omni 特有的参数:

    SELECT name,
        setting,
        source,
        short_desc
    FROM pg_catalog.pg_settings
    WHERE name LIKE '%alloydb%'
    ORDER BY category, name;
    

列出配置中的节点

  1. 列出 pglogical 复制配置中的本地和远程节点:

    SELECT node_id,
        if_nodeid AS node_id,
        if_name AS node_name,
        if_dsn AS dsn
    FROM pglogical.node_interface
    LEFT JOIN pglogical.local_node ON (node_id = if_nodeid AND node_local_interface = if_id)
    ORDER BY node_name;
    

    如果 node_id 列是 NOT NULL,则表示该节点为本地节点。

  2. 详细查看 dsn 信息。任何不正确或过时的连接字符串信息都可能导致复制故障。如需了解 dsn 问题排查,请参阅排查订阅复制问题

检查订阅状态和表复制点

订阅状态始终是通过订阅方数据库进行验证的。订阅显示 initializingreplicating 状态。还显示 down 状态。如需详细了解 down 状态,请参阅排查订阅复制问题

  1. 列出当前数据库中的订阅、其当前状态和设置:

    SELECT s.sub_name AS subscription_name,
        n1.node_name AS origin_name,
        n2.node_name AS target_name,
        x.status,
        sub_slot_name,
        sub_replication_sets,
        sub_forward_origins,
        sub_apply_delay,
        sub_force_text_transfer,
        sub_enabled AS enabled
    FROM pglogical.subscription s,
        (SELECT subscription_name, status FROM pglogical.show_subscription_status()) AS x,
        pglogical.node n1,
        pglogical.node n2
    WHERE s.sub_origin = n1.node_id
    AND s.sub_target = n2.node_id
    AND s.sub_name = x.subscription_name
    ORDER BY s.sub_name;
    

    输出类似于以下内容:

    -[ RECORD 1 ]-----------+--------------------------------------
    subscription_id         | 3072625608
    subscription_name       | test_sub_1
    origin_name             | provider
    target_name             | subscriber
    status                  | replicating
    sub_slot_name           | pgl_my_test_db_provider_test_sub_1
    sub_replication_sets    | {default,default_insert_only,ddl_sql}
    sub_forward_origins     | {all}
    sub_apply_delay         | 00:00:00
    sub_force_text_transfer | f
    enabled                 | t
    my_test_db=#
    
  2. 按订阅列出当前复制的表及其当前日志序列号 (LSN):

    SELECT sync_nspname||'.'||sync_relname AS table_name,
        sync_status,
        sync_statuslsn
    FROM pglogical.local_sync_status
    WHERE sync_relname IS NOT NULL
    ORDER BY table_name;
    

    输出类似于以下内容:

      table_name      | sync_status | sync_statuslsn
    ---------------------+-------------+----------------
    public.test_table_1 | r           | 0/B891BC0
    (1 row)
    
    my_test_db=#
    

    sync_statuslsn 列显示了表同步到的 LSN。您可以将此值与提供方数据库中的 LSN 进行比较,以衡量复制延迟。

  3. 检查特定表的复制状态:

    SELECT * FROM pglogical.show_subscription_table('test_sub_1','test_table_1');
    

验证提供方的复制集详细信息

  1. 列出提供方数据库中的当前复制集,并检查复制的内容:

    SELECT set_name,
        node_name,
        replicate_insert,
        replicate_update,
        replicate_delete,
        replicate_truncate
    FROM pglogical.replication_set
    JOIN pglogical.node ON set_nodeid = node_id
    ORDER BY set_name, node_name;
    
  2. 列出复制的表和序列:

    -- Table details:
    SELECT set_name,
        set_reloid AS table_name,
        set_att_list,
        set_row_filter
    FROM pglogical.replication_set
    NATURAL JOIN pglogical.replication_set_table
    ORDER BY set_name, table_name;
    
    -- Sequence details:
    SELECT set_name,
        set_seqoid AS sequence_name
    FROM pglogical.replication_set
    NATURAL JOIN pglogical.replication_set_seq
    ORDER BY set_name, sequence_name;
    

检查提供方的复制信息和槽延迟

  1. 通过在提供方数据库中生成 pg_stat_replication 视图,检查每个订阅方的状态:

    SELECT application_name,
        state,
        sync_state,
        client_addr,
        client_hostname,
        pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) AS sent_lag,
        pg_wal_lsn_diff(sent_lsn,flush_lsn) AS receiving_lag,
        pg_wal_lsn_diff(flush_lsn,replay_lsn) AS replay_lag,
        pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) AS total_lag,
        now()-reply_time AS reply_delay
    FROM pg_stat_replication
    ORDER BY client_hostname;
    

    输出类似于以下内容:

    -[ RECORD 1 ]----+------------------------------
    application_name | test_sub_1
    state            | streaming
    sync_state       | async
    client_addr      | 10.45.0.80
    client_hostname  |
    sent_lag         | 0
    receiving_lag    | 0
    replay_lag       | 0
    total_lag        | 0
    reply_delay      | 00:00:26.203433
    
    my_test_db=#
    
  2. 请记下 reply_delay 列,该列会显示从订阅方数据库收到上次更新的时间。

  3. 监控提供方的复制槽的复制延迟,因为 pglogical 会在提供方数据库中创建复制槽:

    SELECT slot_name,
        slot_type,
        database,
        active,
        COALESCE(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn),0) AS restart_lag,
        COALESCE(pg_wal_lsn_diff(pg_current_wal_lsn(),confirmed_flush_lsn),0) AS confirmed_flush_lag
    FROM pg_replication_slots
    WHERE plugin like '%pglogical%'
    ORDER BY slot_name;
    

    输出类似于以下内容:

    -[ RECORD 1 ]-------+-----------------------------------
    slot_name           | pgl_my_test_db_provider_test_sub_1
    slot_type           | logical
    database            | my_test_db
    active              | t
    restart_lag         | 56
    confirmed_flush_lag | 0
    
    my_test_db=#
    

排查订阅复制问题

如果订阅是最近创建的,则在订阅方数据库中检查的订阅必须显示 replicatinginitializing 状态。如果状态为 down,则表示出现了问题。

down 状态通常在复制尝试启动但失败后显示。这是由于 dsn 设置导致的连接问题,或者缺少数据库权限(在提供方或订阅方处)。

当Google Cloud AlloyDB 是其中一个端点时,请使用 Log Explorer 并检查 Google Cloud 中的 PostgreSQL 日志文件,以获取可能指明问题原因的其他信息。日志文件提供了问题的详细信息,包括缺少权限的具体详细信息。

  1. 检查 AlloyDB Omni 服务器上的 PostgreSQL 日志:

    Docker

    docker logs CONTAINER_NAME

    CONTAINER_NAME 替换为您在安装 AlloyDB Omni 容器时为其分配的名称。

    Podman

    podman logs CONTAINER_NAME

    CONTAINER_NAME 替换为您在安装 AlloyDB Omni 容器时为其分配的名称。

  2. 排查 dsn 设置问题,并确保网络连接不是问题的根源:

    1. 复制 dsn 连接字符串,然后尝试使用 psql 和相同的字符串进行手动连接。如果 psql 会话无法连接,则表示存在以下问题:
      • 网络问题。
      • IP 地址、用户名或密码不正确。
      • 起到屏蔽作用的防火墙。
      • 另一个集群的 pg_hba.conf 文件未正确配置。
  3. 如果您不想在采取纠正措施后删除并重新创建订阅,请重新同步表:

    SELECT pglogical.alter_subscription_resynchronize_table(subscription_name := 'test_sub_1',relation := 'table_name');
    
  4. 或者,您也可以取消订阅并重新创建订阅:

    SELECT pglogical.drop_subscription(subscription_name := 'test_sub_1');
    

后续步骤