Apache zookeeper 动物园管理员在分裂大脑场景中的内部行为

Apache zookeeper 动物园管理员在分裂大脑场景中的内部行为,apache-zookeeper,Apache Zookeeper,我试图了解ApacheZooKeeper在大脑分裂情况下的内部工作原理。假设有一个由5台服务器组成的集群:a、B、C、D和E,其中a是领导者。现在假设子集群{A,B}与子集群{C,D,E}分离 在这种情况下,小组{C,D,E}可以选举新的领导人并取得进展。另一方面{A,B}无法取得进展,因为没有大多数节点确认更新 我想知道: 老领导A怎么了?我预计它会失去领导力,但这是怎么发生的呢?主动领导者会定期检查以确保其拥有大多数追随者 连接到A和B的客户端会发生什么情况?它们将自动重定向到仍能取得进展的

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

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

我想知道:

  • 老领导A怎么了?我预计它会失去领导力,但这是怎么发生的呢?主动领导者会定期检查以确保其拥有大多数追随者

  • 连接到A和B的客户端会发生什么情况?它们将自动重定向到仍能取得进展的服务器之一(C、D或E)。或者更确切地说,他们被A或B卡住了,直到分裂的大脑状况被治愈,整个集群重新连接

  • 谢谢,
    Gabriel

    在对本地集群进行了一些实验之后,我想我找到了行为

    我启动了一个由5个节点组成的本地集群,然后关闭了其中的2个节点。其余3个节点仍然占多数,因此集群已启动并运行。我在这一点上连接了一个客户端

    然后我关闭了另一台服务器,此时剩下的两个节点无法维持集群的正常运行

    1)在剩下的两个节点中的一个节点的日志中(碰巧是领先节点),我可以看到:

    [myid:5]-警告 [RecvWorker:3:QuorumCnxManager$RecvWorker@762]-连接因以下原因断开: id 3,我的id=5,error=java.io.EOFException 位于java.io.DataInputStream.readInt(DataInputStream.java:392) 位于org.apache.zookeeper.server.quorum.qourumcnxmanager$RecvWorker.run(qourumcnxmanager.java:747)

    后来

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

    因此,节点似乎在积极监控连接,并对断开的连接做出反应(在本例中,尝试选举另一个领导者)

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

    [myid:]-信息 [主发送线程(本地主机:2185):ClientCnxn$SendThread@966]-开幕式 到服务器localhost/127.0.0.1:2185的套接字连接。不会尝试 使用SASL进行身份验证(未知错误)

    [myid:]-信息 [主发送线程(本地主机:2185):ClientCnxn$SendThread@849]-插座 已建立到localhost/127.0.0.1:2185的连接,正在启动 会议

    [myid:]-信息 [主发送线程(本地主机:2185):ClientCnxn$SendThread@1085]-无法 要从服务器会话ID 0x343d9a80f220000读取附加数据, 服务器可能已关闭套接字,正在关闭套接字连接和 正在尝试重新连接

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


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

    根据Zookeeper使用的基本原子广播协议ZAB的论文。选举由两种情况触发。第一,当一个跟随者在超时后无法联系领导者时。第二,当领导者意识到自己没有法定人数支持,而领导者意识到自己试图提交提案时


    回到你的场景。当{C,D,E}中的一个节点意识到领导人走了,它就会触发选举。一旦选出新的领导者,它就会开始正常地为客户请求提供服务。另一个分区的集群{A,B}将不服务于任何客户机请求,并且将在解决分区之前一直停留在选择中。当问题解决后,将举行最后一次选举,整个集群现在又恢复正常运行。

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