AlloyDB Omni で pglogical レプリケーションをモニタリングする

このページでは、プロバイダ データベースとサブスクライバー データベースをチェックして検証することで、pglogical 実装をモニタリングしてトラブルシューティングする方法について説明します。

始める前に

pglogical の実装のモニタリングとトラブルシューティングを開始する前に、プロバイダ データベースとサブスクライバー データベースを確認し、pglogical の実装を理解し、その構成を確認します。

pglogical 拡張機能の詳細については、pglogical についてをご覧ください。

pglogical を使用したデータ レプリケーションについては、 Google Cloud 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=# 
    

サブスクリプション レプリケーションのトラブルシューティング

サブスクライバー データベースで確認したサブスクリプションのステータスは、サブスクリプションが最近作成された場合は replicating または initializing である必要があります。ステータスが down の場合、問題が発生しています。

down ステータスは通常、レプリケーションの開始が試行されて失敗した後に表示されます。これは、dsn 設定による接続の問題、またはプロバイダまたはサブスクライバーのデータベース権限がないことが原因です。

Google Cloud AlloyDB がエンドポイントの 1 つである場合は、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');
    

次のステップ