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

ZAB协议

概述

很多人应该都使用过ZooKeeper, 它是一个开源的分布式协调服务,比如你可以用它进行配置管理、名字服务等。在ZooKeeper中,数据是以节点的形式存储的。如果你要用ZooKeeper做配置管理,那么就需要在里面创建指定配置,假设创建节点/geekbang和/geekbang/time,步骤如代码所示:

[zk: localhost:2181(CONNECTED) 0] create /geekbang 123
Created /geekbang
[zk: localhost:2181(CONNECTED) 1] create /geekbang/time 456
Created /geekbang/time

我们分别创建了配置节点/geekbang和/geekbang/time,对应的值分别为123和456.那么在这里提个问题:你觉得在ZooKeeper中能用兰伯特的Multi-Paxos实现各节点数据的公式一致吗?
当然不行。因为兰伯特的Multi-Paxos虽然能保证达成共识后的值不再改变,但它并不关心达成共识的值是什么,也无法保证各值(也就是操作)的顺序性。而这时ZAB协议着力解决的,也是你理解ZAB协议的关键。
为了更好地理解这个协议,接下来将分别以如何实现操作的顺序性、领导者选举、故障恢复、处理读写请求为例展开具体讲解。希望能在全面理解ZAB协议的同时,加深对Paxos算法的理解,接下来,我们从ZAB协议的最核心设计目标(如何实现操作的顺序型)出发,了解它的基础原理。
老规矩,我们先来看一道思考题。
假如有一个由节点A、B、C组成的分布式集群(如图所示),我们要设计一个算法来保证指令(比如X、Y)执行的顺序型,比如指令X在指令Y之前执行,那么我们该如何设计这个算法呢?
在这里插入图片描述

如何实现操作的顺序型?

在了解如何实现操作的顺序性之前,我们先来了解下为什么Multi-Paxos无法保证操作的顺序性。

为什么Multi-Paxos无法保证操作的顺序性

为了让你真正理解这个问题,举个具体的例子演示以下(为了演示方便,我们假设当前所有节点上被选定指令的最大序号都为100,那么新提议的指令对应的序号就会是101),假设这时节点A故障了,新当选的领导者为节点B.节点B当选领导者后,需要先作为学习者了解目前已被选定的指令。节点B学习之后,发现当前被选定指令的最大序号为100(因为节点A故障了,它的被选定指令的最大序号102无法被节点B发现),那么它可以从序号101开始提议新的指令。这时节点B接收到客户端请求,并提议指令Z,指令Z被成功复制到节点B、C,如图所示。在这里插入图片描述
在这里插入图片描述

假设这时节点B故障了,节点A故障恢复了,选举出领导者C后,节点B故障也恢复了。节点C当选领导者后,需要先作为学习者了解目前已被选定的指令,这时它执行Basic Paxos的准备阶段就会发现之前选定的值(比如Z、Y),然后发送接受请求,最终在序号101、102达成共识的指令是Z、Y,如图所示。在这里插入图片描述

可以看到,原本预期的指令是X、Y,最后变成了Z、Y。现在,你应该可以知道为社么Multi-Paxos不能达到我们想要的结果了吧?
这个过程其实很明显地验证了"Multi-Paxos虽然能保证达成共识后的值不再改变,但它不关心达成共识的值是什么"。
我们接着回到前面的问题,假设我们在ZooKeeper中直接使用了兰伯特的Multi-Paxos,那么系统在创建节点/geekbang和/geekbang/time时就可能会出现先创建节点/geekbang/time的情况,这样肯定就出错了,如代码所示

[zk: localhost:2181(CONNECTED) 9] create /geekbang/time 456
Node does not exist: /geekbang/time

因为创建节点/geekbang/time时找不到节点/geekbang,所以创建失败。
在这里多说几句,除了Multi-Paxos,兰伯特还有很多关于分布式的理论,这些理论都很经典(比如拜占庭将军问题),但也因为提出的时间太早了,与实际场景结合的不多,所以后续的众多算法都在这些理论的基础上做了大量的改进(比如,PBFT、Raft等算法)。
另外再延申一下,其实ZAB论文"Zab:High-Performance Broadcast for Primary-Backup System"中关于Paxos问题的分析是有争议的。ZooKeeper当时应该考虑的是Multi-Paxos,而不是有多个提议者的Basic Paxos.因为在Multi-Paxos中,领导者作为唯一提议者,是不存在同时有多个提议者的情况。也就是说,Paxos(更确切地说是Multi-Paxos)无法保证操作的顺序性,但问题的原因不是ZAB论文中演示的原因,本质上是因为Multi-Paxos实现的是一系列值的共识,而不关心最终达成共识的值是什么,也不关心各值得顺序,就像上面演示的过程那样。
既然Multi-Paxos不合适,ZooKeeper是如何实现操作的顺序性的呢?答案是它采用了ZAB协议。
你可能会说:Raft算法可以实现操作的顺序性,为什么ZooKeeper不采用Raft算法呢?这个问题的答案其实比较简单,因为Raft算法是在2013年才正式提出,而ZooKeeper是在2007年开发出来的。

注意

说到ZAB协议,很多人可能有这样的疑问:为什么ZAB协议的作者在"Zab vs. Paxos"宣称ZAB协议不是Paxos算法,但又有很多资料提到ZAB协议是
Multi-Paxos算法呢?究竟该如何理解呢?
我的看法是,你可以把它理解为Multi-Paxos算法。因为技术是发展的,概念的内涵也在变化。ZAB协议与Raft算法(主备、强领导者模型)非常类似,它是作为共识算法和Multi-Paxos算法提出的。当它被广泛接受和认可后,共识算法的内涵也就丰富和发展了,不仅能实现一系列值的共识,还能保证值的顺序性。同样,Multi-Paxos算法不仅指代多次执行Basic Paxos的算法,还能指代主备、强领导者模型的共识算法。
当然,在学习技术过程中,我们不可避免地遇到有歧义、有争议地信息,比如,有人提到,“从网桑搜了搜相关资料,发现大部分资料将谣言传播等同于Gossip协议,也有把反熵等同于Gossip协议地,感到很迷惑”。这就需要我们不仅要在平时地工作和学习中认真、全面地学习理论,掌握概念地内涵,还要能"包容"和"发展"着理解技术

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

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

相关文章

2024.5.5 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、匹配问题 5、SuperGlue架构 5.1、注意力图神经网络(Attentional Graph Neural Network) 5.2、最佳匹配层(Optimal matching layer) 5.3、损失 6、实验 6.…

模型剪枝——Linear Combination Approximation of Feature for Channel Pruning

线性逼近剪枝代码实现见文末 论文地址:CVPR 2022 Open Access Repositoryhttps://openaccess.thecvf.com/content/CVPR2022W/ECV/html/Joo_Linear_Combination_Approximation_of_Feature_for_Channel_Pruning_CVPRW_2022_paper.html 1.概述 传统的剪枝技术主要集中在去除对…

4.【Orangepi Zero2】Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90)

Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90) signalsetitimer示例 软件PWM驱动舵机(SG90) signal 详情请看Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、si…

经纬度聚类:聚类算法比较

需求: 将经纬度数据,根据经纬度进行聚类 初始数据 data.csv K均值聚类 简介 K均值(K-means)聚类是一种常用的无监督学习算法,用于将数据集中的样本分成K个不同的簇(cluster)。其基本思想是…

支付宝支付流程

第一步前端:点击去结算,前端将商品的信息传递给后端,后端返回一个商品的订单号给到前端,前端将商品的订单号进行存储。 对应的前端代码:然后再跳转到支付页面 // 第一步 点击去结算 然后生成一个订单号 // 将选中的商…

Django之单文件上传(以图片为例)

一,创建项目 初始化,数据迁移,创建superuser,创建app等 二,配置settings.py 1,配置数据库(本作者使用的mysql),以前文章有提到 2,配置静态文件存放路径 STAT…

2-手工sql注入(进阶篇) sqlilabs靶场5-10题

1. 阅读,学习本章前,可以先去看看基础篇:1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战,关于sqlilabs靶场的搭建:Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap,关于sqlmap的命令&…

Vitis HLS 学习笔记--HLS流水线基本用法

目录 1. 简介 2. 示例 2.1 对内层循环打拍 2.2 对外层循环打拍 2.3 优化数组访问后打拍 3. 总结 1. 简介 本文介绍pipeline的基本用法。pipeline是一种用于提高硬件设计性能的技术。本文介绍了pipeline在累加计算函数中的应用。通过优化内外层循环和数组访问&#xff0c…

C++初学者,使用汉语编程

现在的IDE是完全支持中文编程的,对于C语系的爱好者来说,又可以发挥自己的想象力了。 今天使用一些宏定义写了一个小程序,用于玩弄C.

合合信息embedding模型登顶MTEB中文榜单:中文文本向量化技术的创新突破

引言MTEB中文榜单:权威性与挑战并存Embedding:特征与优势凸显模型应用:开启文本智能新篇章升级迭代:攻克行业技术难点结尾 引言 在信息化时代,文本数据呈爆炸式增长,如何高效、准确地处理和分析这些文本数…

Vue3-element-plus表格

一、element-plus 1.用组件属性实现跳转路由 <el-menu active-text-color"#ffd04b" background-color"#232323" :default-active"$route.path" //高亮 text-color"#fff"router><el-menu-item index"/article/channe…

【算法刷题日志】吸氧羊的StarryCoding之旅 - 贡献法计算

题目链接&#xff1a;https://www.starrycoding.com/problem/3 题目描述 吸氧羊终于注册了一个StarryCoding账号&#xff01;&#xff08;她很开心&#xff09; 但是吸氧羊忘记了它的密码&#xff0c;她想起你是计算机大师&#xff0c;于是就来请教你。 她虽然不记得密码了…

C++ | Leetcode C++题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution { public:int climbStairs(int n) {double sqrt5 sqrt(5);double fibn pow((1 sqrt5) / 2, n 1) - pow((1 - sqrt5) / 2, n 1);return (int)round(fibn / sqrt5);} };

SPI(通信协议)

简介 SPI是一个同步的数据总线&#xff0c;也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。 时钟是一个震荡信号&#xff0c;它告诉接收端在确切的时机对数据线上的信号进行采样。 产生时钟的一侧称为主机&#xff0c;另一侧称为从机。总是…

VMware虚拟机中ubuntu使用记录(6)—— 如何标定单目相机的内参(张正友标定法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、张正友相机标定法1. 工具的准备2. 标定的步骤(1) 启动相机(2) 启动标定程序(3) 标定过程的操作(5)可能的报错 3. 标定文件内容解析 前言 张正友相机标定法…

编译 x264 for iOS

文章目录 编译在 FFMpeg 启用 x264其他编译选项报错处理 环境 &#xff1a; macOS 14.3.1 x264 - 20191217-2245 编译 1、下载 x264 源码 http://download.videolan.org/pub/videolan/x264/snapshots/ 这里我下载x264-snapshot-20191217-2245.tar.bz2 &#xff08;截止2024-…

OpenAI下周将发布ChatGPT搜索引擎,挑战谷歌搜索!

目前&#xff0c;多方位消息证实&#xff0c;OpenAI将会在5月9日上午10点公布该消息&#xff0c;大约是北京时间周五的凌晨2点。 5月3日&#xff0c;前Mila研究员、麻省理工讲师Lior S爆料&#xff0c;根据OpenAI最新的SSL证书日志显示&#xff0c;已经创建了search.chatgpt.c…

Flutter笔记:Widgets Easier组件库(12)使用消息吐丝(Notify Toasts)

Flutter笔记 Widgets Easier组件库&#xff08;12&#xff09;使用消息吐丝&#xff08;Notify Toasts&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 29114848416…

ICode国际青少年编程竞赛- Python-1级训练场-基础训练2

ICode国际青少年编程竞赛- Python-1级训练场-基础训练2 1、 a 4 # 变量a存储的数字是4 Dev.step(a) # 因为变量a的值是4&#xff0c;所以Dev.step(a)就相当于Dev.step(4)2、 a 1 # 变量a的值为1 for i in range(4):Dev.step(a)Dev.turnLeft()a a 1 # 变量a的值变为…

C语言数据结构之队列

目录 1.队列的概念及结构2.队列的实现逻辑3.队列的代码实现4.相关例题选择题 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#x…