我阅读了有关使用 Zookeeper 的 Java 领导者选举实现。我很清楚这里描述的算法。但我有一个关于算法的微妙问题要问。
在解释的算法中,节点选择“/election”节点的所有子节点,并选择最小的节点作为领导者。
在那种情况下,他们如何决定哪些节点在,哪些不在。我想知道的是什么条件决定阻止一个迟到的节点创建其子节点并参与领导者选举。是超时吗?如果是这样,它是如何以及在哪里计算的?
我阅读了有关使用 Zookeeper 的 Java 领导者选举实现。我很清楚这里描述的算法。但我有一个关于算法的微妙问题要问。
在解释的算法中,节点选择“/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 上只设置了一个 watch,因此它可以防止羊群效应,并且他们还可以知道旧领导者何时死亡,他们应该担任领导者。因此,在这种情况下,服务器 C 在 /election/guid-n_0 上设置了监视,而服务器 A 在 /election/guid-n_1 上设置了监视。B死后,它停止向 Zookeeper 发送心跳,并且它的临时 znode 被删除。然后服务器 C 收到此事件的通知,它可以充当新的领导者。
希望这能回答你的问题。
他们如何决定哪些节点在哪些不在?</p>
任何在 /election 下创建子 znode 的服务器节点都可以成为领导者,防止服务器节点参与领导者选举的唯一方法是不要为该服务器节点创建子 znode。