3 个数据中心:
Patroni 版本:2.1.4
PostgreSQL 版本:14.4
Etcd 版本:3.3.11
直流 | 服务器 | 姓名 | 主持人 | 地位 |
---|---|---|---|---|
第一 | 帕特罗尼 | 赞助人-s11 | 172.16.0.2 | 领导者 |
第一 | 帕特罗尼 | 赞助人-s12 | 172.16.0.3 | 同步待机 |
第一 | 远程控制计算机系统 | etcd-s11 | 172.16.0.4 | 领导者 |
第二 | 帕特罗尼 | 赞助人-s21 | 172.16.1.2 | 复制品 |
第二 | 帕特罗尼 | 赞助人-s22 | 172.16.1.3 | 复制品 |
第二 | 远程控制计算机系统 | etcd-s21 | 172.16.1.4 | 奴隶 |
第三 | 帕特罗尼 | 赞助人-s31 | 172.16.2.2 | 复制品 |
第三 | 远程控制计算机系统 | etcd-s31 | 172.16.2.4 | 奴隶 |
我模拟了第一个数据中心和第二个数据中心之间的互连故障,两个数据中心都已启动,但第一个数据中心和第二个数据中心彼此之间却“看不到”对方。
在这种情况下,Patroni 领导者仍留在第一个数据中心。但第二个数据中心的服务器不与集群同步。如果相信集群健康,一切都很好,服务器之间没有复制滞后。实际上,主服务器上的所有更改都不会与第二个数据中心上的副本同步。
[user@patroni-s11 ~]$ sudo patronictl -c /etc/patroni/patroni.yml list
2022-12-01 16:00:00,015 - ERROR - Request to server 172.16.1.4:2379 failed: MaxRetryError("HTTPConnectionPool(host='172.16.1.4', port=2379): Max retries exceeded with url: /v2/keys/service/patroni_cluster/?recursive=true (Caused by ProtocolError('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer')))",)
+ Cluster: patroni_cluster (7117639577766255236) ---+---------+-----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+-----------------+---------------+--------------+---------+-----+-----------+
| patroni-s11 | 172.16.0.2 | Leader | running | 103 | |
| patroni-s12 | 172.16.0.3 | Sync Standby | running | 103 | 0 |
| patroni-s21 | 172.16.1.2 | Replica | running | 103 | 0 |
| patroni-s22 | 172.16.1.3 | Replica | running | 103 | 0 |
| patroni-s31 | 172.16.2.2 | Replica | running | 103 | 0 |
+-----------------+---------------+--------------+---------+-----+-----------+
Etcd 服务器上仍然会发生这种情况,领导者仍然留在第一个 DC。
[user@etcd-s11 ~]$ sudo etcdctl cluster-health
failed to check the health of member a85c06b926e6c6c8 on 172.16.1.4:2379: Get 172.16.1.4:2379/health: read tcp 10.220.0.3:38836->172.16.1.4:2379: read: connection reset by peer
member 261f8081db14d568 is healthy: got healthy result from 172.16.0.4:2379
member a85c06b926e6c6c8 is unreachable: [172.16.1.4: 2379] are all unreachable
member b87bd1df518cc9e4 is healthy: got healthy result from 172.16.2.4:2379
cluster is degraded
[user@etcd-s11 ~]$ sudo etcdctl member list
261f8081db14d568: name=etcd-s11 peerURLs=172.16.0.4:2380 clientURLs=172.16.0.4:2379 isLeader=true
a85c06b926e6c6c8: name=etcd-s21 peerURLs=172.16.1.4:2380 clientURLs=172.16.1.4:2379 isLeader=false
b87bd1df518cc9e4: name=etcd-s31 peerURLs=172.16.2.4:2380 clientURLs=172.16.2.4: 2379 isLeader=false
但第三个数据中心的 Etcd 发现集群是健康的
[user@etcd-s31 ~]$ sudo etcdctl cluster-health
member 261f8081db14d568 is healthy: got healthy result from http:// 172.16.0.4: 2379
member a85c06b926e6c6c8 is healthy: got healthy result from http:// 172.16.1.4: 2379
member b87bd1df518cc9e4 is healthy: got healthy result from http:// 172.16.2.4: 2379
cluster is healthy
我预计领导者将成为来自第 3 DC 的服务器。
在这种情况下,Patroni\etcd 可以改变领导者吗?
答案1
首先,qourm 是 5/2,级别上升,有 3 个服务器,如果您正在运行 site1 + site 3,并且您看到的行为是预期的,那么就会满足这个要求
如果站点 1 + 站点 3 未达到要求,则结果将有所不同