问题 ZooKeeper对裂脑情景的内部行为


我试图了解Apache ZooKeeper在裂脑情况下的内部工作原理。假设有一个由5个服务器组成的集群:A,B,C,D和E,其中A是领导者。现在假设子集群{A,B}与子集群{C,D,E}分离。

在这种情况下,子集群{C,D,E}可以选出新的领导者并且可以取得进展。另一方面,{A,B}无法取得进展,因为没有大多数节点可以确认更新。

我在想:

  1. 老领导A会发生什么?我希望它失去领导能力,但这是怎么发生的?活跃的领导者会定期检查以确保其拥有大多数粉丝?

  2. 连接到A和B的客户会发生什么?它们是否会自动重定向到仍然可以取得进展的服务器之一(C,D或E)。或者更确切地说,他们被A或B困住,直到裂脑情况得到治愈并且整个集群重新连接?

谢谢, 加布里埃尔


5902
2018-01-27 12:16


起源



答案:


经过一些本地集群的试验后,我想我已经找到了行为。

我启动了一个包含5个节点的本地群集,然后取下了2个节点。其余3个节点仍然占多数,因此群集已启动并运行。我此时连接了一个客户端。

然后我取下了另一台服务器,此时剩余的2个节点无法维持群集的运行。

1) 在其余两个节点之一(恰好是领导者)的日志中,我可以看到:

[myid:5] - 警告   [RecvWorker:3:QuorumCnxManager $ RecvWorker @ 762] - 连接断开   id 3,my id = 5,error = java.io.EOFException           在java.io.DataInputStream.readInt(DataInputStream.java:392)           在org.apache.zookeeper.server.quorum.QuorumCnxManager $ RecvWorker.run(QuorumCnxManager.java:747)

然后

[myid:5] - 信息   [QuorumPeer [myid = 5] /127.0.0.1:2185:FastLeaderElection@740] - 新的   选举。我的id = 5,建议zxid = 0x300000002

因此,似乎节点正在主动监视连接并对丢弃的连接作出反应(在这种情况下尝试选择另一个领导者)。

2) 在连接的客户端的日志中,我可以看到:

[myid:] - INFO   [main-SendThread(localhost:2185):ClientCnxn $ SendThread @ 966] - 开幕   套接字连接到服务器localhost / 127.0.0.1:2185。不会尝试   使用SASL进行身份验证(未知错误)

[myid:] - INFO   [main-SendThread(localhost:2185):ClientCnxn $ SendThread @ 849] - 套接字   建立到localhost / 127.0.0.1:2185的连接,启动   会议

[myid:] - INFO   [main-SendThread(localhost:2185):ClientCnxn $ SendThread @ 1085] - 无法使用   从服务器sessionid 0x343d9a80f220000读取其他数据,   可能服务器已关闭套接字,关闭套接字连接和   尝试重新连接

因此,由于群集已关闭,节点将关闭客户端打开的连接。

在这种情况下,整个群集已关闭,因此客户端不断尝试连接到其中一个节点,没有运气。但我认为,在分裂脑情况下,当大多数人仍然在某个地方运行时,客户端最终将能够连接到它(当然,它具有网络连接)。


9
2018-01-28 17:12



那么在2节点情景{A,B}中,领导者最终会当选吗?我在互联网上的许多地方都看到,当多个领导者的投票数不相同时,较低的SID [例如:myid:5]将是首选 - ravi


答案:


经过一些本地集群的试验后,我想我已经找到了行为。

我启动了一个包含5个节点的本地群集,然后取下了2个节点。其余3个节点仍然占多数,因此群集已启动并运行。我此时连接了一个客户端。

然后我取下了另一台服务器,此时剩余的2个节点无法维持群集的运行。

1) 在其余两个节点之一(恰好是领导者)的日志中,我可以看到:

[myid:5] - 警告   [RecvWorker:3:QuorumCnxManager $ RecvWorker @ 762] - 连接断开   id 3,my id = 5,error = java.io.EOFException           在java.io.DataInputStream.readInt(DataInputStream.java:392)           在org.apache.zookeeper.server.quorum.QuorumCnxManager $ RecvWorker.run(QuorumCnxManager.java:747)

然后

[myid:5] - 信息   [QuorumPeer [myid = 5] /127.0.0.1:2185:FastLeaderElection@740] - 新的   选举。我的id = 5,建议zxid = 0x300000002

因此,似乎节点正在主动监视连接并对丢弃的连接作出反应(在这种情况下尝试选择另一个领导者)。

2) 在连接的客户端的日志中,我可以看到:

[myid:] - INFO   [main-SendThread(localhost:2185):ClientCnxn $ SendThread @ 966] - 开幕   套接字连接到服务器localhost / 127.0.0.1:2185。不会尝试   使用SASL进行身份验证(未知错误)

[myid:] - INFO   [main-SendThread(localhost:2185):ClientCnxn $ SendThread @ 849] - 套接字   建立到localhost / 127.0.0.1:2185的连接,启动   会议

[myid:] - INFO   [main-SendThread(localhost:2185):ClientCnxn $ SendThread @ 1085] - 无法使用   从服务器sessionid 0x343d9a80f220000读取其他数据,   可能服务器已关闭套接字,关闭套接字连接和   尝试重新连接

因此,由于群集已关闭,节点将关闭客户端打开的连接。

在这种情况下,整个群集已关闭,因此客户端不断尝试连接到其中一个节点,没有运气。但我认为,在分裂脑情况下,当大多数人仍然在某个地方运行时,客户端最终将能够连接到它(当然,它具有网络连接)。


9
2018-01-28 17:12



那么在2节点情景{A,B}中,领导者最终会当选吗?我在互联网上的许多地方都看到,当多个领导者的投票数不相同时,较低的SID [例如:myid:5]将是首选 - ravi