我们使用Postgres作为我们项目的数据库,发现流复制符合我们的异步工作需求。我们有一台服务器处于只写模式(MASTER),其他服务器处于只读模式(SLAVES)。
在大多数情况下,我们会将数据发送给MASTER并忘记它。但有时我们希望确保当前的块在继续之前在主设备和从设备之间同步。对于新行(INSERTS)它是微不足道的,脚本可以检查是通过简单的SELECT查询出现的新行。但对于UPDATE来说,这就成了问题。
那么,是否有任何简单合法的方法可以检查奴隶是否赶超主人?我知道每条记录都应该有自己的内部ID,但不确定它们在服务器之间是否相同。
我们使用Postgres 9.2,其配置非常相似described in this great article。
答案 0 :(得分:0)
所以,最后我自己找到了解决方案。到目前为止,postgres存储所有更改都是特殊的日志文件,然后通过从属服务器复制更改。同时postgres拥有丰富的API方法,可以读取不同内部进程的状态。所以最后我使用了这个查询:
-- On MASTER server current xlog location:
SELECT
pg_xlog_location_diff(pg_current_xlog_location(), '0/0') AS offset;
-- On SLAVE server current offset of received and applied changes
SELECT
pg_xlog_location_diff(pg_last_xlog_receive_location(), '0/0') AS receive,
pg_xlog_location_diff(pg_last_xlog_replay_location(), '0/0') AS replay;
从MASTER和SLAVE获取此值我可以决定服务器之间的差异有多大。当我需要确定两个服务器处于相同状态时,我可以等到SLAVE上的偏移量等于或大于MASTER上的偏移量。
如果遇到同样的问题,这个查询也可能很方便:
-- Check is current server in cluster
SELECT
pg_is_in_recovery() AS recovery;
-- False — server is MASTER
-- True — server is SLAVE