【问题标题】:Is record replicated in postgres cluster?记录是否在 postgres 集群中复制?
【发布时间】:2013-01-28 08:28:21
【问题描述】:

我们使用 Postgres 作为我们项目的数据库,发现流式复制适合我们的异步工作需求。我们有一台服务器处于只写模式(MASTER),其他服务器处于只读模式(SLAVES)。

在大多数情况下,我们将数据发送到 MASTER 并忘记它。但有时我们希望在继续之前确保当前块在主从之间同步。对于新行(INSERTS),这很简单,脚本可以检查简单的 SELECT 查询是否出现了新行。但是对于 UPDATE,它就成了问题。

那么,有没有简单合法的方法来检查slave是否赶上master呢?我知道每条记录都应该有自己的内部 id,但不确定服务器之间是否相同。

我们使用配置非常相似的 Postgres 9.2 described in this great article

【问题讨论】:

  • 为什么UPDATEs 有问题?你能显示你正在使用的代码吗?
  • 我认为 pg_stat_replication 视图应该可以做到这一点,但我之前没有使用过:postgresql.org/docs/current/static/…
  • @vyegorov: 插入顺序如下: 1. write_connection("insert to ..."), get record_key 2. read_connection("select * from ... where key =record_key ") 3.如果未找到,则延迟后再次执行第 2 步。想要更新类似的东西,但不想检查每一列。寻找更通用的方法。
  • 我觉得太复杂了。我建议按照@a_horse_with_no_name 的建议查看pg_stat_replication 视图。

标签: postgresql synchronization replication master-slave


【解决方案1】:

所以,最后我自己找到了解决方案。到目前为止,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多