深入浅出Zookeepr的ZAB协议

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 深入浅出Zookeepr的ZAB协议

概述


ZAB全称Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。其借鉴了 Paxos 算法,是特别为 Zookeeper 设计的支持崩溃恢复的原子广播协议。基于该协议,Zookeeper 设计为只有一台客户端(Leader)负责处理外部的写事务请求,然后Leader 客户端将数据同步到其他 Follower 节点。即 Zookeeper 只有一个 Leader 可以发起提案,解决了Paxos算法中可能出现活锁的情况。


ZAB协议详解


ZAB协助主要作用于Zookeeper的两种模式:消息广播和崩溃恢复。


消息广播


消息广播指的是Zookpeeper客户端发起写请求,Zookeeper的Leader需要把消息广播到集群中的每个结点中的过程。在这个过程中,需要保证消息的顺序一致性。

顺序一致性: Zookeper的请求必须保持全局有序,举个例子来理解,Zookeeper是一个树形结构,很多操作都要先检查才能确定是否可以执行,比如P1的事务t1可能是创建节点"/a",t2可能是创建节点"/a/bb",只有先创建了父节点"/a",才能创建子节点"/a/b"。

1671160423790.jpg

整个消息广播类似于一个两阶段提交的过程:

  1. 广播事务阶段
  2. 广播提交阶段

具体流程如下:

  1. 客户端发起写请求
  2. Leader服务器将客户端的请求转化为事务Proposal提案,同时为每个Proposal分配一个全局递增的ID, 即zxid。
  3. Leader服务器为每个Follower服务器分配一个单独的队列,然后将需要广播的 Proposal依次放到队列中去,并且根据FIFO策略进行消息发送,保证消息的顺序一致性。
  4. Follower接收到Proposal后,会首先将其以事务日志的方式写入本地磁盘中,写入成功后向Leader反馈一个Ack响应消息。
  5. Leader接收到超过半数以上Follower的Ack响应消息后,包括Leader节点自己,即认为消息发送成功,可以发送commit消息。
  6. Leader向所有Follower广播commit消息,同时自身也会完成事务提交。Follower 接收到commit消息后,会将上一条事务提交。

Zookeeper采用Zab协议的核心,就是只要有一台服务器提交了Proposal,就要确保所有的服务器最终都能正确提交Proposal。


崩溃恢复


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

崩溃恢复主要包括两部分:Leader选举数据恢复

Leader选举阶段

Zab协议需要保证选举出来的Leader需要满足以下条件:

  1. 新选举出来的Leader不能包含未提交的Proposal。即新Leader必须都是已经提交了Proposal的Follower服务器节点。
  2. 新选举的Leader节点中含有最大的zxid。这样做的好处是可以避免Leader服务器检查Proposal的提交和丢弃工作。

数据恢复阶段

  1. 完成Leader选举后,在正式开始工作之前(接收事务请求,然后提出新的Proposal),Leader服务器会首先确认事务日志中的所有的Proposal 是否已经被集群中过半的服务器Commit。
  2. Leader服务器需要确保所有的Follower服务器能够接收到每一条事务的Proposal,并且能将所有已经提交的事务Proposal应用到内存数据中。等到Follower将所有尚未同步的事务Proposal都从Leader服务器上同步过,并且应用到内存数据中以后,Leader才会把该Follower加入到真正可用的Follower列表中。

由于Leader崩溃,会导致之前的数据提交出现异常,见下图:

1671160432882.jpg

  1. 假如一个事务在Leader发起提案后,发送给Follower之后,挂了,该如何处理?

答: 会丢弃处理

  1. 加入一个事务在Leader发起提案后,得到过半Follower的应答,同时部分commit给Follower后崩溃,该怎么呢?

答: 会提交事务

针对这些问题,ZAB 定义了 2 个原则:

  • ZAB 协议确保那些已经在 Leader 提交的事务最终会被所有服务器提交。
  • ZAB 协议确保丢弃那些只在 Leader 提出/复制,但没有提交的事务。

一句话总结:能够确保提交已经被 Leader 提交的事务,同时丢弃已经被跳过的事务。

这也是为什么Leader选举的时候选举zxid最大的Follower。


总结


我们学习了上面的内容以后,同时有两个问题抛给大家。

  1. Zookeeper 到底是不是强一致性?

不保证强一致性,但是保证顺序一致性。因为 Leader 再发送 commit 消息给所有 Follower 和 Observer 后,它们并不是同时完成 commit 的。比如因为网络原因,不同节点收到的 commit 较晚,那么提交的时间也较晚,就会出现多个节点的数据不一致,但是经过短暂的时间后,所有节点都 commit 后,数据就保持同步了。

另外 Zookeeper 支持强一致性,就是手动调用 sync 方法来保证所有节点都 commit 才算成功。

  1. ZAB 的顺序一致性怎么做到的?
  • 只有Leader节点接受事务请求,进行消息广播
  • Leader 发送 proposal 时,其实会为每个 Follower 创建一个队列,都往各自的队列中发送 proposal。Leader 收到请求后,依次放到队列中,然后 Follower 依次从队列中获取请求,这样就保证了数据的顺序性。
相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
9月前
|
存储 算法 前端开发
作者推荐 | 分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种Paxos协议)
作者推荐 | 分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种Paxos协议)
610 0
|
算法 Java 开发者
Zab 协议如何保持数据的一致性 | 学习笔记
快速学习 Zab 协议如何保持数据的一致性
217 0
Zab 协议如何保持数据的一致性 | 学习笔记
|
存储 算法 架构师
【架构师指南】带你彻底认识 Paxos 算法、Zab 协议和 Raft 协议的原理和本质
【架构师指南】带你彻底认识 Paxos 算法、Zab 协议和 Raft 协议的原理和本质
1801 0
【架构师指南】带你彻底认识 Paxos 算法、Zab 协议和 Raft 协议的原理和本质
|
算法
分布式学习十:ZAB协议
分布式学习十:ZAB协议
118 0
分布式学习十:ZAB协议
|
算法 Java 开发者
简单回顾 Zab 协议集群模式原理|学习笔记
快速学习简单回顾 Zab 协议集群模式原理
162 0
简单回顾 Zab 协议集群模式原理|学习笔记
|
Java Nacos 开发者
Raft 协议选举底层实现原理 | 学习笔记
快速学习 Raft 协议选举底层实现原理
137 0
Raft 协议选举底层实现原理 | 学习笔记
|
算法 Java 开发者
Raft 协议选举基本的概念 | 学习笔记
快速学习 Raft 协议选举基本的概念
143 0
|
消息中间件 存储 负载均衡
一篇文章讲透彻了AMQP协议
一篇文章讲透彻了AMQP协议
5273 0
一篇文章讲透彻了AMQP协议
|
算法 安全 索引
Raft 协议原理详解,10 分钟带你掌握!
Raft 是一种更为简单方便易于理解的分布式算法,主要解决了分布式中的一致性问题。相比传统的 Paxos 算法,Raft 将大量的计算问题分解成为了一些简单的相对独立的子问题,并有着和 Multi-Paxos 同样的性能,下面我们通过动图,以后还原 Raft 内部原理。
2439 0
Raft 协议原理详解,10 分钟带你掌握!