Zookeeper 的 ZAB 协议

Zookeeper 的 ZAB 协议


目录

  1. ZAB 协议
  2. ZAB 协议介绍

1. ZAB 协议

ZAB 协议并不像 Paxos 算法那样,是一种通用的分布式一致性算法,它是一种特别为 Zookeeper 设计的崩溃可恢复的原子广播算法。

在 Zookeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,Zookeeper 实现一种主备模式的系统架构来保持集群中各副本之间数据的一致性。具体的,Zookeeper 使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用 ZAB 是原子广播协议,将服务器数据的状态变更以事务 Proposal 的形式广播到所有的副本进程上去。ZAB 协议的这个主备模型架构保证了同一时刻集群中只能够有一个主进程来广播服务器的状态变更,因此能够很好地处理客户端大量的并发请求。另一方面,顺序执行的一些状态变更其前后会存在一定的依赖关系,ZAB 协议必须能够保证一个全局的变更序列被顺序应用,也就是说,ZAB 协议需要保证一个状态变更已经被处理了,那么其所依赖的状态变更应该已经提前处理掉了。最后,考虑到主进程在任何时候都有可能出现崩溃退出或重启现象,因此,ZAB 协议还需要做到在当前主进程出现上述异常情况的时候,依然能够正常工作。

ZAB 协议的核心是定义了对于那些会改变 Zookeeper 服务器数据状态的事务请求的处理方式,即:
所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为 Leader 服务器,而余下的其他服务器则成为 Follower 服务器。Leader 服务器负责将一个客户端事务请求转换成一个事务 Proposal(提议),并将该 Proposal 分发给集群中所有的 Follower 服务器。之后 Leader 服务器需要等待所有 Follower 服务器的反馈,一旦超过半数的 Follower 服务器进行了正确的反馈后,Leader 就会再次向所有的 Follower 服务器分发 Commit 消息,要求其将前一个 Proposal 进行提交。


2. ZAB 协议介绍

ZAB 协议包括两种基本模式,分别是崩溃恢复和消息广播。当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进入恢复模式并选举产生新的 Leader 服务器。当选举产生新的 Leader 服务器,同时集群中已经有过半的机器与该 Leader 服务器完成了状态同步之后,ZAB 协议就会退出恢复模式。其中,所谓的状态同步是指数据同步,用来保证集群中存在过半的机器能够和 Leader 服务器的数据状态保持一致。

当集群中已经有过半的 Follower 服务器完成了和 Leader 服务器状态同步,那么整个服务框架就可以进入消息广播模式了。当一台同样遵循 ZAB 协议的服务器启动后加入到集群中,如果此时集群中已经有一个 Leader 服务器在负责进行消息广播,那么新加入的服务器就会自觉进入数据恢复模式:找到 Leader 所在的服务器,并与其进行数据同步,然后一起参加到消息广播流程中去。 Zookeeper 设计成只允许唯一的一个 Leader 服务器来进行事务请求的处理。Leader 服务器在接收到客户端的事务请求后,会生成对应的事务请提案并发起一轮广播协议;而如果集群中的其他机器接收到客户端的事务请求,那么这些非 Leader 服务器首先将这个事务请求转发给 Leader 服务器。

当 Leader 服务器出现崩溃退出或机器重启,亦或是集群中已经不存在过半的服务器与该 Leader 服务器保持正常通信时,那么在重新开始新一轮的原子广播事务操作之前,所有进程首先会使用崩溃恢复协议来使彼此达到一个一致的状态,于是整个 ZAB 流程就会从消息广播模式进入到崩溃恢复模式。

一个机器要成为新的 Leader,必须获得过半进程的支持,同时由于每个进程都有会崩溃,因此 ZAB 协议运行过程中,前后出现多个 Leader,并且每个进程也有可能会多次成为 Leader。进入崩溃恢复模式后,只要集群中存在过半的服务器能够彼此进行正常通信,那么就可以产生一个新的 Leader 并在此进入消息广播模式。举个例子来说,一个由 3 台机器组成的 ZAB 服务,通常由 1 个 Leader,2个 Follower 服务器组成。某一个时刻,假如其中一个 Follower 服务器挂了,整个 ZAB 机器是不会中断服务的,这是因为 Leader 服务器依然能够获得过半机器(包括 Leader 自己)的支持。

接下来重点介绍 ZAB 协议的消息广播和崩溃恢复过程。


消息广播

ZAB 协议的消息广播过程使用的是一个原子广播协议,类似于一个二阶段提交过程。针对客户端的事务请求,Leader 服务器会为其生产对应的事务 Proposal,并将其发送给集群中其余的机器,然后再分别收集各自的选票,最后进行事务提交,如下图就是 ZAB 协议消息广播流程的示意图。
Zookeeper 的 ZAB 协议