繁体   English   中英

使用 Zookeeper 的 Java 领导者选举

[英]Java leader election using Zookeeper

我阅读了使用 Zookeeper 的 Java 领导者选举实现。 我很清楚这里描述的算法。 但我有一个关于算法的微妙问题。

在解释的算法中,节点选择“/选举”节点的所有子节点,并选择最小的节点作为领导者。

在那种情况下,他们如何决定哪些节点在,哪些不在。我想知道的是什么条件决定阻止迟到的节点创建其子节点并参与领导者选举。 是超时吗? 如果是,如何以及在何处计算?

当任何节点在 /election 下创建一个连续的临时节点来尝试担任领导时,Zookeeper 会自动为该连续的临时节点分配序列号。 服务器如何知道它可以担任领导职务? 它可以发出 getChildren 来获取 /election 的子节点,并判断它刚刚创建的 znode 是否具有最小的序列号。 如果是,则它可以承担领导责任。 如果不是,则它会为具有最大序列号且小于其 znode 序列号的 znode 设置监视。

例如,三台服务器 A、B 和 C 尝试通过创建临时 znode guid-n_X 来获得领导权,其中 X 是 Zookeeper 分配的序列号。 假设 B 首先创建它并创建一个 znode /election/guid-n_0,然后是 C (/election/guid-n_1) 和 A (/election/guid-n_2)。 服务器 B 在成功创建后知道它拥有序列号最小的 znode,并调用 getChildren 获取子节点列表。 另外两台服务器也执行相同的程序来知道他们不是领导者。 然而,他们只在前一个 znode 上设置了一个监视,因此它可以防止羊群效应,并且他们还可以知道旧的领导者何时死了,他们应该承担领导权。 因此,在这种情况下,服务器 C 在 /election/guid-n_0 上设置监视,服务器 A 在 /election/guid-n_1 上设置监视。 当 B 死亡时,它停止向 Zookeeper 发送心跳,并且它的临时 znode 被删除。 然后服务器 C 收到此事件的通知,它可以充当新的领导者。

希望这能回答你的问题。

他们如何决定哪些节点在,哪些不在?

任何在/election 下创建了子znode 的服务器节点都可以成为leader,而防止服务器节点被选举为leader 的唯一方法是不要为该服务器节点创建子znode。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM