Zookeeper的ZAB协议原理详解

Zookeeper的ZAB协议原理详解

如何保证数据一致性。

Paxos,

吸收了主从。

zk = 数据模型+Watch机制

zab zookeeper原子广播协议。

ZAB概念

ZooKeeper是通过Zab协议来保证分布式事务的最终一致性。

Zab(ZooKeeper Atomic Broadcast,.ZooKeeper原子广播协议)支持崩溃恢复,基于该协议,ZooKeeper实现了一种主备模式的系统架构来保持集群中各个副本之间数据一致性。

在这里插入图片描述

在ZooKeeper集群中,所有客户端的请求都是写入到Leader进程中的,然后,由Leader同步到其他节点,称为Follower.。在集群数据同步的过程中,如果出现Follower节点崩溃或者Leader进程崩溃时,都会通过Zab协议来保证数据一致性。
Zab协议的具体实现可以分为以下两部分:

  • 消息广播阶段

    • 大部分时期的模式,正常工作模式
    • 数据同步问题
    • Leader负责处理客户端的写入操作,接受事务提交,每次接受一个事务的时候就会产生一个提案对象(Proposal)请求广播给
      Follower,Leader收集各个节点的反馈,然后在决定是否Commit(提交事务,真正写入zk)。
  • 崩溃恢复阶段

    • 不能对外提供功能,CP

    • 选举问题

    • 比如Leader宕机,会进入到崩溃恢复节点,重新进行选举,崩溃恢复阶段还包括数据同步的操作,同步集群中最新的数据,保持集群一
      致性

    • 一般情况下,数据最新的会当选为主节点

    当Leader可用时,正常的消息广播阶段
    当Leader不可用时,进入到崩溃恢复阶段,选举完成新的Leader)后会进行数据同步,当数据同步完成以后,此时才会重新进入到消息广播阶
    段。

事务编号ZXid

ZXid(64位) = epoch(年代) + 递增器 32

Zxid是Zb协议的一个事务编号,Zxd是一个64位的数字,其中低32位是一个简单的单调递增计数器,针对客户端每一个事务请求,计数器
加1;而高32位则代表Leader周期年代(Epoch)的编号。

周期年代的概念和Raft中Term(任期)概念是一样的。

在这里插入图片描述

每次有一个新的Leader选举出现时候,Leader服务器取出本地日志中最大的事务ZXID,读取epoch值,进行+1操作,作为新的周期ID。

ZAB流程分析

ZAB流程可以拆分为:消息广播–>崩溃恢复–>数据同步

消息广播

在ZooKeeper中所有的事务请求都由Leader节点来处理,其他服务器为Follower,Leader将客户端的事务请求转换为事务Proposal,并且将Proposal分发给集群中其他所有的Follower。
完成广播之后,Leader等待Follwer反馈,当有过半数的Follower反馈信息后,Leader就commit,将再次向集群内Follower广播Commit信息,Commit信息就是确认将之前的Proposal提交。

Acknowledge 承认

ACK (Acknowledge character)即是确认字符

在这里插入图片描述

崩溃恢复

下面的几种情况都会进入崩溃恢复阶段:

  • 初始化集群,刚刚启动的时候,无主

  • Leader崩溃,因为故障宕机

  • Leader失去了半数的机器支持,与集群中超过一半的节点断连,比如:发生了网络分区

崩溃恢复模式会开启新一轮的选举,选举产生的Leader会与过半的Follower进行数据同步,使数据一致,推出崩溃恢复模式,进入到消息广播模式。

状态说明
Following当前节点是跟随者,服从Leader节点的命令
Leading当前节点是Leader,负责协调事务
Election/Looking节点处于选举状态

崩溃恢复案例

在这里插入图片描述

server2 Leader节点挂了

1.各个节点变更状态,变更为Looking
  • Leader、Follower、Observer,Observer不参数与选举
  • Leader挂了,Follower都会将自己的状态改为Looking:状态,开始进入Leader选举过程。
2.各个Server节点都会发出一个投票,参与选举
  • 第一次投票,每个Sevr都会投自己一票,发送给集群中的所有机器
  • 在运行期间并不是所有Server的ZXID都是一致的(事务引D,越大数据版本越新,数据越完整)
3.集群接收来自各个服务器的投票,开始处理投票和选举
  • 处理选票的过程其实就是对比ZXID的过程,假设3号Server的ZXID最大,比如Server1收到Server3的选票,发现Server:3比自己的Zxid要
    大,Server1就投票给Server3。
  • 首先会判断Epoch(Term任期)
  • 如果Epoch相等,则选择ZXID最大。
  • 加入Epoch相等,ZXID也一样的,zoo.cfg中为了区分每个服务器,都会给服务器一个编号,myid。此时就对比myid。

在选举过程中,如果有节点获得超过半数的投票数,则会成为Leader节点,反之则重新投票选举。

在这里插入图片描述

4.选举成功,改变服务器的状态,参考上面这张图的状态变更

数据同步:

崩溃恢复完成选举以后,接下来的工作就是数据同步,在选举过程中,通过投票已经确认Leader服务器是最大Zxid的节点,同步阶段就是利用
Leader前一阶段获得的最新Proposal历史,同步集群中所有的副本。

对比RAFT

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8 款AI 绘画生成器:从文本创建 AI 艺术图像

人工智能正在影响各行各业,近年来它对创意产业的影响越来越大。由于AI绘画生成器的可操作性,许多人有机会用自己的想法进行艺术创作——即使他们没有接受过系统的专业艺术教育。 最先进的人工智能绘画生成器可能会改变我们未来创作艺术的方式。使用 AI …

pandas中DataFrame用法(python)

简介 DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以…

【火猫TV】LPL春季赛前瞻:Tabe迎战LNG OMG关键一战!

北京时间3月20日,LPL春季赛今天继续进行,今天将会迎来春季赛常规赛第八周第三个比赛日,今天的两场比赛是LNG战队对阵AL战队以及OMG战队对阵BLG战队,今天的两场比赛对于LNG、AL以及OMG战队都是比较重要的,目前三支战队都…

「Nginx」Nginx配置详解

「Nginx」Nginx配置详解 参考文章1、正向代理和方向代理2、指定域名允许跨域 参考文章 1、Nginx反向代理 2、nginx配置详解 3、Nginx服务器之负载均衡策略(6种) 1、正向代理和方向代理 2、指定域名允许跨域 map $http_origin $allow_cors {default 1;…

vmare17 安装不可启动的iso镜像系统

由于要测试一个软件,要安装一个Windows11_InsiderPreview_Client_x64_zh-cn_26058.iso 于是在虚拟机里捣鼓一下。但是这个iso好像不能直接启动 这样就无法直接安装了,怎么办呢,可以先用个pe系统引导进去,再在PE系统里安装这个iso…

河北库卡机器人KR500电源模块故障,该如何处理?

库卡机器人KR500电源模块常见故障类型及维修方法 1)电源模块故障指示灯亮 故障现象:库卡机器人KR500电源模块上的故障指示灯亮起,机器人不能正常工作。 维修方法:根据故障指示灯的闪烁频率或颜色判断具体的故障类型。然后&#xf…

计算机是如何工作的?CPU、内存、操作系统...

文章目录 前言一、冯诺依曼体系(Von Neumann Architecture)二、内存和硬盘区别三、CPU四、操作系统4.1计算机系统的分层视图4.2进程和线程4.3进程控制块(PCB)4.4进程管理 五、经典面试题 前言 计算的需求在⼈类的历史中是⼴泛存在…

用 ElementPlus的日历组件如何改为中文

文章目录 问题分析 问题 直接引入日历组件后&#xff0c;都是英文&#xff0c;应该如何把头部英文改为中文 <template><el-calendar><template #date-cell"{ data }"><p :class"data.isSelected ? is-selected : ">{{ data.da…

Web and HTTP

Web and HTTP First, a review… ▪ web page consists of objects ▪ object can be HTML file, JPEG image, Java applet, audio file,… ▪ web page consists of base HTML-file which includes several referenced objects ▪ each object is addressable by a URL, e.g.,…

java面向对象进阶---学习第一课

1.static学习&#xff1a; static&#xff0c;是java修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 注意&#xff1a;&#xff01;&#xff01;&#xff01;共享的情况&#xff0c;就是用static来修饰 类名&#xff1a;1.见名知意。2.私有化构造方法 3.方法定义…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…

LF-YOLO

LF-YOLO算法解读&#xff0c;针对x射线图像 1、EMF&#xff1a;网络结构的改变&#xff0c;enhanced multiscale feature(增强的多尺度特性)&#xff0c;多尺度融合模块。利用基于参数的方法和无参数的方法&#xff0c;可以同时结合X射线图像的局部和全局上下文&#xff0c;利用…

kaggle竞赛宝典 | 时间序列和时空数据大模型综述!(建议收藏!)

本文来源公众号“kaggle竞赛宝典”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;时间序列和时空数据大模型综述&#xff01; 作者&#xff1a;算法进阶 时间序列和时空数据大模型综述&#xff01; 1 前言 大型语言模型&…

short、byte 运算不能赋值给原类型问题分析

一、题目分析 该题目来源于牛客网中的一道选择题 给出如上代码&#xff0c;问你输入结果&#xff0c;但是考试时并不能看出错误原因导致踩坑 &#xff1b; 鼠标指向报错位置&#xff0c;直接给出提示了&#xff0c;两种类型四则运算都会强制转换为int之后进行运算 二、具体原…

演讲嘉宾公布 | 智能家居与会议系统专题论坛将于3月28日举办

一、智能家居与会议系统专题论坛 智能家居通过集成先进的技术和设备&#xff0c;为人们提供了更安全、舒适、高效、便捷且多彩的生活体验。智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代…

Linux系统部署SQL Server结合内网穿透实现公网访问本地数据库

文章目录 前言1. 安装sql server2. 局域网测试连接3. 安装cpolar内网穿透4. 将sqlserver映射到公网5. 公网远程连接6.固定连接公网地址7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库&#xff0c;并结合cpolar内网穿透工具&#xff0…

使用OpenHarmony如何定制开发一套分布式亲子早教系统

概述 本篇Codelab是基于TS扩展的声明式开发范式编程语言编写的一个分布式益智拼图游戏&#xff0c;可以两台设备同时开启一局拼图游戏&#xff0c;每次点击九宫格内的图片&#xff0c;都会同步更新两台设备的图片位置。效果图如下&#xff1a; 说明&#xff1a; 本示例涉及使用…

【Gradle】取消使用idea+Gradle创建项目时自动生成.main结尾的子module

显示效果如下图所示&#xff0c;看起来比较不爽&#xff0c;但是不影响使用 解决方案&#xff1a; 一、打开.idea/gradle.xml文件 先在gradle.xml中添加内容 <option name"resolveModulePerSourceSet" value"false" />&#xff0c;然后刷新Gradle工…

嵌入式实习难找怎么办?

今日话题&#xff0c;嵌入式实习难找怎么办&#xff1f;个人建议如果找不到实习机会&#xff0c;可以回归学习嵌入式所需的知识&#xff0c;积累项目经验或者回顾之前参与过的项目&#xff0c;将它们整理复盘。如果还有时间&#xff0c;可以再尝试找实习&#xff0c;如果找不到…

Excel第27享:基于if函数嵌套的多结果唯一性匹配

1、需求描述 如下图所示&#xff0c;现在有E列、F列、G列三列数据&#xff0c;在D列中填充“最终对应编号”&#xff0c;匹配原则是&#xff1a;E列、F列、G列三列数据中&#xff0c;哪个有数据就填充哪个数据&#xff0c;如果都没有&#xff0c;就显示空值即可。 2、解决思路…