分布式与一致性协议之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,一经查实,立即删除!

相关文章

OceanBase 分布式数据库【信创/国产化】- OceanBase 平台产品 - 迁移评估工具 OMA

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 平台产品 - 迁移评估工具 OMA前言OceanBase 数据更新架构OceanBase 平台产品 - 迁移评估工具 OMA兼容性评估性能评估导出 OceanBase 数据库对象和 SQL 语句OceanBase 分布式数据库【信创/国产…

Rust入门篇:数据类型

文章目录 前言整数类型浮点数类型布尔类型字符类型字符串字面量元组类型数组类型切片类型枚举类型结构体类型指针类型最后 前言 你好,我是醉墨居士,前面我们学习了如何使用rust在控制台进行输出,接下来我将带给大家一些关于计算机的基础知识…

自动化测试——Selenium:开启Web应用测试的新篇章

自动化测试——Selenium:开启Web应用测试的新篇章 摘要: 随着Web技术的迅猛发展,Web应用的质量和性能成为了企业竞争力的重要指标。自动化测试作为软件测试领域的重要技术,对于提高测试效率、保证产品质量具有显著优势。Selenium…

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.概述 传统的剪枝技术主要集中在去除对…

力扣:100275. K 周期字符串需要的最少操作次数(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个长度为 n 的字符串 word 和一个整数 k &#xff0c;其中 k 是 n 的因数。 在一次操作中&#xff0c;你可以选择任意两个下标 i 和 j&#xff0c;其中 0 < i, …

《LeetCode力扣练习》代码随想录——贪心算法(分发糖果---Java)

《LeetCode力扣练习》代码随想录——贪心算法&#xff08;分发糖果—Java&#xff09; 刷题思路来源于 代码随想录 135. 分发糖果 贪心 class Solution {public int candy(int[] ratings) {int[] result new int[ratings.length];result[0] 1;for (int i 1; i < ratings.…

【AI+自动驾驶】由山西运城问界M7事故和梅大高速事故浅谈自动驾驶技术

这个节假日刷了刷短视频, 发现有2个悲惨的事情 比较火。1个是山西运城问界M7 115公里/每小时 撞击 洒水车&#xff0c; 1个是 广东梅大高速坍塌事故48人去世。 本文不谈这2件事情的是错对非&#xff0c;逝者为大&#xff0c;对生命保持敬畏。 从技术角度分析&#xff0c; 如果…

docker安装etcd和etcd客户端

docker安装etcd docker run --name etcd -d -p 2379:2379 -p 2380:2380 -e ALLOW_NONE_AUTHENTICATIONyes bitnami/etcd:3.3.11 etcdetcd客户端安装 https://github.com/etcd-io/etcd/releases客户端命令测试测试 设置/更新key&value ./etcdctl put name user.name获取…

nacos v2.2.3 docker简单安装使用

nacos v2.2.3 docker简单安装使用 Nacos 官方文档&#xff1a; https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html 控制台&#xff1a; http://127.0.0.1:8848/nacos/ 初始用户名、密码&#xff1a; 账号&#xff1a;nacos 密码&#xff1a;nacos 启动docker…

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

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

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

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

支付宝支付流程

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

力扣数据库题库学习(5.4日)--1667. 修复表中的名字

1667. 修复表中的名字 问题链接 解题思路 使用 SUBSTRING() 函数获取每个名字的第一个字符和剩余字符。 使用 UPPER() 函数将第一个字符转换为大写。 使用 LOWER() 函数将剩余字符转换为小写。 使用 CONCAT() 函数将第一个字符和剩余字符组合成名字。 最后按照 user_id 对结…

大数据分析入门10分钟快速了解SQL

SQL是什么&#xff1f; SQL全称Structured Query Language(结构化查询语言”) 为什么要用SQL&#xff1f; SQL通用 常见的表格分析操作&#xff0c;Excel也能做&#xff0c;为什么不用呢&#xff1f; 因为处理上亿行大数据时&#xff0c;Excel并不够用。 而常见的大数据引…

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

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

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

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

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

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

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

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

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

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