このページでは、プロバイダ データベースとサブスクライバー データベースをチェックして検証することで、pglogical
実装をモニタリングしてトラブルシューティングする方法について説明します。
始める前に
pglogical
の実装のモニタリングとトラブルシューティングを開始する前に、プロバイダ データベースとサブスクライバー データベースを確認し、pglogical
の実装を理解し、その構成を確認します。
pglogical
拡張機能の詳細については、pglogical
についてをご覧ください。
pglogical
を使用したデータ レプリケーションについては、 Google Cloud AlloyDB と AlloyDB Omni の間でデータを複製するとAlloyDB Omni と他のデータベース間でデータを複製するをご覧ください。
pglogical
、レプリケーション、AlloyDB Omni のパラメータ設定を確認する
多くの構成パラメータが pglogical 拡張機能の動作に影響します。これは、プロバイダ データベースとサブスクライバー データベースで確認できます。なお、パラメータ値は異なる場合があります。
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;
論理レプリケーションに関連する他のパラメータを表示します。
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;
AlloyDB Omni 固有のパラメータを表示します。
SELECT name, setting, source, short_desc FROM pg_catalog.pg_settings WHERE name LIKE '%alloydb%' ORDER BY category, name;
構成内のノードを一覧表示する
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
の場合は、ローカルノードです。dsn
の情報を詳しく確認します。接続文字列情報が正しくないか古い場合、レプリケーションに失敗する可能性があります。dsn
のトラブルシューティングについては、サブスクリプション レプリケーションのトラブルシューティングをご覧ください。
サブスクリプションのステータスとテーブル レプリケーション ポイントを確認する
定期購入のステータスは常に定期購入データベースから確認されます。サブスクリプションのステータスは initializing
または replicating
です。ステータスは down
にも表示されます。down
ステータスの詳細については、定期購入のレプリケーションに関するトラブルシューティングをご覧ください。
現在のデータベース内のサブスクリプション、その現在のステータス、設定を一覧表示します。
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=#
現在レプリケートされているテーブルと、サブスクリプションによる現在のログシーケンス番号(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 と比較して、レプリケーション ラグを測定できます。特定のテーブルのレプリケーション ステータスを確認します。
SELECT * FROM pglogical.show_subscription_table('test_sub_1','test_table_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;
現在複製されているテーブルとシーケンスを一覧表示します。
-- 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;
プロバイダのレプリケーション情報とスロット ラグをチェックする
プロバイダ データベースで
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=#
reply_delay
列に注目します。この列には、定期購入データベースから最後に更新された日時が表示されます。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 ログファイルを調べ、問題の原因を示す追加情報を確認します。ログファイルには、権限がないことの詳細など、問題の詳細が記録されます。
AlloyDB Omni サーバーの PostgreSQL ログを確認します。
Docker
docker logs CONTAINER_NAME
CONTAINER_NAME
は、AlloyDB Omni コンテナのインストール時に割り当てた名前に置き換えます。Podman
podman logs CONTAINER_NAME
CONTAINER_NAME
は、AlloyDB Omni コンテナのインストール時に割り当てた名前に置き換えます。dsn
設定のトラブルシューティングを行い、ネットワーク接続が問題の原因ではないことを確認します。dsn
接続文字列をコピーし、psql
と同じ文字列を使用して手動接続を試みます。psql
セッションが接続できない場合は、次のことを示します。- ネットワークに関する問題。
- IP アドレス、ユーザー名、またはパスワードが正しくない。
- ブロックしているファイアウォール。
- 他のクラスタの
pg_hba.conf
ファイルが正しく構成されていません。
是正措置を講じた後にサブスクリプションを削除して再作成しない場合は、テーブルを再同期します。
SELECT pglogical.alter_subscription_resynchronize_table(subscription_name := 'test_sub_1',relation := 'table_name');
または、サブスクリプションを削除して再作成します。
SELECT pglogical.drop_subscription(subscription_name := 'test_sub_1');
次のステップ
pglogical
レプリケーションを使用したスイッチオーバーとフェイルオーバー- Google Cloud AlloyDB と AlloyDB Omni の間でデータを複製する
- AlloyDB Omni と他のデータベース間でデータを複製する