ZAB协议与选举 - Zookeeper 面试题及答案
2025/12/19大约 4 分钟
返回Zookeeper 面试题索引 第 2/3 章
5.那你继续给我讲讲 ZAB 协议吧
ZAB(ZooKeeper Atomic Broadcast 原子广播) 协议是为 ZooKeeper 特殊设计的一种支持崩溃恢复的原子广播协议。在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。
ZAB 协议包括有两种模式,分别是 崩溃恢复和消息广播。
- 崩溃恢复:当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进人恢复模式并选举产生新的 Leader 服务器。当选举产生了新的 Leader 服务器,同时集群中已经有过半的机器与该 Leader 服务器完成了状态同步之后,ZAB 协议就会退出恢复模式。剩下未同步完成的机器会继续同步,直到同步完成并加入集群后该节点的服务才可用。
- 消息广播:当集群中已经有过半的 Follower 服务器完成了和 Leader 服务器的状态同步,那么整个服务框架就可以进人消息广播模式了。当一台同样遵守 ZAB 协议的服务器启动后加人到集群中时,如果此时集群中已经存在一个 Leader 服务器在负责进行消息广播,那么新加人的服务器就会自觉地进人数据恢复模式:找到 Leader 所在的服务器,并与其进行数据同步,然后一起参与到消息广播流程中去。ZooKeeper 设计成只允许唯一的一个 Leader 服务器来进行事务请求的处理。Leader 服务器在接收到客户端的事务请求后,会生成对应的事务提案并发起一轮广播协议;而如果集群中的其他机器接收到客户端的事务请求,那么这些非 Leader 服务器会首先将这个事务请求转发给 Leader 服务器。
6.Zookeeper初始化是如何进行Leader选举的?

在集群初始化阶段,只有两台以以上的 ZK 启动才会发生leader选举,过程如下:
- (1) 每个 Server 发出一个投票。初始选举 ZK1 和 ZK2 都会将自己作为 Leader 服务器来进行投票,每次投票会包含所推举的服务器的(myid, ZXID),此时 ZK1 的投票为(1, 0),ZK2 的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
- (2) 收到投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自 LOOKING 状态的服务器。
- (3) 处理投票。每个发起投票的服务器需要将别人的投票和自己的投票进行比较,规则如下:
- 优先检查 ZXID。ZXID 比较大的服务器优先作为 Leader。如果 ZXID 相同,那么就比较 myid。myid 较大的服务器作为Leader服务器。
- (4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于 ZK1、ZK2 而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出 ZK2 作为Leader。
- (5) 改变服务器状态。一旦确定了 Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为 FOLLOWING,如果是 Leader,就变更为 LEADING。当新的 Zookeeper 节点 ZK3 启动时,发现已经有 Leader 了,不再选举,直接将直接的状态从 LOOKING 改为 FOLLOWING。
7.如果Leader挂了,进入崩溃恢复,怎么选举Leader?

- 1.变更状态。Leader 挂后,余下的非 Observer 服务器都会讲自己的服务器状态变更为 LOOKING,然后开始进入 Leader 选举过程。
- 2.每个非 Observer 的 Server 会发出一个投票。和启动过程一致。
- 3.接收来自各个服务器的投票。与启动时过程相同。
- 4.处理投票。与启动时过程相同。
- 5.统计投票。与启动时过程相同。
- 6.改变服务器的状态。与启动时过程相同。
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。
