我有2台PostgreSQL服务器,我在它们之间设置了流复制。 我已经构建了一个shell脚本,它将每分钟ping到主服务器,并在master无法响应时将slave强制为master。我使用的是rh-postgresql95,第三方工具无法使用此版本。
我的JDBC连接字符串有逗号分隔的节点,其中targetServerType = master,如下所示
jdbc:postgresql://node1,node2/accounting?targetServerType=master.
我只是想知道如果奴隶被提升为主人并且老主人也以某种方式出现,我怎么能避免裂脑情况?
或
无论如何,老主人永远不会自动出现?
修改
node1是master,node2是我的JDBC连接字符串中的slave。
我停止了对主人的postgres服务,并将奴隶提升为新主人。在这种情况下,服务指向新的主服务器。
然后我重新启动了旧主服务器上的postgres服务,并且服务开始指向旧主服务器(node1是旧主服务器的ip,它首先出现在JDBC连接字符串中。)。
所以,我没有得到裂脑问题,但这种情况会导致数据不一致。
答案 0 :(得分:2)
作为一个想法,您的ping脚本可以检查两个服务器是否认为它们是主人:
select pg_is_in_recovery();
未恢复的服务器是主服务器。然后你可以查看最后一个received WAL's number:
select pg_last_wal_receive_lsn();
LSN最高的服务器是最后提升的服务器。然后,您可以关闭其他服务器。
如果您改变了对第三方选项的看法,请查看PostgresSQL wiki。