我正在为我的 Web 应用程序制定一个主/从架构,其中前端从属读取只有在从站与请求客户端触发的最后一次已知写入时间一致时才必须这样做。从属服务器与主站可能不一致,只要它们仅在其他用户的写入方面不一致,而不是请求用户的写入。
所有写入都发送到主站,这很容易,但诀窍是知道何时将读取发送到主站和从站。
我想做的是:
- 在写入请求中,
在提交所有写入后的请求处理阶段结束时,对数据库的当前事务指针进行某种读取,并将其存储在客户端响应的 cookie 中。
在读取请求中,从此cookie中获取值,并首先检查从站是否被赶到此事务指针位置。如果它被赶上了,请删除饼干并愉快地从奴隶那里阅读。如果没有,请从主文件读取并将 cookie 留在原位。
我不确定在主站和从站上使用什么具体功能来实现这一点,或者它们是否存在。我想避免表中必须显式更新和查询的专用计数器的开销,因为我认为 PG 已经以某种方式为我执行此操作。但是,如有必要,我可以这样做。
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()
进行比较。
空闲的主站和被捕获的从站是否总是为这些功能报告完全相同的值?
如果您使用的是流式复制,是的。如果您正在执行基于存档的复制,则不会。
无论如何,您都不应该依赖相同的值。您只需要知道奴隶是否足够新。
它们的返回值的语法让我感到困惑,例如 0/6466270 - 我如何将这个字符串转换为整数,以便我可以可靠地进行简单的大于或小于比较?
使用pg_xlog_location_diff
.它可能不在 9.1 中,因此您可能需要升级。