Zookeeper的ZAB协议原理详解

news2024/9/23 21:28:31

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

在这里插入图片描述

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

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

相关文章

C语言例:设 int a,b; 则表达式(a=2,b=5,a++,b++,a+b) 的值

代码如下&#xff1a; #include<stdio.h> int main(void) {int a,b,m; m(a2,b5,a,b,ab);printf("(a2,b5,a,b,ab) %d\n",m);//a2,b5,a3,b6,ab9return 0; } 结果如下&#xff1a;

第十二届蓝桥杯省赛CC++ 研究生组-路径

记录到每个结点的最短距离&#xff0c;以此为基础计算后续结点最优值 #include<iostream> #include<algorithm> using namespace std; typedef long long ll;ll gcd(int a, int b){if(!b) return a;return gcd(b, a % b); }int main(){ll dp[2022] {0};//dp[i]记…

【一起学Rust | 基础篇】rust线程与并发

文章目录 前言一、创建线程二、mpsc多生产者单消费者模型1.创建一个简单的模型2.分批发送数据3. 使用clone来产生多个生产者 三、共享状态&#xff1a;互斥锁1. 创建一个简单的锁2. 使用互斥锁解决引用问题 前言 并发编程&#xff08;Concurrent programming&#xff09;&#…

【Java Web基础】一些网页设计基础(三)

文章目录 1. 导航栏样式进一步调整2. 入驻企业信息展示栏2.1 Title设置2.2 具体信息添加 3. 轮播图4. 注册登录按钮及其他信息5. 一些五颜六色的、丰富视觉效果的中间件…… 1. 导航栏样式进一步调整 这种导航栏&#xff0c;选中的时候字体变蓝色&#xff0c;可能还是不够美观&…

C++进阶--哈希

哈希概念 哈希&#xff08;Hash&#xff09;是一种常见的密码学技术和数据结构&#xff0c;它将任意长度的输入通过散列算法转换成固定长度的输出&#xff0c;这个输出被称为散列值或哈希值。哈希函数是一种单向函数&#xff0c;即从哈希值无法反推出原始输入值。 哈希函数具有…

Android14 - AMS之Activity启动过程(1)

Android14 - AMS之Activity启动过程&#xff08;2&#xff09;-CSDN博客 ​​​​​​​ Android14 - AMS之Activity启动过程&#xff08;3&#xff09;-CSDN博客 我们以Context的startActivity场景&#xff08;option null&#xff0c; FLAG_ACTIVITY_NEW_TASK&#xff09;来…

C++类型转换及IO流(深度剖析)

文章目录 1. 前言2. C语言的类型转换3. C的强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast 4. RTTI&#xff08;了解&#xff09;5. C语言的输入输出及缓存区理解6. CIO流6.1 C标准IO流6.2 C文件IO流 7. stringstream的简单介绍 1. 前言 C语言…

机器学习-可解释性机器学习:支持向量机与fastshap的可视化模型解析

一、引言 支持向量机(Support Vector Machine, SVM)作为一种经典的监督学习方法&#xff0c;在分类和回归问题中表现出色。其优点之一是生成的模型具有较好的泛化能力和可解释性&#xff0c;能够清晰地展示特征对于分类的重要性。 fastshap是一种用于快速计算SHAP值&#xff08…

华曦传媒陆锋:数字媒体时代,社区电梯广告价值正在被重估

在数字化时代的浪潮中&#xff0c;电梯广告、停车场道闸广告、门禁灯箱广告等线下社区广告似乎面临着生存的挑战。 然而&#xff0c;这一传统广告形式展现出了惊人的韧性和价值。 比如&#xff0c;2023年上半年&#xff0c;作为行业龙头分众传媒&#xff0c;2023年上半年实现…

【Linux】多线程编程基础

&#x1f4bb;文章目录 &#x1f4c4;前言&#x1f33a;linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 &#x1f33b;linux线程冲突概念互斥锁函数介绍加锁的缺点 &#x1f4d3;总结 &#x1f4c4;前言 无论你是否为程序员&#xff0c;相信多线程这个词汇应…

小白也能在3分钟完成短剧解说的剪辑,这是真的!

3分钟的解说视频&#xff0c;真的需要1小时的手工剪辑吗&#xff1f; 生成解说视频需要经过素材准备、解说词创作、声音录制、视频剪辑和视频合成等多个步骤&#xff0c;每个步骤都需要投入一定的时间和精力&#xff0c;因此整个过程较为耗时耗力。 1. 素材准备&#xff1a; 需…

【LINUX笔记】驱动开发框架

应用程序调动驱动程序 驱动模块运行模式 模块加载-卸载 加载卸载注册函数 加载 驱动编译完成以后扩展名为.ko&#xff0c;有两种命令可以加载驱动模块&#xff1a; insmod和modprobe 驱动卸载 驱动注册注销 //查看当前已经被使用掉的设备号 cat /proc/devices 实现设备的具…

AI系统性学习06—开源中文语言大模型

1、ChatGLM ChatGLM-6B的github地址&#xff1a;https://github.com/THUDM/ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级…

【Java Web基础】一些网页设计基础(二)

文章目录 1. Bootstrap导航栏设计1.1 代码copy与删减效果1.2 居中属性与底色设置1.3 占不满问题分析1.4 字体颜色、字体大小、字体间距设置1.5 修改超链接hover颜色&#xff0c;网站首页字体颜色 1. Bootstrap导航栏设计 1.1 代码copy与删减效果 今天设计导航栏&#xff0c;直…

第4关:创建工程项目表J,并插入数据

任务描述 工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。创建工程项目表J(JNO,JNAME,CITY)&#xff0c;并在J表中插入下图数据。 相关知识 1、MySQL创建表的基本语法如下&#xff1a; 其中&#xff0c;table_name 是要创建的表的名称&…

Hololens 2应用开发系列(4)——MRTK基础知识及配置文件配置(下)

Hololens 2应用开发系列&#xff08;4&#xff09;——MRTK基础知识及配置文件配置&#xff08;下&#xff09; 一、前言二、边界系统&#xff08;Boundary&#xff09;三、传送系统&#xff08;Teleport&#xff09;四、空间感知系统&#xff08;Spatial Awareness&#xff09…

Pytorch神经网络-元组/列表如何喂到神经网络中

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

设计编程网站集:生活部分:饮食+农业,植物(暂记)

这里写目录标题 植物相关综合教程**大型植物&#xff1a;****高大乔木&#xff08;Trees&#xff09;&#xff1a;** 具有坚硬的木质茎&#xff0c;通常高度超过6米。例如&#xff0c;橡树、松树、榉树等。松树梧桐 **灌木&#xff08;Shrubs&#xff09;&#xff1a;** 比乔木…

基于Jenkins + Argo 实现多集群的持续交付

作者&#xff1a;周靖峰&#xff0c;青云科技容器顾问&#xff0c;云原生爱好者&#xff0c;目前专注于 DevOps&#xff0c;云原生领域技术涉及 Kubernetes、KubeSphere、Argo。 前文概述 前面我们已经掌握了如何通过 Jenkins Argo CD 的方式实现单集群的持续交付&#xff0c…

基于Springboot的在线投稿系统+数据库+免费远程调试

项目介绍: Javaee项目&#xff0c;springboot项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringBoot Mybatis VueMavenLayui来实现。MySQL数据库作为系统数据储存平台&a…