監控 AlloyDB Omni 中的 pglogical 複寫

選取說明文件版本:

本頁面提供相關資訊,說明如何檢查及驗證供應商和訂閱者資料庫,藉此監控及排解實作問題。pglogical

事前準備

開始監控及排解 pglogical 導入作業問題前,請先檢查供應商和訂閱者資料庫、瞭解 pglogical 導入作業,並驗證設定方式。

如要進一步瞭解 pglogical 擴充功能,請參閱「關於 pglogical」。

如要瞭解如何使用 pglogical 複製資料,請參閱「在 PostgreSQL 適用的 AlloyDB 和 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 問題,請參閱「排解訂閱項目複製問題」。

檢查訂閱狀態和資料表複寫點

系統一律會從訂閱者資料庫驗證訂閱狀態。訂閱項目會顯示「initializing」或「replicating」狀態,也會顯示「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 設定導致連線問題,或是缺少資料庫權限 (供應商或訂閱者)。

使用記錄檔探索工具檢查 PostgreSQL 記錄檔 (如果 AlloyDB 是端點之一),取得可能指出問題原因的額外資訊。 Google Cloud Google Cloud 記錄檔會提供問題的詳細資料,包括缺少權限的具體詳細資料。

  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');
    

後續步驟