分布式与一致性协议之ZAB协议(五)

ZAB协议

ZAB集群如何从故障中恢复

如果我们想把ZAB集群恢复到正常状态,那么新领导者就必须确立自己的领导关系,成为唯一有效的领导者,然后作为主节点"领导"各备份节点一起处理读写请求

如何确立领导关系

前面提到,选举出的领导者是在成员发现阶段确立领导关系的。领导者在当选后会递增自己的任期编号,并基于任期编号值的大小来与跟随者协商,最终建立领导关系。具体来说,跟随者会选择任期编号值最大的节点来作为自己的领导者,而被大多数节点认同的领导者将成为真正的领导者。

举个例子。

在这里插入图片描述

下面用一个例子来帮助更好地理解。
假设一个ZooKeeper集群由节点A、B、C组成。其中,领导者A已经宕机,节点C是新选出来的领导者,节点B是新的跟随者(为了方便演示,假设节点B、C已提交提案的事务标识符的最大值分别是<1,10>和<1,11>,其中1是任期编号,10、11是事务标识符中的计数器值,节点A宕机前的任期编号也是1),如图所示。那么节点B、C如何协商建立领导关系呢?

  • 首先,节点B、C会把自己的ZAB状态设置为成员发现(DISCOVERY),这就表明,选举(ELECTION)阶段结束了,进入了下一个阶段,如图所示。
    在这里插入图片描述

这里补充一下,ZAB协议定义了4种状态来标识节点的运行状态。
1.ELECTION(选举)状态:表明节点在进行领导者选举
2.DISCOVERY(成员发现)状态:表明节点在协商沟通领导者的合法性
3.SYNCHRONIZATION(数据同步)状态:表明集群的各节点以领导者的数据为准,修复数据副本的一致性
4.BROADCAST(广播)状态:表明集群各节点在正常处理写请求。
关于这4种状态,简单了解即可。强调一点,只有当集群大多数节点处于广播状态的时候,集群才能提交提案。

  • 接下来,节点B会主动向节点C发送包含自己接收到的领导者任期编号的最大值(也就是前领导者A的任期编号,1)的FOLLOWINFO消息,如图所示。在这里插入图片描述

节点C在接收到来自节点B的信息后,会将包含自己的事务标识符的最大值的LEADINFO消息发送给跟随者。需要注意的是,领导者进入成员发现阶段后会对任期编号加1,即创建新的任期编号,然后基于新任期编号创建新的事务标识符(也就是<2,0>),如图所示。在这里插入图片描述

当接收到领导者的响应后,跟随者会判断领导者的任期编号是否最新,如果不是,就发起新的选举;如果是,则返回ACKEPOCH消息给领导者。在这里,
节点C的任期编号(也就是2)大于节点B接收到的其他领导任期编号(也就是旧领导者A的任期编号,1),所以节点B返回确认响应给节点C,并设置ZAB状态为数据同步状态,如图所示在这里插入图片描述

  • 最后,领导者在接收到来自大多数节点的ACKEPOCH消息时,会设置ZAB状态为数据同步。在这里,节点C接收到了节点B和节点C自己发送的消息,满足大多数节点的要求,所以,在接收到来自B的消息后,C设置ZAB状态为数据同步状态。如图所示在这里插入图片描述

现在,ZAB协议在成员发现阶段确立了领导者的领导关系,这样领导者就可以行使领导职能了。下一步,ZAB协议要解决的就是数据冲突问题,以实现各节点数据的一致性,那么它是怎么做的呢?

如何处理冲突数据

当进入数据同步状态后,领导者会根据跟随者的事务标识符的最大值,判断以哪种方式处理不一致数据(有DIFF、TRUNC、SNAP3种方式)。
因为节点C已提交提案的事务标识符的最大值(也就是<1,11>)大于节点B已提交提案的事务标识符的最大值(也就是<1,10>),所以节点C会用DIFF的方式修复数据副本的不一致。并返回差异数据(也就是事务标识符为<1,11>的提案)和NEWLEADER消息给节点B,如图所示.在这里插入图片描述
这里强调一点:节点B已提交提案的最大值,也是节点B最新提案的最大值。因为在ZooKeeper实现种,节点退出跟随者状态时(也就是在进入选举前),所有未提交的提案都会被提交。这是ZooKeeper的设计。

然后,节点B修复不一致数据,返回NEWLEADER消息的确认响应给领导者(即节点C),如图所示.在这里插入图片描述

接着,节点C在接收到来自大多数节点的NEWLEADER消息的确认响应后会将ZAB状态设置为广播状态。在这里,节点C接收到节点B和节点C自己的确认响应,满足大多数确认的要求。所以,在接收到来自节点B的确认响应后,节点C会将自己的ZAB状态设置为广播状态,并发送UPTODATE消息给所有跟随者,通知它们数据同步已经完成了,如图所示。在这里插入图片描述

最后当节点B接收到UPTODATE消息时,它就直到数据同步已经完成,并设置ZAB状态为广播状态,如图所示在这里插入图片描述

注意

在ZooKeeper的代码实现中,处于提交状态的提案是可能会改变的,为什么呢?

  • 在ZooKeeper中,一个提案进入提交状态的方式有两种:被复制到大多数节点上和被领导者提交或接收到来自领导者的提交消息(leader.COMMIT)而被提交。
    在这种状态下,提交的提案是不会改变的。

  • 另外,在ZooKeeper的设计中,节点在退出跟随者状态时(在follower.shutdown()函数中)会将所有本地未提交的提案都提交。需要注意的是,此时提交的提案可能并未被复制到大多数节点上,而且这种设计会导致ZooKeeper中出现处于"提交"状态的提案可能会被删除(也就是接收到领导者的TRUNC消息而删除的提案)的情况。

  • 更准确地说,在ZooKeeper中,被复制到大多数节点上地提案最终会被提交,并不会再改变,而只在少数节点存在地提案可能会被提交和不再改变,,也可能会被删除。为了更好地理解,举个具体的例子。

  • 如果写请求对应的提案"SET X=1"已经复制到大多数节点上,那么它最终会被提交,之后也不会再改变。也就是说,再没有新的X赋值操作的前提下,不管节点怎么崩溃、领导者如何变更,你查询到的X的值都为1。

  • 如果写请求对应的提案"SET X=1"未被复制到大多数节点上,比如在领导者广播消息过程中,领导者崩溃了,那么提案"SET X=1"可能会被复制到大多数节点上提交并不再改变,也可能会被删除。这个行为是未确定的,具体取决于新的领导者是否包含该提案。

  • 另外,补充下,在ZAB协议选举出了新的领导者后,该领导者不能立即处理写请求,还需要通过成员发现、数据同步两个阶段进行故障恢复。这是由于ZAB协议的设计决定的,不是所有的共识算法都必须这样,比如通过Raft算法选举出新的领导者后,领导者是可以立即处理写请求的。

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

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

相关文章

5000A信号发生器使用方法

背景 gnss工作需要使用的5000A&#xff0c;所以做成文档&#xff0c;用于其他员工学习。 下载星历数据 https://cddis.nasa.gov/archive/gnss/data/daily/2024/brdc/ 修改daily中的年份&#xff0c;就可以获取相关截至时间的星历数据 brcd数据格式 第一行记录了卫星的PRN号&a…

Java毕业设计 基于SpringBoot vue企业信息管理系统

Java毕业设计 基于SpringBoot vue企业信息管理系统 SpringBoot 企业信息管理系统 功能介绍 员工&#xff1a;登录 个人中心 修改密码 个人信息 会议管理 公告管理 个人计划管理 通讯录管理 外出登记管理 请假管理 上下班打卡管理 管理员&#xff1a;登录 个人中心 修改密码 …

流量暴涨!抖音+快手+小红书获客攻略!

在数字营销的海洋中&#xff0c;抖音、快手和小红书无疑是三座巨大的灯塔&#xff0c;照亮了品牌和个人获取流量的道路。这些平台不仅拥有庞大的用户基础&#xff0c;而且其独特的算法和社交特性让获客变得更加高效而精准。接下来&#xff0c;让我们深入探讨如何通过这三个平台…

Eplan带你做项目——如何实现项目的交付

前言 Eplan作为一款专业的电气工程设计软件&#xff0c;不仅在设计阶段为电气工程师提供了强大的绘图、计算、仿真等功能&#xff0c;还具备丰富的数据管理与交换能力&#xff0c;能够便捷、准确地导出软件设计、生产制造所需的数据&#xff0c;实现电气设计与软件设计、生产制…

《QT实用小工具·五十九》随机图形验证码,带有一些可人的交互与动画

1、概述 源码放在文章末尾 该项目实现了可交互的动画验证码控件&#xff0c;趣味性十足&#xff1a; 字符变换动画 噪音动画 可拖动交互 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef CAPTCHAMOVABLELABEL_H #define CAPTCHAMOVABLELABEL…

Kubernetes 教程:在 Containerd 容器中使用 GPU

原文链接:Kubernetes 教程:在 Containerd 容器中使用 GPU 云原生实验室本文介绍了如何在使用 Containerd 作为运行时的 Kubernetes 集群中使用 GPU 资源。https://fuckcloudnative.io/posts/add-nvidia-gpu-support-to-k8s-with-containerd/ 前两天闹得沸沸扬扬的事件不知道…

技术速递|使用 .NET 为 Microsoft AI 构建可扩展网关

作者&#xff1a;Kara Saucerman 排版&#xff1a;Alan Wang Microsoft AI 团队构建了全面的内容、服务、平台和技术&#xff0c;以便消费者在任何设备上、任何地方获取他们想要的信息&#xff0c;并为企业改善客户和员工的体验。我们的团队支持多种体验&#xff0c;包括 Bing、…

全栈开发之路——前端篇(6)生命周期和自定义hooks

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

详细讲解lua中string.gsub的使用

string.gsub 是 Lua 标准库中的一个函数&#xff0c;用于全局替换字符串中的某些部分。string.gsub 是 Lua 中非常实用的一个函数&#xff0c;它可以用来进行字符串的处理和替换操作。 它的基本语法如下&#xff1a; string.gsub(s, pattern, replacement [, n])s 是要处理的…

HarmonyOS实战开发教程-如何开发一个2048游戏

今天为大家分享的是2048小游戏&#xff0c;先看效果图&#xff1a; 这个项目对于新手友友来说可能有一点难度&#xff0c;但是只要坚持看完一定会有收获。因为小编想分享的并不局限于ArkTs语言&#xff0c;而是编程思想。 这个游戏的基本逻辑是初始化一个4乘4的数组&#xff…

深度学习模型训练套路与验证套路以及如何使用GPU进行模型训练

完整的模型训练套路&#xff1a;代码模板 数据集以经典的 CIFAR10 为例。 这个例子是很简单的&#xff0c;可能不太实用&#xff0c;但重点是通过这个例子掌握一种模型训练的写法套路&#xff0c;因此很有必要学习。 import torch.optim import torchvision from torch impo…

JavaScript异步编程——02-Ajax入门和发送http请求

同步和异步回顾 同步和异步的简单理解 同步&#xff1a;必须等待前面的任务完成&#xff0c;才能继续后面的任务。 异步&#xff1a;不受当前任务的影响。 拿排队举例&#xff1a; 同步&#xff1a;在银行排队时&#xff0c;只有等到你了&#xff0c;才能够去处理业务。 异…

【C++泛型编程】(二)标准模板库 STL

文章目录 标准模板库 STL容器算法迭代器仿函数/函数对象适配器分配器示例 标准模板库 STL C 的标准模板库&#xff08;Standard Template Library&#xff0c;STL&#xff09;旨在通过模板化的设计&#xff0c;提供一种通用的编程模式&#xff0c;使程序员能方便地实现和扩展各…

数据仓库项目---Day01

文章目录 框架的安装包数据仓库概念项目需求及架构设计项目需求分析项目框架技术选型系统数据流程设计框架版本选型集群资源规划设计 数据生成模块数据埋点主流埋点方式埋点数据上报时机 服务器和JDK准备搭建三台Linux虚拟机(VMWare)编写集群分发脚本xsyncSSH无密登录配置JDK准…

实现同一份数据的各种镜像

一个数据集通过某个轴&#xff08;通常是垂直或水平轴&#xff09;的镜像对称。这可以通过简单的数学运算来实现。 如果想要通过一块数据生成四份&#xff0c;可以通过以下步骤&#xff1a; 下面是一个简单的示例&#xff0c;展示了如何通过垂直轴&#xff08;左右对称&#…

找不到模块“vue-router”。你的意思是要将 moduleResolution 选项设置为 node,还是要将别名添加到 paths 选项中?

在tsconfig.app.json中添加&#xff0c;记得一定是 tsconfig.app.json 中&#xff0c;如添加到 tsconfig.node.json 还是会报错的 哈哈哈哈&#xff0c;不瞒你们&#xff0c;我就添加错了&#xff0c;哈哈哈。所以这也算写一个demo提醒自己 "compilerOptions": {&qu…

深入理解指针1

目录 如对您有帮助&#xff0c;还望三连支持&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 1.内存和地址 计算机中常⻅的单位&#xff08;补充&#xff09;&#xff1a; 如何理解编址 2.指针变量和地址 2.1取地址操作符&#xff08;&&#xff09; 2.2指针变…

多个开源的js补环境框架测试

原文链接&#xff1a;https://mp.weixin.qq.com/s/uEMFGpE5bqmTvzSgX2twvA 前言 在做js逆向时肯定会遇到补环境的情况&#xff0c;看到github开源了好几个补环境用的框架&#xff0c;这篇文章做个测试&#xff0c;看看哪个比较好用。 https://github.com/pysunday/sdenvhttp…

Spring Boot3.x集成Disruptor4.0

Disruptor介绍 Disruptor是一个高性能内存队列&#xff0c;研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单&#xff0c;2010年在QCon演讲后&#xff0c;获得了业界关注。2011年&…

前端学习|第五章

HTML5&CSS3 新特性 前言HTML5 新特性一、语义化标签二、多媒体标签三、新增 input 类型四、新增表单属性 CSS3 新特性一、新增选择器二、盒子模型三、图片模糊处理四、calc 函数五、过渡 - transition六、2D 转换 - transform七、动画 - animation八、3D 转换 - translate3…