[英]How to detect if a PostgreSQL slave is consistent up to a known transaction on the master?
我正在为我的 Web 应用程序制定一个主/从架构,其中前端从从服务器读取的内容只有在从服务器在请求客户端触发的最后一次已知写入时间之前保持一致的情况下才必须这样做。 从站可能与主站不一致,只要它们仅与其他用户的写入不一致,而不是请求用户的写入。
所有写入都发送到主机,这很容易,但诀窍是知道何时将读取发送到主机还是从机。
我想做的是:
在写入请求中,在提交所有写入后的请求处理阶段结束时,对数据库的当前事务指针进行某种读取并将其存储在客户端响应的 cookie 中。
在读取请求中,从该 cookie 中获取值并首先检查从属设备是否已赶上该事务指针位置。 如果赶上,删除cookie并愉快地从slave读取。 如果没有,请从 master 读取并将 cookie 留在原处。
我不确定在主站和从站上使用什么特定功能来实现这一点,或者它们是否存在。 我想避免我必须显式更新和查询的表中专用计数器的开销,因为我认为 PG 已经以某种方式为我做这件事。 但是,如果有必要,我可以这样做。
主pg_current_xlog_location
上的pg_current_xlog_location
和从pg_current_xlog_location
上的pg_last_xlog_replay_location
看起来很有希望,但是,我不知道这些是否能可靠地完成这项工作:
空闲的主站和追赶的从站是否总是为这些函数报告完全相同的值?
它们的返回值的语法让我感到困惑,例如0/6466270
- 如何以一种可以可靠地进行简单的大于或小于比较的方式将此字符串转换为整数?
注意:如果这会影响可用的解决方案,我计划在热备用模式下对从属设备使用流式复制。 我目前使用的是 9.1,但如果有帮助,我会考虑升级。
对数据库的当前事务指针进行某种读取,并将其存储在客户端响应的 cookie 中。
您可以使用:
SELECT pg_xlog_location_diff(pg_current_xlog_location(), '0/00000000');
获得绝对位置,但在这种情况下,您实际上只需要存储pg_current_xlog_location()
,因为:
在读取请求中,从该 cookie 中获取值并首先检查从属设备是否已赶上该事务指针位置。
使用pg_xlog_location_diff
将保存的pg_current_xlog_location()
与从站的pg_last_xlog_replay_location()
进行pg_xlog_location_diff
。
空闲的主站和追赶的从站是否总是为这些函数报告完全相同的值?
如果您使用流复制,是的。 如果您正在进行基于存档的复制,则不会。
无论如何,您不应该依赖相同的值。 你只需要知道奴隶是否足够新。
它们的返回值的语法让我感到困惑,例如 0/6466270 - 如何以一种可以可靠地进行简单的大于或小于比较的方式将此字符串转换为整数?
使用pg_xlog_location_diff
。 它可能不在 9.1 中,因此您可能需要升级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.