我们在主+同步热备设置中使用PostgreSQL 9.5,即使用synchronous_commit = on和synchronous_standby_names='*'.
因此,备用服务器在主服务器的sync_state = sync中有pg_stat_replication_table。
我们还使用波斯特格斯_出口商,其中使用下面的语句从主数据中提取系统的复制滞后。
SELECT *, pg_current_xlog_location(),
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)::float
FROM pg_stat_replication;问:上述对pg_xlog_location_diff的调用是否总是在同步设置中返回0,还是在存在可测量复制滞后的情况下?
据我理解,如果上面的语句显示滞后,这意味着主服务器在没有等待备用的情况下提交了事务,这在同步设置中是不应该发生的。
请注意,我们还使用复制槽,已经使用repmgr设置了集群,并且不对单个事务在本地覆盖synchronous_commit。
发布于 2016-03-10 14:35:59
查询中的pg_xlog_location_diff可能返回超过0。
WAL数据有三个写入WAL段文件的时间: 1)事务提交时,2)填充WAL缓冲区时,3) WAL写入进程定期写入(默认为200毫秒)。
流复制的基本顺序如下所示:
我举了一个极端的例子来澄清这个问题。如果您运行一个长事务来插入大量数据,主服务器将继续发送WAL数据,直到事务提交为止。当您在2到3期间发出查询时,pg_current_xlog_location()返回当前位置,而replay_location返回前一重放位置,因此pg_xlog_location_diff(pg_current_xlog_location(), replay_location)返回超过0。
其他情况如下:配置参数max_standby_*_delay已启用,并且发生冲突,您的备用挂起重放WAL数据,因此pg_xlog_location_diff()返回的值超过0。
(这两个例子都是逻辑上的极端情况。)
无论如何,我认为您的问题并不取决于复制模式是同步的还是异步的。同步和异步的区别在于,主服务器确认同步从提交事务的与否。您的问题与WAL数据发送和重放的一般顺序有关,但不依赖于同步模式。
(考虑如何在同步模式下提交长事务。我讨论了在我显示的流复制序列中从2到3(很短的时间)发出查询时会发生什么。我没有讨论提交事务的时间,因为我认为这不是回答的关键。)
https://dba.stackexchange.com/questions/131810
复制相似问题