当前位置: 首页 > news >正文

深入理解Zookeeper的ZAB协议

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,然后进行新的客户端更新操作。

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

相关文章:

深入理解Zookeeper的ZAB协议

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

opencv-图像几何处理

缩放 缩放只是调整图像的大小。为此,opencv提供了一个cv2.resize()函数,可以手动指定图像大小,也可以指定缩放因子。你可以使用任意一种方法调整图像的大小: import cv2 from matplotlib import pyplot as pltlogo cv2.imread(…...

[前端笔记030]vue之hello、数据绑定、MVVM、数据代理、事件处理、计算属性和监视属性

前言 本笔记参考视频,尚硅谷:BV1Zy4y1K7SH p1 -p25官网文档完善,本文只做笔记使用,官网下载vue的开发版和生产版或者使用CDN,并去谷歌商店下载开发插件 简介 组件化模式,提高代码复用率,更好维护声明式编…...

每天学一点之注解、元注解

注解 1、注解概述 定义: 注解(Annotation),也叫元数据。与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。 作用分类&#…...

STA环境

目录1. CMOS逻辑门2. 波形3. 时钟3.1. 指定时钟create_clock时钟延迟set_clock_latency 时钟不确定度set_clock_uncertainty 跨时钟域set_false_path3.2. 衍生时钟3.3. 虚拟时钟4. 时序路径2.1. 输入路径2.2. 输出路径2.3. 点对点约束本文介绍在执行静态时序分析(St…...

嵌入式系统实践 12 ——基于ARM汇编 Keil5 MSP432 P401R开发板

物联网实验1 阿里云远程控制小灯 ///****************************************************************************** // * // * MSP432P401 // * ----------------- // * | | // * | |…...

【密码学篇】密码行业标准汇总(GM)

【密码学篇】密码行业标准汇总(GM) 截止到2023年03月10日,共130个密码行业标准,适用商用密码应用与安全性评估等密码行业,可点击链接预览或下载标准—【蘇小沐】 文章目录【密码学篇】密码行业标准汇总(GM…...

桌面文件删除后没有在回收站原因和恢复方法

桌面误删文件回收站也没有怎么办?遇到电脑桌面文件误删了,重要数据回收站找不回这种情况不要慌!如今数据恢复技术很成熟,许多文件丢失问题都能够成功解决。下面我们就一起来了解下桌面误删文件回收站没有的原因和相关文件恢复方法…...

什么是业务运营?关键组成部分有哪些?

企业领导者使用收入运营和智能软件等技术来分析买家的不同接触点。这些见解决定了客户互动的成败,从而改善了业务运营,从而带来了成功。 什么是业务运营? 业务运营包括企业为保持盈利而执行的一系列日常任务。虽然这些任务可能因业务类型或行…...

腾讯云新用户怎么配置服务器的方法教程

腾讯云新用户怎么配置服务器?腾讯云服务器配置选择攻略,先选择云服务器地域和可用区,然后根据用户使用场景需要平衡型、计算型或高IO型等特性来选择云服务器CVM实例规格,主机教程网来详细说下腾讯云服务器配置选择攻略。 1、腾讯云…...

windows 11系统,通过ip地址远程连接连接ubuntu 22.04系统(共同局域网下,另一台主机不需要联网)

windows 11系统,通过ip地址远程连接连接ubuntu 22.04系统(不需要联网)问题来源问题分析解决方案问题来源 自己搭建了一台ubuntu系统作为深度学习的机器,但是学校的网络问题,一个账号只能同时登录3台设备。通过远程连接…...

头脑风暴(一):Controller层前端传参接收;在Service层实现类中?为何要build相关构建器?添加套餐业务分析

文章目录1 MyBatis中Controller层List集合接收数据,泛型添加与否1.1 案例场景1.2 应该用什么接收1.3 是否可以用其他方式接收?1.4 LIst集合接收可否不指定泛型1.5 mybatis中使用基本类型接收数据?resultType是集合中的元素的类型,…...

vue-cropper 拖动图片和截图框

现象 开发遇到vue--cropper不能拖动图片和截图框 解决方法 can-move-box设置为true,表示可以拖动截图框 can-move设置为true,表示可以拖动图片 *注意: 我外层套了一个el-col, el-col的宽高一定要大于截图框的宽高,否则移动不了…...

[Linux基础]history相关的环境变量设置

目录 背景 简介 命令操作 1. 语法: 2. 功能 3. 参数 环境变量设置 背景 工作中时常收到客户的反馈,我的系统什么也没干,就出现文件丢失,程序错误等等问题;我们在问题排查的时候查看history信息也是重要环节…...

怎么给电脑分盘与合并磁盘?教你三招

电脑只有一个C盘,想要再分出一个或多个分区,怎么办?电脑C盘的容量太小,太容易满了,想重新分盘,或者把其他盘跟它合并,但因为文件太多备份实在是太麻烦,怎么办?怎么给电脑…...

HCIP-5.4OSPF路由聚合、缺省路由

1、路由聚合 OSPF 是一种链路状态路由协议,因此 OSPF路由器不传输路由,而是传输链路状态信息。因此,OSPF 路由通过汇总 LSA 来控制链路状态信息的传输,从而减小 LSDB 数据库的大小,进而控制路由的汇总。 由于OSPF路由…...

【数据结构】——树与二叉树

文章目录树二叉树二叉树的性质完全二叉树二叉树的存储遍历二叉树和线索二叉树6.4 树和森林哈夫曼树应用树 树的定义:树是以分支关系定义的层次结构。 D; 树(Tree)是n(n≥0)个结点的有限集。 R 数据关系 有且仅有一个特定的称为根(Root) 的结点 当n>1时&…...

等离子纳秒高压脉冲电源维修HVP-20 P

等离子纳秒高压脉冲电源维修HVP-20 P;HVP-10B;HVP-05;HVP-02等型号均可维修 HVP-20 P(N)用于气体放电与低温等离子体的高性能纳秒高压脉冲电源。 HVP-20P(N)采用专有的marx电路,实现高压脉冲电源参数的便捷可调,包括峰值电压0 – 20 KV (-2…...

JavaScript内改变this指向

之前我们说的都是代码内 this 的默认指向今天我们要来说一下如何能改变 this 指向也就是说, 你指向哪我不管, 我让你指向哪, 你就得指向哪开局在函数的原型( Function.prototype ) 上有三个方法callapplybind既然是在函数的原型上, 那么只要是函数就可以调用这三个方法&#xf…...

Cobalt Strike---(2)

数据管理 Cobalt Strike 的团队服务器是行动期间Cobalt Strike 收集的所有信息的中间商。Cobalt Strike 解析来 自它的 Beacon payload 的输出,提取出目标、服务和凭据。 如果你想导出 Cobalt Strike 的数据,通过 Reporting → Export Data 。Cobalt Str…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...