我们的逻辑复制最近因为关键冲突而停止了——wals 正在下降但没有被应用。我想设置一些监控,以便在发生这种情况时我可以收到通知,但我不确定要使用哪些字段。
我认为我应该能够使用 pg_stat_subscription 视图,但我从它的 description 中不确定它的列到底代表什么。
我可以将源的 pg_current_wal_lsn() 与副本的 pg_stat_subscription.received_lsn 进行比较以确保数据正在下降吗?
received_lsn pg_lsn Last write-ahead log location received, the initial value of this field being 0
将副本的 pg_stat_subscription.received_lsn 与其 pg_stat_subscription.latest_end_lsn 进行比较,让我知道数据是否正在重播?
latest_end_lsn pg_lsn Last write-ahead log location reported to origin WAL sender
这是我最不确定的最后一个问题 - “报告给原始 WAL 发送者”是否意味着复制已在副本上成功重播?或者我是否需要使用其他一些字段来了解副本已成功应用源数据库中的更改的程度?
您可以使用以下查询从源数据库找到逻辑复制延迟。
从pg_replication_slots中选择pg_wal_lsn_diff(pg_current_wal_lsn(),confirmed_flush_lsn);
pg_current_wal_lsn() :该函数返回源数据库中当前 wal lsn 的位置。 konfirmed_flush_lsn :该字段出现在 pg_replication_slots 视图中。该值告诉订阅者/逻辑客户端在 WAL(源)中的哪个位置已收到从源数据库发送的更改。该值由订阅者/逻辑客户端通过反馈消息发送到源数据库。