本页介绍了如何通过检查和验证提供方和订阅方数据库来监控和排查 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 是端点之一,请使用 Logs 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');