公众号:架构师与哈苏
关注公众号进入it交流群! 公众号:架构师与哈苏 不定时都会推送一些实用的干货。。。

ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持奔溃恢复的原子广播协议,实现分布式数据一致性

所有客户端的请求都是写入到Leader进程中,然后由Leader同步到其他节点,称为Follower。在集群数据同步的过程中,如果出现Follower节点奔溃或者Leader进程奔溃时,都会通过ZAB协议来保证数据一致性

ZAB协议包括两种基本的模式:奔溃恢复和消息广播

消息广播

集群中所有的事务请求都由Leader节点来处理,其他服务器为Follower,Leader将客户端的事务请求转换为事务Proposal,并且将Proposal分发给集群中其他所有的Follower。

完成广播之后,Leader等待Follwer反馈,当有过半数的Follower反馈信息后,Leader将再次向集群内Follower广播Commit信息,Commit信息就是确认将之前的Proposal提交。

Leader节点的写入是一个两步操作,第一步是广播事务操作,第二步是广播提交操作,其中过半数指的是反馈的节点数 >=N/2+1,N是全部的Follower节点数量。

奔溃恢复

  • 初始化集群,刚刚启动的时候
  • Leader奔溃,因为故障宕机
  • Leader失去了半数的机器支持,与集群中超过一半的节点断连

此时开启新一轮Leader选举,选举产生的Leader会与过半的Follower进行同步,使数据一致,当与过半的机器同步完成后,就退出恢复模式,然后进入消息广播模式

整个Zookeeper集群的一致性保证就是在上面两个状态之前切换,当Leader服务正常时,就是正常的消息广播模式;当Leader不可用时,则进入崩溃恢复模式,崩溃恢复阶段会进行数据同步,完成以后,重新进入消息广播阶段。

Zxid

Zxid 是 Zab 协议的一个事务编号,Zxid 是一个 64 位的数字,其中低 32 位是一个简单的单调递增计数
器,针对客户端每一个事务请求,计数器加 1;而高 32 位则代表 Leader 周期年代的编号。
Leader 周期( epoch),可以理解为当前集群所处的年代或者周期,每当有一个新的 Leader 选举出
现时,就会从这个 Leader 服务器上取出其本地日志中最大事务的 Zxid,并从中读取 epoch 值,然后
加 1,以此作为新的周期 ID。高 32 位代表了每代 Leader 的唯一性,低 32 位则代表了每代 Leader 中
事务的唯一性。

zab节点的三种状态:

  • following:服从leader的命令
  • leading:负责协调事务
  • election/looking:选举状态
posted on 2021-11-05 16:33  公众号/架构师与哈苏  阅读(132)  评论(0编辑  收藏  举报