我了解了使用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之后,服务器B知道其具有最小序列号的znode,并调用getChildren获取子节点列表。其他两台服务器也执行相同的过程以知道它们不是引导者。但是,他们只在前一个znode上设置了一只手表,这样就可以防止羊群效应,并且他们还可以知道旧领导人何时去世,应该承担领导职责。因此,在这种情况下,服务器C在/ election / guid-n_0上设置了监视,服务器A在/ election / guid-n_1上设置了监视。当B死时,它停止向Zookeeper发送心跳,并且其临时znode被删除。然后,服务器C收到此事件的通知,它可以充当新领导者。
希望这能回答您的问题。
关于java - 使用Zookeeper进行Java领导者选举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59151089/