PostgreSQL + BDR 中的复制确认

Replication acknowledgement in PostgreSQL + BDR

我正在使用 libpq C 库来测试 PG + BDR 副本集。我想获得对 CRUD 操作复制的确认。我的目的是以毫秒为单位或如果可能以微秒为单位制作我自己的复制时间日志。

程序:
启动 10-20 个线程 独立连接,每个线程对三个表进行 1000-5000 次基本 CRUD 操作循环。

哪种方法最好?
如果它们有带时间戳的正确数据或在我的 C api 中解析一些高冗长的日志,我应该在每次 CRUD 操作后启动 N 线程(N = {节点数} - {我连接的主节点}) .并查询数据的节点。

您无法轻松获得单个 xacts 的重播确认。系统跟踪对等节点重播的日志序列号,但不跟踪它们对应的事务 ID,因为它不关心。

你似乎想要的是近同步或半同步复制。 9.6 的一些工作有望及时使 BDR 受益,但那是未来的事。

同时您可以在pg_replication_slots中看到日志序列号为restart_lsn。这不是副本重播到的位置,但它是崩溃后可能必须重新开始重播的最旧点。

您只能在 pg_stat_replication 中连接副本时才能看到其他 LSN 字段,例如 replay_location。不幸的是,在 9.4 中,没有简单的方法来查看 pg_replication_slots 中的哪个插槽与 pg_stat_replication 中的哪个活动连接相关联(在 9.5 中已修复,但 BDR 仍然基于 9.4)。所以要挑出单个节点就得用BDR设置的application_name,解析的是..."interesting"。也经常被截断。

您可以在 提交 xact 后通过调用 SELECT pg_current_xlog_location(); 获取您在 上提交 xact 的服务器的当前 LSN,这将 return 值类似于 0/19E0F060 或其他。然后,您可以在对等节点的 pg_stat_replication 中查找该值,直到您看到您提交的节点的 replay_location 已达到或超过您在提交后立即捕获的 LSN。

它并不完美。在您提交和捕获服务器的当前 LSN 之间可能还有其他工作要做。没有办法解决这个问题,但最坏的情况是你等待的时间有点太长了。如果您使用的是 BDR,则无论如何您都不应该关心微秒甚至毫秒,因为它是一个 异步 复制解决方案。

原理与测量普通物理备用服务器的复制滞后非常相似,因此我建议阅读一些相关文档。除了 pg_last_xact_replay_timestamp() 不适用于逻辑复制,所以使用它不会有延迟,您必须使用 LSN 并在客户端进行自己的计时。