首页 > 其他分享 >什么是Zab协议

什么是Zab协议

时间:2022-10-22 11:36:24浏览次数:82  
标签:协议 事务 Learner 什么 Zab Follower 服务器 Proposal Leader

什么是Zab协议

ZAB协议,全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。它是专门为​​分布式​​协调服务——Zookeeper,设计的一种支持崩溃恢复和原子广播的协议。

从设计上看,ZAB协议和 Raft 很类似。ZooKeeper集群中,只有一个Leader节点,其余均为Follower节点。

什么是Zab协议_服务器

整个ZAB协议一共定义了三个阶段:

  • 发现:要求zookeeper集群必须选举出一个 Leader 进程,同时 Leader 会维护一个 Follower 可用客户端列表。将来客户端可以和这些 Follower节点进行通信。
  • 同步:Leader 要负责将本身的数据与 Follower 完成同步,做到多副本存储。这样也是提现了CAP中的高可用和分区容错。Follower将队列中未处理完的请求消费完成后,写入本地事务日志中
  • 广播:Leader 可以接受客户端新的事务Proposal请求,将新的Proposal请求广播给所有的 Follower。

三个阶段执行完为一个周期,在Zookeeper集群的整个生命周期中,这三个阶段会不断进行,如果Leader崩溃或因其它原因导致Leader缺失,ZAB协议会再次进入阶段一。

Zab协议核心

Zab协议的核心:定义了事务请求的处理方式

  1. 所有的事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被叫做 Leader服务器。其他剩余的服务器则是 Follower服务器。
  2. Leader服务器 负责将一个客户端事务请求,转换成一个 事务Proposal,并将该 Proposal 分发给集群中所有的 Follower 服务器,也就是向所有 Follower 节点发送数据广播请求(或数据复制)
  3. 分发之后Leader服务器需要等待所有Follower服务器的反馈(Ack请求),在Zab协议中,只要超过半数的Follower服务器进行了正确的反馈后(也就是收到半数以上的Follower的Ack请求),那么 Leader 就会再次向所有的 Follower服务器发送 Commit 消息,要求其将上一个 事务proposal 进行提交。

什么是Zab协议_客户端_02

Zab协议内容

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

崩溃恢复

一旦 Leader 服务器出现崩溃或者由于网络原因导致 Leader 服务器失去了与过半 Follower 的联系,那么就会进入崩溃恢复模式。

前面我们说过,崩溃恢复具有两个阶段:Leader 选举与初始化同步。当完成 Leader 选 举后,此时的 Leader 还是一个准 Leader,其要经过初始化同步后才能变为真正的 Leader。

初始化同步

什么是Zab协议_zookeeper_03

具体过程如下:

  1. 为了保证 Leader 向 Learner 发送提案的有序,Leader 会为每一个 Learner 服务器准备一 个队列;
  2. Leader 将那些没有被各个 Learner 同步的事务封装为 Proposal;
  3. Leader 将这些 Proposal 逐条发给各个 Learner,并在每一个 Proposal 后都紧跟一个 COMMIT 消息,表示该事务已经被提交,Learner 可以直接接收并执行
  4. Learner 接收来自于 Leader 的 Proposal,并将其更新到本地;
  5. 当 Learner 更新成功后,会向准 Leader 发送 ACK 信息;
  6. Leader 服务器在收到来自 Learner 的 ACK 后就会将该 Learner 加入到真正可用的 Follower 列表或 Observer 列表。没有反馈 ACK,或反馈了但 Leader 没有收到的 Learner,Leader 不会将其加入到相应列表。

恢复模式的两个原则

当集群正在启动过程中,或 Leader 与超过半数的主机断连后,集群就进入了恢复模式。 对于要恢复的数据状态需要遵循两个原则。

1. 已被处理过的消息不能丢

当 Leader 收到超过半数 Follower 的 ACKs 后,就向各个 Follower 广播 COMMIT 消息, 批准各个 Server 执行该写操作事务。当各个 Server 在接收到 Leader 的 COMMIT 消息后就会在本地执行该写操作,然后会向客户端响应写操作成功。

但是如果在非全部 Follower 收到 COMMIT 消息之前 Leader 就挂了,这将导致一种后 果:部分 Server 已经执行了该事务,而部分 Server 尚未收到 COMMIT 消息,所以其并没有 执行该事务。当新的 Leader 被选举出,集群经过恢复模式后需要保证所有 Server 上都执行 了那些已经被部分 Server 执行过的事务。

2. 被丢弃的消息不能再现

当在 Leader 新事务已经通过,其已经将该事务更新到了本地,但所有 Follower 还都没 有收到 COMMIT 之前,Leader 宕机了(比前面叙述的宕机更早),此时,所有 Follower 根本 就不知道该 Proposal 的存在。当新的 Leader 选举出来,整个集群进入正常服务状态后,之 前挂了的 Leader 主机重新启动并注册成为了 Follower。若那个别人根本不知道的 Proposal 还保留在那个主机,那么其数据就会比其它主机多出了内容,导致整个系统状态的不一致。 所以,该 Proposa 应该被丢弃。类似这样应该被丢弃的事务,是不能再次出现在集群中的, 应该被清除。

消息广播

当集群中的 Learner 完成了初始化状态同步,那么整个 zk 集群就进入到了正常工作模式 了。

什么是Zab协议_客户端_04

如果集群中的 Learner 节点收到客户端的事务请求,那么这些 Learner 会将请求转发给 Leader 服务器。然后再执行如下的具体过程:

  1. Leader 接收到事务请求后,为事务赋予一个全局唯一的 64 位自增 id,即 zxid,通过 zxid 的大小比较即可实现事务的有序性管理,然后将事务封装为一个 Proposal。
  2. Leader 根据 Follower 列表获取到所有 Follower,然后再将 Proposal 通过这些 Follower 的 队列将提案发送给各个 Follower。
  3. 当 Follower 接收到提案后,会先将提案的 zxid 与本地记录的事务日志中的最大的 zxid 进行比较。若当前提案的 zxid 大于最大 zxid,则将当前提案记录到本地事务日志中,并 向 Leader 返回一个 ACK。
  4. 当 Leader 接收到过半的 ACKs 后,Leader 就会向所有 Follower 的队列发送 COMMIT 消息,向所有 Observer 的队列发送 Proposal。
  5. 当 Follower 收到 COMMIT 消息后,就会将日志中的事务正式更新到本地。当 Observer 收到 Proposal 后,会直接将事务更新到本地。
  6. 无论是 Follower 还是 Observer,在同步完成后都需要向 Leader 发送成功 ACK。

zookeeper的选举和同步其实都依赖于一个点,也就是事务的id(zxid)。如果其中一个server的zxid是最大,说明当前的server处理的事务是最新的,那么这个server可以在leader服务器崩溃的时候,作为下一次的leader进行记录。当新的leader被选举出来的时候,它也是根据zxid来进行同步。因为follower的zxid肯定不如它。

标签:协议,事务,Learner,什么,Zab,Follower,服务器,Proposal,Leader
From: https://blog.51cto.com/u_12617333/5785728

相关文章

  • 传奇开服要准备什么和了解什么?
    首先之前已经分享过,开服服务器是很重要的,起到上传、存储、下载的作用,如果是服务器的配置没有选择够,可能会有掉线、卡顿的情况,那么选择服务器应该考虑到哪些因素呢?1、版本补......
  • 你知道贫血模型和充血模型是什么吗?
    前提Controller层提供接口层,用于让外部三方调用Service层用于做逻辑处理,组装不同业务需要的数据或者操作这些数据,BO是实体数据类也即操作的数据类Repository:数据存储层,比......
  • 什么是闭包?闭包详解
      首先要知道JavaScript是使用垃圾回收的语言,它会每隔一段时间就会释放内存进行闲置资源回收。像函数中的局部变量,函数执行时在内部使用了变量,栈内存会分配空间以保存......
  • 请问Java语言是跨平台的吗?JVM是跨平台的吗?为什么?
    Java语言是跨平台的,JVM是不跨平台的。Java能跨平台正是以JVM不跨平台为代价的。Java的跨平台性由JVM实现,即JVM用于保证java的跨平台的特性。原理分析:JVM是在机器和编译......
  • Docker基础:Docker是什么,为什么这么火
    一、Docker是什么?Docker是一个开源的应用容器引擎,它基于go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发......
  • 关于负数补码为什么原码是按位取反再+1
     8位下,求123和-123的补码。8位补码表示的值为-128-127。[-123]补码=[-01111011]补码=2^8+(-01111011)......
  • implements Serializable
    一开始看ssm代码的时候,看到publicclassAccountimplementsSerializable{这个,不知道这个接口是干嘛的后来去了解了一下,发现...其实没什么卵用,hhhSerializable是......
  • 什么是项目风险管理中的德尔菲法,什么又是所谓的四分点?
    对于德尔菲法大家都知道的差不多,但是往往很多培训课程提到四分位就一句话带过,讲的不明不白地,本文最后就讲一下四分位到底是什么。一、什么是德尔菲法德尔菲法是一种利用询问......
  • 手机浏览器电脑版有什么作用,手机浏览器如何设置成电脑版
    市面上的浏览器由于终端不同,分为手机浏览器和电脑浏览器。手机浏览器和电脑浏览器区别比较大,有的朋友习惯使用电脑浏览器,用不惯手机浏览器。这时候,我们可以将手机浏览器设......
  • SEO和SEM的区别是什么,哪个效果更好一些
    SEO指的是搜索引擎优化,SEM指的是搜索引擎影响,那么SEO和SEM的区别具体是什么?对于初创业的企业来说,哪个更好呢?下面,本文将介绍SEO和SEM的区别,帮助企业和公司网络人员理清这两者......