在没有第 3 方工具的情况下避免 PostgreSQL 中的脑裂
Avoid split brain in PostgreSQL without 3rd party tool
我有 2 台 PostgreSQL 服务器,我已经在它们之间设置了流复制。
我已经构建了一个 shell 脚本,它每分钟都会 ping 到主服务器,并在主服务器不响应时将从服务器提升为主服务器。我正在使用 rh-postgresql95,第 3 方工具不适用于此版本。
我的 JDBC 连接字符串包含逗号分隔的节点,其中 targetServerType=master 如下所示
jdbc:postgresql://node1,node2/accounting?targetServerType=master.
我只想知道slave升为master,old master也莫名其妙出现,如何避免脑裂?
或
有没有办法让老夫子永远不自动出现?
编辑
在我的 JDBC 连接字符串中,node1 是主节点,node2 是从节点。
我停止了 master 上的 postgres 服务,并将 slave 提升为 New Master。在这种情况下,服务指向新的主人。
然后我在old master上重启了postgres服务,服务开始指向old master(node1是old master的ip,它在JDBC连接字符串中排在第一位。)
所以,我没有得到脑裂问题,但这种情况会导致数据不一致。
作为一个想法,您的 ping 脚本可以检查两个服务器是否认为它们是主服务器:
select pg_is_in_recovery();
不在恢复中的服务器是主服务器。然后你可以检查最后一个 received WAL's number:
select pg_last_wal_receive_lsn();
LSN 最高的服务器是最后升级的服务器。然后您可以关闭另一台服务器。
如果您对第三方选项改变主意,请查看 PostgresSQL wiki。
我有 2 台 PostgreSQL 服务器,我已经在它们之间设置了流复制。 我已经构建了一个 shell 脚本,它每分钟都会 ping 到主服务器,并在主服务器不响应时将从服务器提升为主服务器。我正在使用 rh-postgresql95,第 3 方工具不适用于此版本。
我的 JDBC 连接字符串包含逗号分隔的节点,其中 targetServerType=master 如下所示
jdbc:postgresql://node1,node2/accounting?targetServerType=master.
我只想知道slave升为master,old master也莫名其妙出现,如何避免脑裂?
或
有没有办法让老夫子永远不自动出现?
编辑
在我的 JDBC 连接字符串中,node1 是主节点,node2 是从节点。
我停止了 master 上的 postgres 服务,并将 slave 提升为 New Master。在这种情况下,服务指向新的主人。
然后我在old master上重启了postgres服务,服务开始指向old master(node1是old master的ip,它在JDBC连接字符串中排在第一位。)
所以,我没有得到脑裂问题,但这种情况会导致数据不一致。
作为一个想法,您的 ping 脚本可以检查两个服务器是否认为它们是主服务器:
select pg_is_in_recovery();
不在恢复中的服务器是主服务器。然后你可以检查最后一个 received WAL's number:
select pg_last_wal_receive_lsn();
LSN 最高的服务器是最后升级的服务器。然后您可以关闭另一台服务器。
如果您对第三方选项改变主意,请查看 PostgresSQL wiki。