【问题标题】:ZooKeeper internal behavior on split brain scenarioZooKeeper 在脑裂场景下的内部行为
【发布时间】:2014-02-18 06:43:14
【问题描述】:

我正在尝试了解 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 上,直到裂脑情况得到治愈并重新连接整个集群?

谢谢, 加布里埃尔

【问题讨论】:

    标签: apache-zookeeper


    【解决方案1】:

    在对本地集群进行了一些试验后,我想我弄清楚了这种行为。

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

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

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

    [myid:5] - 警告 [RecvWorker:3:QuorumCnxManager$RecvWorker@762] - 连接中断 id 3,我的 id = 5,错误 = 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:] - 信息 [main-SendThread(localhost:2185):ClientCnxn$SendThread@966] - 打开 与服务器 localhost/127.0.0.1:2185 的套接字连接。不会尝试 使用 SASL 进行身份验证(未知错误)

    [myid:] - 信息 [main-SendThread(localhost:2185):ClientCnxn$SendThread@849] - 套接字 与 localhost/127.0.0.1:2185 建立连接,启动 会话

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

    所以节点关闭了客户端打开的连接,因为集群已经宕机了。

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

    【讨论】:

    • 那么在 2 节点场景 {A,B} 中,是否最终选出了领导者?我在互联网上的许多地方看到,当多个领导者的投票数不同时,将首选较低的 SID [例如:myid:5]
    【解决方案2】:

    根据论文 ZAB,https://marcoserafini.github.io/papers/zab.pdf,这是 Zookeeper 使用的底层原子广播协议。选举由两种情况触发。一,当追随者超时后无法联系领导者时。第二,当领导者意识到它没有法定人数支持并且领导者在尝试提交提案时意识到这一点。

    回到你的场景。当 {C,D,E} 中的一个节点意识到领导者不在时,它会触发选举。一旦选出了新的领导者,它就会开始正常地服务客户端请求。另一个分区集群 {A,B} 不会为任何客户端请求提供服务,并且将陷入选举,直到分区解决。解决后,将举行一次最终选举,整个集群现在再次正常运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-18
      • 2017-04-11
      • 2019-02-22
      • 1970-01-01
      • 2015-11-24
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多