如何检测PostgreSQL从属服务器是否与主服务器上的已知事务一致?
我正在为我的web应用程序设计一个主/从体系结构,在这种体系结构中,只有当从机在请求客户端触发的最后一次已知写入之前保持一致时,前端才能从从机读取数据。从属可以与主不一致,只要它们仅与其他用户而不是请求用户的写入不一致 所有写操作都被发送到主设备,这很容易,但关键是要知道何时将读操作发送到主设备,而不是从设备 我想做的是:如何检测PostgreSQL从属服务器是否与主服务器上的已知事务一致?,postgresql,replication,Postgresql,Replication,我正在为我的web应用程序设计一个主/从体系结构,在这种体系结构中,只有当从机在请求客户端触发的最后一次已知写入之前保持一致时,前端才能从从机读取数据。从属可以与主不一致,只要它们仅与其他用户而不是请求用户的写入不一致 所有写操作都被发送到主设备,这很容易,但关键是要知道何时将读操作发送到主设备,而不是从设备 我想做的是: 对于写请求,在提交所有写操作后的请求处理阶段结束时,读取数据库的当前事务指针,并将其存储在客户机响应上的cookie中 在读取请求中,从这个cookie中获取值,并首先检查
- 对于写请求,在提交所有写操作后的请求处理阶段结束时,读取数据库的当前事务指针,并将其存储在客户机响应上的cookie中
- 在读取请求中,从这个cookie中获取值,并首先检查从属服务器是否被捕获到此事务指针位置。如果它被捕获了,删除cookie并愉快地从从属服务器读取。如果没有,请从主控器读取,并将cookie留在原位
pg\u当前位置
和从设备上的pg\u最后位置
看起来很有希望,但是,我不知道这些是否能可靠地完成工作:
- 空闲主机和被捕获的从机是否总是为这些功能报告完全相同的值
- 它们返回值的语法让我感到困惑,例如
-如何将该字符串转换为整数,以便可靠地进行简单的大于或小于比较0/6466270
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函数就是这么做的)。再次感谢。