深入理解Zookeeper的ZAB协议

news2024/11/29 2:33:25

ZAB是什么

ZAB(Zookeeper Atomic Broadcast):Zookeeper原子广播
ZAB是为了保证Zookeeper数据一致性而产生的算法(指的是Zookeeper集群模式)。它不仅能解决正常情况下的数据一致性问题,还可以保证主节点发生宕机后的数据一致性问题。

Zookeeper集群模式

Zookeeper集群模式为"主从复制"模型,即有一个主节点,其他的都为从节点。主、从节点在数据读写场景下满足以下三条规则:
1. 所有的数据更新操作都只能由主节点完成;
2. 主节点更新完数据后,将副本发送给从节点进行更新;
3. 任何从节点都可进行数据的读操作。

图1 Zookeeper主从复制模型图

由图1可得,Zookeeper有两种节点。
1. 主节点:也称Leader
2. 从节点:也称Follower

Zookeeper启动时选取Leader

讲选举前先讲一下Zookeeper的数据存储结构,对理解下文有前置知识印象。

图2 Zookeeper数据存储结构

由图2可得,Zookeeper的数据存储结构是一棵树,更准确地说:底层使用文件目录格式对数据进行存储,同时Zookeeper将这种存储数据的节点称为Znode。
Znode包含图中所指的四个部分:
1. data:存储数据
2. child:存储所有的子节点引用
3. ACL:存储访问权限(例如哪些IP可以访问该节点)
4. stat:存储元数据(SID、ZXID【epoch+counter】等)

SID、ZXID在选举Leader中起决定性作用,因此我详细解释一下它们是什么!
SID:Zookeeper节点的标识符(节点指的是服务器,不是上面的Znode),相当于数据库表的唯一ID;
ZXID:最新事务标识符,值越大说明数据越新。它由两部分组成:
epoch:指当前leader为第 ${epoch} 任
counter:每交互一条proposal,counter值就会+1(proposal可以理解成更新操作)

图3 初始的Zookeeper节点

由图3可得,初始Zookeeper集群有3个服务节点,选举Leader过程如下:
(Leader选举优先级:epoch>counter>SID)
1. 节点与集群中的各个节点进行拉票操作(此时节点处于Looking状态)
2. 投票以SID值大小为标准,每个节点都会投票给SID最大的那个
3. 当服务节点获得的票数超过集群节点数一半时,Leader产生(Leader节点状态变为Leading、Follower节点状态变为Following)

自此,Leader的选举过程就结束了,后面新加入的节点也只能作为Follower节点,不会再次进行Leader选举,除非Leader出现意外!

Zookeeper故障时选举Leader

上一章了解了启动时Leader的选举过程。那么,当集群中Leader出现问题时,又该如何选举新的Leader呢?

讲选举新的Leader之前,什么时候触发选举?
1. 心跳检测:Leader会周期性的给每个Follower发送心跳机制。同时,Follower在收到Leader心跳检测信息时,会给予Leader一个回复。如果Leader此时收到的恢复少于集群节点的一半,此时则会触发新的Leader选举(为什么是少于一半就会触发?因为成为Leader必须满足赞成票为集群节点的一半以上。少于一半有理由怀疑那些不回应的节点是不是重新拉帮派,然后选举了一个新的Leader)。
2. proposal检测:客户端发出的数据更新操作都会给到Leader去执行,Leader更新数据且写入本地日志后,会发送proposal给Follower(其实就是数据副本,叫Follower节点也更新数据),Follower收到后,会发送ACK给到Leader,表示已经更新副本数据。Leader节点收到ACK报文超过集群节点一半时,会通知Follower将proposal状态改为commit状态;如果收到ACK报文少于集群节点一半,会触发新的Leader选举。

图4为正常情况下的proposal阶段
图5为ACK回复报文少于集群节点一半的proposal阶段

图4 正常的集群proposal阶段

图5 非正常ACK情况下的集群proposal阶段

了解了何时触发新的Leader选举之后,接下来就是如何选举新的Leader过程。
(Leader选举优先级:epoch>counter>SID)
1. 集群中每个节点的epoch都是相同的,因此比较counter值,发现SID-0最大,所以SID当选新的Leader,新Leader产生后,会将epoch+1,然后通知每个Follower也进行epoch更新(选举/发现阶段)
2. 此时存在未提交的proposal,SID-0解决前任Leader遗留下来的proposal工作(数据同步阶段)
3. 当收到正常的ACK报文少于集群节点数一半时,继续1、2阶段;反之Leader则进入监听客户端更新操作(广播阶段)。

ZAB三阶段解决故障Leader选举:选举/发现、同步、广播

图6 Leader来不及发送proposal宕机了图

图7 新Leader丢弃未得到的proposal图

上面提到的是前任Leader将proposal发给了一个Follower,如果Leader在收到客户端的更新操作,更新本地数据且写入日志后,宕机了。新的Leader又该如何解决这个问题呢?

ZAB数据同步规则:新的Leader需先解决上一任Leader遗留下来的proposal,才可进行新的数据更新。
然而新的Leader并未收到上一任Leader输送过来的proposal,因此会通知上一任Leader将proposal进行回滚。然后才可以处理新的proposal。

总结

1. ZAB保证了Zookeeper集群环境下的数据同步问题。
2. 当Leader出现问题时,通过三阶段(选举/发现、同步、广播)恢复集群。
3. 故障时选举新Leader的数据同步问题:
3.1上一任Leader发出proposal,但是不满足ACK数量条件。新Leader应该重新向集群中的Follower发送给proposal到commit阶段,才可以进行新的客户端更新操作;
3.2 上一任Leader未发出proposal,只在本地做了数据更新。新Leader通知上一任Leader丢弃该proposal,然后进行新的客户端更新操作。

文章编写不易,你的点赞、收藏、转发是我认真编写下一篇文章的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最全的论文写作技巧(建议收藏)

近10年来,笔者有幸多次参与教学论文的评审工作,在此,特将教学论文写作的步骤及相关问题整理汇总如下: 一、选定论题 (一)论题在文中的地位与作用 严格地讲,论文写作是从选定论题开始的。选题…

Android源码分析 - Parcel 与 Parcelable

0. 相关分享 Android-全面理解Binder原理 Android特别的数据结构(二)ArrayMap源码解析 1. 序列化 - Parcelable和Serializable的关系 如果我们需要传递一个Java对象,通常需要对其进行序列化,通过内核进行数据转发,…

这几个群,程序员可千万不要进!

震惊!某摸鱼网站惊现肾结石俱乐部! (图源V2EX) 无关地域、无关性别,各位程序员们在肾结石这个病上面有着出奇一致的反应。诸如此类的各种职业病在我们的生活中更是十分常见。 也可能是到年纪了,在办公室…

ATTCK v12版本战术介绍——提权(一)

一、引言在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化战术理论知识及实战研究,通过实战场景验证行之有效的检测规则、防御措施,本期我们为大家介绍ATT&CK 14项战术中提权战术(一)&#xff0c…

计算机图形学09:二维观察之点的裁剪

作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本…

设计模式4——行为型模式

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它设计算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为&…

[洛谷-P1272] 重建道路(树形背包DP)

[洛谷-P1272] 重建道路(树形背包DP)一、题目重建道路题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示样例解释限制与约定二、思路1、状态表示2、转移方程3、循环设计4、初末状态三、代码一、题目 重建道路 题目描述 一场可怕的地震后&…

计算机Ping命令使用详解

计算机Ping命令使用详解 在网络中 ping 是一个十分强大的 TCP/IP 工具。它的作用主要为: 1、用来检测网络的连通情况和分析网络速度 2、根据域名得到服务器 IP 3、根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。 我们通常会用它来直接 ping ip 地…

uni-app api 获取系统信息(高、宽)用法及封装

uni-app提供了异步(uni.getSystemInfo)和同步(uni.getSystemInfoSync)的2个API获取系统信息 uniapp 官网解析地址 uni.getSystemInfo 异步获取系统信息 参数名类型必填说明successFunction是接口调用成功的回调failFunction否接口调用失败的回调函数completeFunction否接口…

腾讯混元AI大模型训练技术揭秘——太极AngelPTM

编者按:秉承“技术提效”理念,腾讯广告不断探索技术能力边界,全面升级广告系统,基于“一大平台、两大模型”持续精进创新研发,提升投放效率与投放效果,助力广告主实现高效的全域经营与生意增长。本篇文章是…

请介绍类加载过程,什么是双亲委派模型?

第23讲 | 请介绍类加载过程,什么是双亲委派模型? Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件,也是个面试考察热点。 今天我要问你的问题是&#xff0…

ESP32驱动-红外寻迹传感器驱动

红外寻迹传感器驱动 1、红外寻迹传感器介绍 红外寻迹传感器具有一对红外线发射管与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,输出接口会输出一个数字信号(低电平或高电平,取决于电路…

JVM篇之内存及GC

目录一、JVM内存区域1.1程序计数器1.2虚拟机栈1.3本地方法栈1.4堆1.5方法区二、JVM运行时内存2.1新生代(轻量级GC)2.2老年代(重量级GC)一、JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法栈】、线程共享区域【JAVA 堆、…

蓝桥杯嵌入式PWM_IN(打开中断)

1.原理图 2.配置 3.代码 关键函数 HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1) HAL_TIM_IC_CaptureCallback(TIM_HandTypeDef *htim)//回调函数 HAL_TIM_GET_COUNTER(&htim3) __HAL_TIM_SetCounter(&htim3,0)void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef …

spring5源码篇(4)——beanFactoryPostProcessor执行/注解bean的装配

spring-framework 版本:v5.3.19 前面研究了beanDefinition的注册,但也仅仅是注册这一动作。那么在spring容器启动的过程中,是何时/如何装配的?以及装配的bean是如何注入的? (考虑到xml方式基本不用了以及篇…

探秘MySQL——全面了解索引、索引优化规则

文章目录0.什么是索引1.常用索引分类逻辑维度底层数据结构维度物理维度(InnoDB)2.为什么底层是B树平衡二叉查找树红黑树B树(多叉)B树(多叉)3.MySQL索引优化SQL性能分析之explainQ.MySQL如何查看查询是否用到…

fastdfs提高系统连接数

1.操作系统 vi /etc/systemd/system.conf 修改后重启系统。 ulimit -n 验证是否生效。 2.tracker ①docker exec -it trackerID bin/bash ②vi /etc/fdfs/tracker.conf 一般性能测试场景可配置10000 3.storage ①docker exec -it storageID bin/bash ②vi /etc/fdfs/st…

k8s-Pod域名学习总结

k8s-Pod域名学习总结 大纲 k8s内置DNS服务 配置Pod的域名服务 CornDNS配置 默认Pod的域名 自定义Pod的域名 实战需求 1 Pod有自己的域名 2 集群内部的Pod可以通过域名访问其他的Pod 基础准备: 1 k8s 集群版本1.17 k8s内置DNS服务 k8s1.17安装完成后自动创建…

保姆级使用PyTorch训练与评估自己的MixMIM网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址:https://github.com/Fafa-DL/Awesome-Backbones 操作教程:https://www.bilibili.co…

【python】如何用canvas在自己设计的软件上作画

文章目录前言Canvas组件Canvas画布界面画长方体画多边形PhotoImage组件展示gif的图片展示gif法2总结前言 python学习之路任重而道远,要想学完说容易也容易,说难也难。 很多人说python最好学了,但扪心自问,你会用python做什么了&a…