首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步标准的PostgreSQL流复制滞后

同步标准的PostgreSQL流复制滞后
EN

Database Administration用户
提问于 2016-03-10 10:23:49
回答 1查看 1.9K关注 0票数 1

我们在主+同步热备设置中使用PostgreSQL 9.5,即使用synchronous_commit = onsynchronous_standby_names='*'.

因此,备用服务器在主服务器的sync_state = sync中有pg_stat_replication_table

我们还使用波斯特格斯_出口商,其中使用下面的语句从主数据中提取系统的复制滞后。

代码语言:javascript
复制
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

EN

回答 1

Database Administration用户

发布于 2016-03-10 14:35:59

查询中的pg_xlog_location_diff可能返回超过0。

WAL数据有三个写入WAL段文件的时间: 1)事务提交时,2)填充WAL缓冲区时,3) WAL写入进程定期写入(默认为200毫秒)。

流复制的基本顺序如下所示:

  1. (硕士)写WAL数据。
  2. (主)将WAL数据发送给奴隶。
  3. (从)接收WAL数据并重放它。
  4. (从)返回一些信息(例如重放位置、接收位置、刷新位置)。

我举了一个极端的例子来澄清这个问题。如果您运行一个长事务来插入大量数据,主服务器将继续发送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(很短的时间)发出查询时会发生什么。我没有讨论提交事务的时间,因为我认为这不是回答的关键。)

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/131810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档