Zookeeper 使用 Zookeeper Atomic Broadcast (ZAB) 协议来保障分布式数据一致性。html
ZAB是一种支持崩溃恢复的消息广播协议,采用相似2PC的广播模式保证正常运行时性能,并使用基于 Paxos 的策略保证崩溃恢复时的一致性。算法
在阅读本文前建议先了解2PC和Paxos服务器
ZAB协议中节点存在四种状态:网络
由于 Observing 节点不参与事务和选举,所以下文所述节点不包括 Observing 节点分布式
ZAB协议存在两种工做模式:性能
Zookeeper 集群中每一个节点都会存储系统数据的完整副本,能够独立处理读请求。atom
当 Follower 收到写请求时会将其转发给 Leader, Leader 为每一个写请求分配惟一的全局有序的事务ID(Zookeeper Transaction Id, ZXID)。日志
Leader 在广播模式下协调各 Follower 完成事务,并保证集群更新到一致的状态。htm
一致性保证blog
ZAB协议保证集群的顺序一致性而不保证强一致性。
即 Leader 依次完成两个事务 A、B 时,不能保证全部 Follower 当即更新到最新状态(不保证强一致性); 只保证全部 Follower 必定时间内会同步到最新状态(保证最终一致性),且任意 Follower 都认为事务A先于事务B完成,不会乱序(保证全局顺序一致性)。
此外,ZAB协议保证来自同一个 Follower 的两个事务 A、B 按照 Follower 发出请求的顺序(而非 Leader 收到请求的顺序)依次执行,不会出现乱序。即保证任意客户端写请求的一致性。
ZXID
ZXID 是 Zookeeper 集群中事务的惟一标识,保证全局有序。
ZXID 是一个 64 位整数, 高32位为周期号(epoch), 每一个 Leader 被选举后都会增长 epoch 与上任 Leader 区分。低32位是 Leader 开始事务时分配的递增编号。
ZXID 中的 epoch 能够保证 Leader 崩溃从新选举后被丢弃的事务不会继续执行。
广播模式是一个移除了中断逻辑的2PC协议:
ZAB广播模式相对于完整的2PC移除了中断逻辑, 且只要过半 Follower 完成便可不须要等待所有 Follower。
崩溃或网络超时的 Follower 能够直接抛弃 Leader,并在数据同步阶段与集群达成一致,这种作法提升了集群的性能。
由于没法保证全部 Follower 都完成了提交,因此 Zookeeper 没法保证强一致性。
Leader 为每一个 Follower 的写请求维护了一个 FIFO 队列以保证顺序一致性,具体实现方式是根据 TCP 报文的序列号肯定请求的前后顺序。
当集群启动或者Leader崩溃时,Zookeeper 集群会进入恢复模式选举新的 Leader 并将集群同步至最新状态。
Leader 与过半的 Follower 没法正常通讯即视为崩溃
在崩溃恢复过程当中须要保证:
若 Leader 在 commit 阶段崩溃,根据已完成的事务不能丢失的原则,这些事务应该继续完成。
由于集群中 ZXID 最大的提案是 Leader 崩溃前发出的最新的提案,因此应选择拥有 ZXID 最大的提案的节点作为新的 Leader。
新 Leader 会将自身日志中全部未提交事务从新生成提案并协调集群将其完成, 保证全部被发送的消息(delivered messages)都被处理。
若 Leader 在 proposal 阶段崩溃,根据未执行的事务不能继续的原则,节点应当丢弃这些事务。
当新 Leader 被选举以后会增长 ZXID 的 epoch 值,所以 epoch 值较小的提案能够直接丢弃。
恢复模式分为两个阶段:选举阶段和恢复阶段。
上文已经说明恢复阶段的任务是 Leader 将未提交事务从新生成提案并协调集群将其完成,再也不赘述。
选举过程
选举要保证:
在3.4.0后的Zookeeper的版本只保留了TCP版本的FastLeaderElection选举算法
每张选票包含3条信息:
发起选举的节点会向全部可通讯节点发送第一张选票,推举本身做为 Leader。
收到选票的服务器根据下列规则决定本身的投票:
若在某轮投票中某个节点收到过半数的相同选票,那么认为该服务器为新的 Leader 投票结束。
由于选举阶段要求服务器收到过半选票才能成为新 Leader, 所以不可能出现集群中存在两个 Leader 的现象。
选举过程是比较典型的 Paxos 算法过程,选举过程当中不会产生新的 ZXID, 所以不会出现 Paxos 算法中活锁的现象。
关于ZAB协议的详细内容能够阅读官方论文ZooKeeper’s atomic broadcast protocol: Theory and practice。