常青笔记

  • 与兰伯特的 Multi-Paxos 不同,ZAB 不是共识算法,不基于状态机,而是基于主备模式的原子广播协议,最终实现了操作的顺序性。
  • ZAB 是通过“一切以领导者为准”的强领导者模型和严格按照顺序提交日志,来实现操作的顺序性的,这一点和 Raft 是一样的

重要摘要

虽然大家都在提 ZAB 协议,但是在我看来,ZAB 协议和 ZooKeeper 代码耦合在一起,也就是说,你是无法单独使用 ZAB 协议的。

顺序性(基于主备模式的原子广播协议)

MultiPaxos 无法实现操作的顺序性,但 Raft 可以啊,为什么 ZooKeeper 不用 Raft 呢?这个问题其实比较简单,因为 Raft 出来的比较晚,直到 2013 年才正式提出,在 2007 年开发 ZooKeeper 的时候,还没有 Raft 呢。

与兰伯特的 Multi-Paxos 不同,ZAB 不是共识算法,不基于状态机,而是基于主备模式的原子广播协议,最终实现了操作的顺序性。

主备,就是 Master-Slave 模型,一个主节点和多个备份节点,所有副本的数据都以主节点为准,主节点采用二阶段提交,向备份节点同步数据,如果主节点发生故障,数据最完备的节点将当选主节点。而原子广播协议,你可以理解成广播一组消息,消息的顺序是固定的。

为了实现分区容错能力,将数据复制到大多数节点后(也就是如果大多数节点准备好了),领导者就会进入提交执行阶段,通知备份节点执行提交操作。

如何实现操作的顺序性?

  1. ZAB 实现了主备模式,也就是所有的数据都以主节点为准
  2. ZAB 实现了 FIFO 队列,保证消息处理的顺序性
  3. ZAB 还实现了当主节点崩溃后,只有日志最完备的节点才能当选主节点,因为日志最完备的节点包含了所有已经提交的日志,所以这样就能保证提交的日志不会再改变

过程#uncomplete

类比

Raft的类比

类比 Raft 来理解,在 Raft 中:

  1. 所有日志以领导者的为准;
  2. 领导者接收到客户端请求后,会基于请求中的指令,创建日志项,并将日志项缓存在本地,然后按照顺序,复制到其他节点和提交 ;
  3. 在 Raft 中,也是日志最完备的节点才能当选领导者

ZAB 与 Paxos 的关系

ZAB 协议是 Paxos 算法的一种工业实现算法。但两者的设计目标不太一样。ZAB 协议主 要用于构建一个高可用的分布式数据主从系统,即 Follower 是 Leader 的从机,Leader 挂了, 马上就可以选举出一个新的 Leader,但平时它们都对外提供服务。而 Fast Paxos 算法则是用 于构建一个分布式一致性状态机系统,确保系统中各个节点的状态都是一致的。