使用 Zookeeper 进行 Java 领导者选举

标签 java apache-zookeeper leader-election

我读到了有关使用 Zookeeper 实现 Java 领导者选举的内容。我很清楚所描述的算法here 。但我有一个关于算法的微妙问题要问。

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

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

最佳答案

当任何节点在/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 会收到此事件的通知,并且可以充当新的领导者。

希望这能回答您的问题。

关于使用 Zookeeper 进行 Java 领导者选举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59151089/

相关文章:

kubernetes - 领导者选举失败,租约无法自动续签

java - 为什么我可以在不以任何方式指定其类型且无法推断类型的情况下创建通用对象?

java - 在 Java 中管理源文件和类文件

java - 如何控制 Vaadin 表的列宽?

apache-kafka - 使用 SSL 的 Kafka SASL/PLAIN 设置

cluster-computing - 为什么建议创建节点数为奇数的集群

java - Cron 作业电子邮件警报的内容格式

redis - Zookeeper vs 内存数据网格 vs Redis

java - Zookeeper - 跟随领导者时出现异常 java.lang.IllegalArgumentException