搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
不正经
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
QProgressBar进度条显示文件传输进度_qt中怎么让qprogressbar显示发送文件的大小状态
2
【Python】进阶学习:pandas--query()用法详解
3
Android Studio-3.5.2 下载安装配置环境变量_android studio 3.5.2
4
Android多点触控详解_android 屏四个角同时被点击的判断
5
Matlab实现——巧用灰色关联法完成“系统分析”与“综合评价”_灰色关联分析法这种评价方法的评价标准并不固定,但标准值的选取结果始终是所选对
6
“background-image:url(data:image”data类型的Url格式简介_background-image url http
7
YOLOv8创新改进:SPPF创新涨点篇 | SPPELAN:SPP创新结合ELAN ,效果优于SPP、SPPF| YOLOv9_sppelan的优势
8
Linux文件系统只读Read-only file system的解决方法_read-only file system怎么解决
9
Android画板控件,可以写字,签名,画画并生成图片_android linearlayout生成图片
10
Django缓存详解_django cache.set
当前位置:
article
> 正文
zookeeper中的ZAB协议理解
作者:不正经 | 2024-03-23 17:01:34
赞
踩
zookeeper中的ZAB协议理解
ZAB协议
ZAB协议是专门为zookeeper实现分布式协调功能而设计。zookeeper主要是根据ZAB协议是实现分布式系统数据一致性。
zookeeper根据ZAB协议建立了主备模型完成zookeeper集群中数据的同步。这里所说的主备系统架构模型是指,在zookeeper集群中,只有一台leader负责处理外部客户端的事物请求(或写操作),然后leader服务器将客户端的写操作数据同步到所有的follower节点中。
ZAB的协议核心是在整个zookeeper集群中只有一个节点即Leader将客户端的写操作转化为事物(或提议proposal)。Leader节点再数据写完之后,将向所有的follower节点发送数据广播请求(或数据复制),等待所有的follower节点反馈。在ZAB协议中,只要超过半数follower节点反馈OK,Leader节点就会向所有的follower服务器发送commit消息。即将leader节点上的数据同步到follower节点之上。
ZAB协议中主要有两种模式,第一是消息广播模式;第二是崩溃恢复模式
消息广播模式
在zookeeper集群中数据副本的传递策略就是采用消息广播模式。zookeeper中数据副本的同步方式与二阶段提交相似但是却又不同。二阶段提交的要求协调者必须等到所有的参与者全部反馈ACK确认消息后,再发送commit消息。要求所有的参与者要么全部成功要么全部失败。二阶段提交会产生严重阻塞问题。
ZAB协议中Leader等待follower的ACK反馈是指”只要半数以上的follower成功反馈即可,不需要收到全部follower反馈”
图中展示了消息广播的具体流程图
zookeeper中消息广播的具体步骤如下
:
4.1. 客户端发起一个写操作请求
4.2. Leader服务器将客户端的request请求转化为事物proposql提案,同时为每个proposal分配一个全局唯一的ID,即ZXID。
4.3. leader服务器与每个follower之间都有一个队列,leader将消息发送到该队列
4.4. follower机器从队列中取出消息处理完(写入本地事物日志中)毕后,向leader服务器发送ACK确认。
4.5. leader服务器收到半数以上的follower的ACK后,即认为可以发送commit
4.6. leader向所有的follower服务器发送commit消息。
zookeeper采用ZAB协议的核心就是只要有一台服务器提交了proposal,就要确保所有的服务器最终都能正确提交proposal。这也是CAP/BASE最终实现一致性的一个体现
。
leader服务器与每个follower之间都有一个单独的队列进行收发消息,使用队列消息可以做到异步解耦。leader和follower之间只要往队列中发送了消息即可。如果使用同步方式容易引起阻塞。性能上要下降很多
。
崩溃恢复
zookeeper集群中为保证任何所有进程能够有序的顺序执行,只能是leader服务器接受写请求,即使是follower服务器接受到客户端的请求,也会转发到leader服务器进行处理。
如果leader服务器发生崩溃,则zab协议要求zookeeper集群进行崩溃恢复和leader服务器选举。
ZAB协议崩溃恢复要求满足如下2个要求:
3.1.
确保已经被leader提交的proposal必须最终被所有的follower服务器提交
。
3.2.
确保丢弃已经被leader出的但是没有被提交的proposal
。
根据上述要求,新选举出来的leader不能包含未提交的proposal,即新选举的leader必须都是已经提交了的proposal的follower服务器节点。同时,新选举的leader节点中含有最高的ZXID。这样做的好处就是可以避免了leader服务器检查proposal的提交和丢弃工作。
leader服务器发生崩溃时分为如下场景:
5.1. leader在提出proposal时未提交之前崩溃,则经过崩溃恢复之后,新选举的leader一定不能是刚才的leader。因为这个leader存在未提交的proposal。
5.2 leader在发送commit消息之后,崩溃。即消息已经发送到队列中。经过崩溃恢复之后,参与选举的follower服务器(刚才崩溃的leader有可能已经恢复运行,也属于follower节点范畴)中有的节点已经是消费了队列中所有的commit消息。即该follower节点将会被选举为最新的leader。剩下动作就是数据同步过程。
数据同步
在zookeeper集群中新的leader选举成功之后,leader会将自身的提交的最大proposal的事物ZXID发送给其他的follower节点。follower节点会根据leader的消息进行回退或者是数据同步操作。最终目的要保证集群中所有节点的数据副本保持一致。
数据同步完之后,zookeeper集群如何保证新选举的leader分配的ZXID是全局唯一呢?这个就要从ZXID的设计谈起。
2.1 ZXID是一个长度64位的数字,其中低32位是按照数字递增,即每次客户端发起一个proposal,低32位的数字简单加1。高32位是leader周期的epoch编号,至于这个编号如何产生(我也没有搞明白),每当选举出一个新的leader时,新的leader就从本地事物日志中取出ZXID,然后解析出高32位的epoch编号,进行加1,再将低32位的全部设置为0。这样就保证了每次新选举的leader后,保证了ZXID的唯一性而且是保证递增的。
ZAB协议原理
ZAB协议要求每个leader都要经历三个阶段,即发现,同步,广播。
发现
:即要求zookeeper集群必须选择出一个leader进程,同时leader会维护一个follower可用列表。将来客户端可以这follower中的节点进行通信。
同步
:leader要负责将本身的数据与follower完成同步,做到多副本存储。这样也是体现了CAP中高可用和分区容错。follower将队列中未处理完的请求消费完成后,写入本地事物日志中。
广播
:leader可以接受客户端新的proposal请求,将新的proposal请求广播给所有的follower。
Zookeeper
设计目标
zookeeper作为当今最流行的分布式系统应用协调框架,采用zab协议的最大目标就是建立一个高可用可扩展的分布式数据主备系统。即在任何时刻只要leader发生宕机,都能保证分布式系统数据的可靠性和最终一致性。
深刻理解ZAB协议,才能更好的理解zookeeper对于分布式系统建设的重要性。以及为什么采用zookeeper就能保证分布式系统中数据最终一致性,服务的高可用性。
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
【wpsshop博客】
推荐阅读
article
SpringBoot
整合
Dubbo
+
zookeeper
(注册中心)
配置文件
和注解方式_
dubbo
...
一,基于xml配置整合准备好两个模块,一个product(生产者),一个customer(消费者)1.导入
Dubbo
依赖...
赞
踩
article
dubbo
+
zookeeper
+
springboot
整合
(全)_
springboot
dubbo
z...
dubbo
+
zookeeper
+
springboot
整合
须知理论分布式理论在《分布式系统原理与范型》一书中有如下定义:“...
赞
踩
article
dubbo
+
zookeeper
+springboot_
dubbo
zookeeper
springb...
1_
dubbo
zookeeper
springboot
dubbo
zookeeper
springboot ...
赞
踩
article
zookeeper
注册
中心
升级
nacos
_zk切换
nacos
...
升级背景因项目使用的框架比较老,而且zk作为
注册
中心
其实是有问题的,因为zk不是高可用的(详情请自行百度zk leade...
赞
踩
article
【
Kafka
超时问题(已解决),
kafka
.
zookeeper
.ZooKeeperClientTim...
Kafka
超时问题(已解决),
Timed
out
waiting
for
connection
while in st...
赞
踩
article
分布式
一致性
算法
Paxos
、
Raft
及
Zookeeper
ZAB_raft算法和zookeepe...
分布式
一致性
算法是用于在
分布式
系统中确保数据
一致性
的一类算法。在
分布式
计算环境中,数据通常会分布在多个节点或副本中,并且...
赞
踩
相关标签
zookeeper
spring boot
java
dubbo
分布式
大数据
spring cloud
kafka
云原生
经验分享