Zookeeper如何管理其他群集中的节点角色?

时间:2020-06-15 16:13:18

标签: configuration apache-zookeeper distributed-computing

我的理解是Zookeeper通常用于解决分布式系统(例如,数据库或MapReduce集群中的主节点)“跟踪哪个节点扮演特定角色”的问题。等)。

为简单起见,假设我们有一个具有一个主数据库和多个副本的数据库,并且数据库中的当前主节点出现故障。在这种情况下,原则上将使副本节点之一成为新的主节点。至此,我的理解是:

如果我们没有Zookeeper

应用程序服务器可能不知道我们有一个新的主节点,因此除非我们在应用程序服务器上具有一些自定义逻辑来检测/纠正此问题,否则它们将不知道将写入内容发送到哪里。

如果我们有Zookeeper

Zookeeper将以某种方式检测此故障,并更新相应主密钥的值。而且,应用程序服务器可以(可选地?)在Zookeeper中注册钩子,因此Zookeeper可以通知它们此失败,以便应用程序服务器可以更新(例如,在内存中)哪个DB节点是新的主节点。


我的问题是:

  1. Zookeper如何知道要成为主节点的节点? Zookeper对此选择负责吗?
  2. 该信息如何传播到需要与Zookeeper交互的节点?例如。如果 Zookeeper节点之一发生故障,应用服务器如何知道在这种情况下要命中哪个Zookeeper节点? Zookeeper与其他竞争解决方案(例如, etcd

1 个答案:

答案 0 :(得分:4)

1和2的答案都称为leader election process,并以以下方式简要起作用:

当进程在由ZK管理的集群中启动时,集群进入election状态。如果存在领导者,则存在已建立的层级,并且仅对现有领导者进行验证。如果没有领导者(例如主服务器已关闭),则ZK强制znodes使用序列标志来寻找新的领导者。每个节点与它的对等方对话,并发送一条消息,其中包含该节点的标识符(sid)和它执行的最新事务(zxid)。这些消息称为votes。节点收到投票后,可以忽略投票,也可以根据zxid保留投票。如果zxid较新,则保留投票权(如果年龄大于其现有投票权),则放弃投票。如果zxids中有平局,则sid最高的投票获胜!因此,所有节点都将具有相同的投票权,这将通过sid定义新的领导者。这就是ZK选举新领导者节点的方式!