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

在这里插入图片描述

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

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

相关文章

Java SE 认识异常 (Java SE完结篇)

1. 异常的概念与体系结构 1.1 异常的概念 在我们的生活中,一个人如果表情痛苦,我们可能会问: 你是生病了吗? 需要我陪你去看医生吗? 程序也和人是一样的,均会发生一些"生病"的行为,比如: 数据格式不对, 数组越界,网络中断等, 我们把这种程序出现的"生病&qu…

Ps:文字工具

工具箱里的文字工具组中包含了四种工具: 横排文字工具 Horizontal Type Tool 直排文字工具 Vertical Type Tool 横排文字蒙版工具 Horizontal Type Mask Tool 直排文字蒙版工具 Vertical Type Mask Tool 快捷键:T 横排文字蒙版工具和直排文字蒙版工具…

iOS--第二章block

第二章block blocks 概要Blocks模式Blocks语法Blocks类型变量截获自动变量值_block 说明符 Blocks的实现Block的实质截获自动变量值_block说明符Block存储域 blocks 概要 Blocks是c语言的扩展,block是一个带有自动变量值的匿名函数,它也是一个数据类型&…

Lua面向对象

封装 实现了New方法,相当于创建了一个表obj,并设置元表可以通过obj表去访问__index指向表中的数据 继承 通过大G表传入字符串创建表,

安卓国产百度网盘与国外云盘软件onedrive对比

我更愿意使用国外软件公司的产品,而不是使用国内百度等制作的流氓软件。使用这些国产软件让我不放心,他们占用我的设备大量空间,在我的设备上推送运行各种无用的垃圾功能。瞒着我,做一些我不知道的事情。 百度网盘安装包大小&…

golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制

文章目录 golang常用库之-ladon包 | 基于策略的访问控制概念使用策略 条件 Conditions自定义conditionLadon Condition使用示例 持久化访问控制(Warden) 结合 Gin 开发一个简易 ACL 接口参考 golang常用库之-ladon包 | 基于策略的访问控制 https://github.com/ory/ladon Lado…

Unity中UGUI中的PSD导入工具的原理和作用

先说一下PSD导入工具的作用,比如在和美术同事合作开发一个背包UI业务系统时,美术做好效果图后,程序在UGUI中制作好界面,美术说这个图差了2像素,那个图位置不对差了1像素,另外一个图大小不对等等一系列零碎的…

从零自制docker-4-【PID Namespace MOUNT Namespace】

文章目录 PID namespace代码mountnamespace通俗理解代码 PID namespace 每个命名空间都有独立的PID空间,即每个命名空间的进程都由一开始分配。 新建立的进程内部进程ID为1 代码 package main import ("log""os/exec""os""sy…

MySQL_数据库图形化界面软件_00000_00001

目录 NavicatSQLyogDBeaverMySQL Workbench可能出现的问题 Navicat 官网地址: 英文:https://www.navicat.com 中文:https://www.navicat.com.cn SQLyog 官网地址: 英文:https://webyog.com DBeaver 官网地址&…

Spring MVC文件上传配置

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 文件上传 Spring MVC文件上传基于Servlet 3.0实现;示例代码如下: Overrideprotected void customizeRegistration(ServletRegistration.Dynamic reg…

【开源鸿蒙】编译OpenHarmony轻量系统QEMU RISC-V版

文章目录 一、背景介绍二、准备OpenHarmony源代码三、准备hb命令3.1 安装hb命令3.2 检查hb命令 四、编译RISC-V架构的OpenHarmony轻量系统4.1 设置hb构建目标4.2 启动hb构建过程 五、问题解决5.1 hb set 报错问题解决 六、参考链接 开源鸿蒙坚果派,学习鸿蒙一起来&a…

AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信,它可以使用JSON、XML、HTML和text文本等格式发送和接收数据,AJAX最吸引人的就是它的异步特性,也就是说它可以在不重新刷新页面的情况下与服务器通信,…

GPU密集型计算性能优化的方法和技术

对GPU密集型计算进行性能优化的方法和技术多种多样。通过一些优化策略和技术需要综合考虑应用程序的具体需求、所使用的GPU硬件、以及编程模型和库的选择。通过不断地分析和调整,可以实现GPU计算性能的持续提升。以下是一些常用的优化策略和技术: 算法优…

uni-popup(实现自定义弹窗提示、交互)

一般提示框的样式,一般由设计稿而定,如果用uniapp的showmodel,那个并不能满足我们需要的自定义样式,所以最好的方式是我们自己封装一个!(想什么样就什么样)! 一、页面效果 二、使用…

Redis的常用操作-String字符串类型

一、redis简介 redis 就是一个数据库,与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此redis 被应用于缓存方向。另外,redis 也经常用来做分布式锁。 二、redis作缓存,主要用来实现…

WebSocket多服务实例下的消息推送

最近在做一个项目,涉及到前后端的消息同步、推送,进而我们选择使用webSocket的方案进行实现,但是当websocket服务端部署在多个实例下,会出现前端socket意外断开导致无法收到消息的情况。手下我们先说我们的实现方案: 1…

【JavaScript】JavaScript 运算符 ⑤ ( 赋值运算符 | 基础赋值运算符 与 复合赋值运算符 )

文章目录 一、JavaScript 赋值运算符1、赋值运算符 概念2、基础赋值运算符 与 复合赋值运算符3、复合赋值运算符4、完整代码示例 一、JavaScript 赋值运算符 JavaScript 赋值运算符种类 : 基础赋值运算符 : 等于 : ; 复合赋值运算符 : 加等 : 减等 : -乘等 : *除等 : /取模等…

MongoDB的安装方法图文详细

官网:www.mongodb.com 选择 Products > Community Edition 就能进入社区版 在这里下载 windows 版对应的安装包 注意:6.0.1 版本的 MongoDB 配置环境变量有问题,并且我不知道怎么解决,如果想要避免出问题,建议使…

【javaWeb】在webapp中手动发布一个应用

标题 🐲一、为什么要在webapp中手动发布一个应用🎉二、手动发布步骤1.下载Tomcat2.解压并安装3.在webapps中创建文档 ✨三、总结 🐲一、为什么要在webapp中手动发布一个应用 好处解释灵活性手动发布应用程序可以根据自己的需求进行自定义配置…

《PyTorch 深度学习实战》- 第一章 深度学习回顾和PyTorch简介

《PyTorch 深度学习实战》- 第一章 深度学习回顾和PyTorch简介 1.1 PyTorch的历史 pytorch前身是Torch,Torch使用Lua和C语言,而后因为python的兴起,演变成为PyTorch。事实上,pytorch是提供动态图功能的chainer分支。 pytorch与…