如何检测PostgreSQL从属服务器是否与主服务器上的已知事务一致?

如何检测PostgreSQL从属服务器是否与主服务器上的已知事务一致?,postgresql,replication,Postgresql,Replication,我正在为我的web应用程序设计一个主/从体系结构,在这种体系结构中,只有当从机在请求客户端触发的最后一次已知写入之前保持一致时,前端才能从从机读取数据。从属可以与主不一致,只要它们仅与其他用户而不是请求用户的写入不一致 所有写操作都被发送到主设备,这很容易,但关键是要知道何时将读操作发送到主设备,而不是从设备 我想做的是: 对于写请求,在提交所有写操作后的请求处理阶段结束时,读取数据库的当前事务指针,并将其存储在客户机响应上的cookie中 在读取请求中,从这个cookie中获取值,并首先检查

我正在为我的web应用程序设计一个主/从体系结构,在这种体系结构中,只有当从机在请求客户端触发的最后一次已知写入之前保持一致时,前端才能从从机读取数据。从属可以与主不一致,只要它们仅与其他用户而不是请求用户的写入不一致

所有写操作都被发送到主设备,这很容易,但关键是要知道何时将读操作发送到主设备,而不是从设备

我想做的是:

  • 对于写请求,在提交所有写操作后的请求处理阶段结束时,读取数据库的当前事务指针,并将其存储在客户机响应上的cookie中

  • 在读取请求中,从这个cookie中获取值,并首先检查从属服务器是否被捕获到此事务指针位置。如果它被捕获了,删除cookie并愉快地从从属服务器读取。如果没有,请从主控器读取,并将cookie留在原位

我不确定在主设备和从设备上使用什么具体功能来实现这一点,或者它们是否存在。我希望避免表中的专用计数器的开销,因为我必须显式地更新和查询,因为我认为PG已经在以某种方式为我这样做了。不过,如果有必要,我可以这样做

主设备上的
pg\u当前位置
和从设备上的
pg\u最后位置
看起来很有希望,但是,我不知道这些是否能可靠地完成工作:

  • 空闲主机和被捕获的从机是否总是为这些功能报告完全相同的值

  • 它们返回值的语法让我感到困惑,例如
    0/6466270
    -如何将该字符串转换为整数,以便可靠地进行简单的大于或小于比较

注意:如果这会影响可用的解决方案,我计划在热备用模式下使用带从属服务器的流式复制。我目前正在使用9.1,但如果有帮助的话,我会考虑升级

读取数据库的当前事务指针,并将其存储在客户机响应上的cookie中

您可以使用:

SELECT pg_xlog_location_diff(pg_current_xlog_location(), '0/00000000');
要获得绝对位置,但在这种情况下,实际上只需要存储
pg\u current\u xlog\u location()
,因为:

在读取请求中,从这个cookie中获取值,并首先检查从属服务器是否被捕获到此事务指针位置

使用
pg\u xlog\u location\u diff将保存的
pg\u current\u xlog\u location()
与从机的
pg\u last\u xlog\u replay\u location()
进行比较

空闲主机和被捕获的从机是否总是为这些功能报告完全相同的值

如果您使用的是流式复制,则可以。如果您正在执行基于归档的复制,则不会

无论如何,您不应该依赖相同的值。你只需要知道奴隶是否足够新

它们返回值的语法让我感到困惑,例如0/6466270-如何将该字符串转换为整数,以便可靠地进行简单的大于或小于比较


使用
pg\u xlog\u location\u diff
。它可能不在9.1中,因此您可能需要升级。

非常感谢。看起来diff函数在9.2中。这个xlog位置只是一个十六进制数吗?如果我可以进行字符串比较,是否需要升级?我所需要做的就是断言隐藏的主位置cookie,除非xlog position wraparound是您安装的问题,我认为这可能没问题。不过,我强烈建议大家看看
pg\u xlog\u location\u diff
的源代码。我现在没有时间自己做。好的,仅供参考,我检查了源代码,位置字符串就是64位xlog记录指针的
printf('%X/%X',(uint32)(recptr>>32),(uint32)recptr)
。因此,对结果进行简单的alpha字符串比较是行不通的,但是构造原始的64位int非常简单(diff函数就是这么做的)。再次感谢。