如何通过查看 lsn 来监控 Postgresql 12 中的逻辑复制?
我所做的:检查发布者和订阅者上的一些列。
出版方:
select * from pg_stat_replication;
-- 查看 REPLAY_LSN
select * from pg_replication_slots;
-- 见 CONFIRMED_FLUSH_LSN
订阅方:
select * from pg_catalog.pg_stat_subscription;
-- 查看 RECEIVED_LSN 和 LATEST_END_LSN
我确保这些列中的所有值都相同。
我对么 ?或者有没有其他方法可以通过检查一些参数来查看复制工作?
我在 Postgres 12 上使用了复制。
在发布者方面,您可以检查几件事:
我将创建一个包含两个表的发布“test_publication”:
t_1
和t_2
. 我不会介绍先决条件(用户、角色等)。在订阅者方面:
有趣的信息在表中
pg_catalog.pg_stat_subscription
。这里重要的列是:received_lsn
:收到的最后一个预写日志位置。last_msg_send_time
:从发布者收到的最后一条消息的发送时间。last_msg_receipt_time
:从发布者收到的最后一条消息的接收时间。latest_end_lsn
:报告给发布者的最后一个预写日志位置。latest_end_time
:上一次向发布者报告的预写日志位置的时间。您必须检查这些列以了解正在发生的事情。首先,检查两个数据库是否同步;
发行方:
这显示了我们现在在 WAL 文件中的位置,在开始新的插入之前。
我们可以检查订阅者,此时两个数据库是同步的,因为
pg_current_wal_lsn()
发布者返回的值与列received_lsn
和latest_end_lsn
订阅者中的值匹配:我将向 table 添加 4000 行
t_1
,看看发布者会发生什么:让我们看看
pg_catalog.pg_stat_subscription
在订阅者复制期间值如何变化:如您所见,在订阅者上,四列显示了 WAL 如何从发布者到达以及如何应用它。列中的时间差异
last_msg_send_time
可以last_msg_receipt_time
提供有关发布者和订阅者之间滞后的信息。在这种情况下,两台服务器位于同一数据中心的不同子网上。考虑到我使用的两台服务器是测试服务器,它们之间的同步并不完美。(订阅服务器根本没有配置 NTP 服务器)。