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

How does Zookeeper manage node roles in other clusters?

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

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

如果我们没有 Zookeeper

应用程序服务器可能不知道我们有一个新的主节点,所以他们不知道将写入发送到哪里,除非我们在应用程序服务器本身上有一些自定义逻辑来检测/更正此问题。

如果我们有 Zookeeper

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


我的问题是:

  1. Zookeper 如何知道要让哪个节点成为主节点? Zookeper 负责这个选择吗?
  2. 这些信息如何传播到需要与 Zookeeper 交互的节点?例如。如果 Zookeeper 节点之一 出现故障,在这种情况下,应用程序服务器如何知道要攻击哪个 Zookeeper 节点? Zookeeper 的管理方式是否与竞争解决方案不同,例如etcd?

1. 和 2. 的答案都称为 leader election process,其工作原理如下:

当进程在 ZK 管理的集群中启动时,集群进入 election 状态。如果有一个领导者,那么就存在一个已建立的层次结构,并且现有的领导者只是被验证。如果没有领导者(比如 master 宕机),ZK 会强制 znode 使用序列标志来寻找新的领导者。每个节点与其对等节点通信并发送包含节点标识符 (sid) 和它执行的最新事务 (zxid) 的消息。这些消息称为 votes。当节点收到投票时,它可以忽略它或保留它,具体取决于 zxid。如果 zxid 较新,则保留投票,如果比它拥有的旧,则将其丢弃。如果 zxids 相同,则 sid 最高的投票获胜!所以总有一天所有节点都会有相同的投票,这将由 sid 定义新的领导者。这就是ZK选出新Leader节点的方式!