1 前言
相对于paxos的通用性,zab是专用于zookeeper。Zookeeper原子消息广播协议,实现一种主备模式框架下来保持各集群中各副本之间的数据一致性。
这里的主备系统架构模型,就是指只有一台客户端(Leader)负责处理外部的写事务请求,然后Leader客户端将数据同步到其他Follower节点。
Zookeeper 客户端会随机的链接到 zookeeper 集群中的一个节点,如果是读请求,就直接从当前节点中读取数据;如果是写请求,那么节点就会向 Leader 提交事务,Leader 接收到事务提交,会广播该事务,只要超过半数节点写入成功,该事务就会被提交。
2 ZAB协议实现过程
2.1 消息广播
1.消息(Proposal和Zxid)
Leader服务器将每个事务请求生成对应的Proposal,并为这个Proposal分配一个全局单调递增的唯一ID(ZXID,64位,前32位是周期epoch,后32位是单调递增的计数器)。
2.广播过程
leader和follower之间都一个队列,leader将消息发送到该队列,将Proposal广播给所有的follower服务器,follower服务器以事务日志的形式写入磁盘,成功写入后反馈给leader一个ACK响应;
当Leader服务器接收到超过半数的ACK响应后,开始广播commit消息,同时Leader服务器自身完成对事务的提交,每一个follower服务器接受到commit消息后也完成对事务的提交。
2.2 崩溃恢复
当Leader服务器出现故障后,就会进入崩溃恢复模式,崩溃恢复要求:
1.确保已经被leader提交的proposal必须最终被所有的follower服务器提交;
2.确保丢弃已经被leader提出的但是没有被提交的proposal。
优先选择出拥有最大ZXID的Proposal的服务器作为Leader,以满足上述要求,之后进行数据同步。
2.3 数据同步
Leader会将自身的提交的最大Proposal的事务Zxid发送给其他的follower节点。
follower节点会根据leader的消息进行回退或者数据同步操作。最终的目的是要保证集群中所有节点的数据副本保持一致。
3 ZAB协议原理
ZAB协议要求每个Leader都要经历三个阶段,发现,同步,广播。
(1)发现:即要求zookeeper集群必须选择出一个leader进程,同时leader会维护一个follower可用列表,将来客户端可以与可用列表中的节点进行通信。
(2)同步:leader要负责将本身的数据与follower完成同步,做到多副本存储。这也是体现了CAP中的高可用和分区容错。follower将队列中未处理完的请求消费完成后,写入本地事务日志中。
(3)广播:leader可以接收客户端新的Proposal请求,将新的Proposal请求广播给所有的follower。