分布式之Paxos共识算法分析
写在前面
分布式共识是分布式系统中的重要内容,本文来一起看下,一种历史悠久(1998由兰伯特提出,并助其获得2003年图灵奖)的实现分布式共识的算法Paxos。Paxos主要分为两部分,Basic Paxos和Multi-Paxos,其中Basic Paxos用来使得一个值在多个副本集中达成共识,Multi-Paxos用来使得多个值在副本集中达成共识,所以Multi-Paxos可以看做是basic paxos的批量版本。下面我们就一起来看下吧!
1:paxos算法的角色和阶段
一部电影有各种角色(主角,配角,龙套),一部电视剧也一样,自然的,一个算法也是如此,paxos亦是如此,所以我们先来看下paxos都有哪些角色:
1:提议者(Proposer),负责发起某个值的修改,一般是多个副本中收到更新请求的那个副本
2:接受者(Acceptor),对提议的值进行投票,一般是多个副本中其他副本
3:学习者(learner),被动接收达成共识的值,一般是slave
可参考下图:


2:basic paxos
假定有客户端1和客户端2(作为提议者角色),在时间1和时间2(时间1早于时间2)分别发起设置x为2和x为7的提议,接受者有节点A,节点B,节点C,如下图:

该算法一共分为两个阶段,分别是准备阶段和接受阶段。另外达成共识传递的数据是(提案编号,提案值),提案编号可以认为是数据的版本号,时间越新,则编号越新,提案值就是要达成共识的值,首先我们按照上图进入准备阶段。假设客户端1的提案编号是1000,客户端2的提案编号是2000,则客户端1的完整消息是(1000,2),客户端2的完整消息是(2000,7)。
2.1:准备阶段
注意该阶段发送的消息,不需要提案值,因为只是确定在接受阶段使用哪个提案编号即可。
在时间1,节点A和节点B收到了客户端1的消息(1000,),节点C收到了客户端2的消息(2000,),因为此时是各个节点收到的第一条消息,所以都会返回尚无提案,以节点A为例,返回尚无提案的意思是,当前自己还没有通过任何提案,且保证,之后如果是收到小于1000的提案,则不会做任何响应,且不会通过任何编号小于1000的提案,如下图:

在时间2,节点A和节点B收到了客户端2的消息(2000,)因为2000>1000,所以节点A和节点B会给客户端2返回尚无提案,节点C收到了客户端1的消息(1000,),因为1000<2000,所以节点C不会对客户端1做出任何的响应,而是直接丢弃,如下图:

到这里准备阶段结束,进入接受阶段。
2.2:接受阶段
此时节点A,节点B,节点C所能够接受的最小提案编号是2000,所有提案编号小于等于2000的消息都将会被丢弃,如下图,

在一段时间后,客户端1和客户端2分别将消息(1000,2),(2000,7)发送给节点A,节点B,和节点C,如下图:

因为此时节点A,节点B,节点C所能够接受的最小提案编号是2000,所以来自客户端1消息(1000,2)将会被丢弃,而最终消息(2000,7)被接受,如下图:

这样节点A,节点B,节点C就对x的值达成了共识,即x=7。
2.3:源码实现
以上准备阶段和接受阶段源码实现参考这里 ,运行截图解释如下:

3:multi paxos
首先说明,兰伯特的论文中关于multi paxos的描述很抽象,并没有给出具体的方案以及实现,只是给出了一些概念,所以准确来说multi paxos只是一种思想,而非一种具体的算法,但是可以基于这种思想来提供具体的算法实现,比如chubby(类似于zookeeper的一种分布式服务框架)对于multi paxos的实现和落地。以及raft算法也是其具体实现。
在basic paxos中,分为了准备阶段和接受阶段,其中准备阶段用于确定某个数据的最新版本的修改,接受阶段用于同步值到所有的节点。这里需要准备阶段的原因是,可能存在多个提议者提案有冲突的情况,那么如果我们能够解决提案冲突的问题,是不是就可以将准备阶段取消掉了(会直接减少一半的网络交互,性能会得到极大的提高),multi paxos解决这个问题的方式是来引入一个leader节点,此时结构可能如下:

所有提案都从这个leader发出,因为只会从一个节点发出提案,也就不存在冲突的问题了,如下图:

那么当我们有多个值需要达成共识时,只需要进行多轮优化后的basic paxos就可以了。
写在后面
小结
本文分析了paxos算法的basic paxos和multi paxos,并详细分析了basic paxos,然后给出了具体的代码实现。最后,分析了basic paxos存在的问题,以及multi paxos基于此的优化。希望本文能够帮助到你。
参考文章列表
相关文章:
分布式之Paxos共识算法分析
写在前面 分布式共识是分布式系统中的重要内容,本文来一起看下,一种历史悠久(1998由兰伯特提出,并助其获得2003年图灵奖)的实现分布式共识的算法Paxos。Paxos主要分为两部分,Basic Paxos和Multi-Paxos,其中…...
35岁测试工程师,面临中年危机,我该如何自救...
被辞的原因 最近因故来了上海,联系上了一位许久不见的老朋友,老王;老王和我是大学同学,毕业之后他去了上海,我来到广州。因为我们大学专业关系,从12年毕业以后我们从事着相同的职业,软件自动化…...
时间轮算法概念
概述 在一些中间件中我们经常见到时间轮控制并发和熔断。 那么这个时间轮具体是什么呢,又是怎么使用的呢。 简介 其实时间轮可以简单的理解成我们日常生活中的时钟。 时钟里的指针一直在不停的转动,利用这个我们可以实现定时任务,目前lin…...
[SCTF2019]babyre 题解
对未来的真正慷慨,是把一切献给现在。 ——加缪 目录 1.查壳 2.处理花指令,找到main函数 这一操作过程可以参考下面的视频: 3.静态分析第一部分,psword1 4.静态分析第二部分,psword2 5.静态分析第五部分,psword3 6.根据ps…...
全志H3系统移植 | 移植主线最新uboot 2023.04和kernel 6.1.11到Nanopi NEO开发板
文章目录 环境说明uboot移植kernel移植rootfs移植测试环境说明 OS:Ubuntu 20.04.5 LTSGCC:arm-none-linux-gnueabihf-gcc 10.3.0编译器下载地址:Downloads | GNU-A Downloads – Arm Developer uboot移植 当前最新版本v2023.04-rc2下载地址:https://github.com/u-boot/u-…...
vue项目第四天
使用elementui tabplane组件实现历史访问记录组件的二次封装<el-tabs type"border-card"><el-tab-pane label"用户管理">用户管理</el-tab-pane><el-tab-pane label"配置管理">配置管理</el-tab-pane><el-tab-…...
「C语言进阶」数据内存的存储
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰数据类型的介绍 🐰类型的意义 🐰数据类型的基本归类…...
面试必问:进程和线程的区别(从操作系统层次理解)
1.什么是进程?为什么要有进程? 进程有一个相当精简的解释:进程是对操作系统上正在运行程序的一个抽象。 这个概念确实挺抽象,仔细想想却也挺精准。 我们平常使用计算机,都会在同一时间做许多事,比如边看…...
ModuleNotFoundError: No module named ‘apex‘与 error: legacy-install-failure
ModuleNotFoundError: No module named ‘apex’ ModuleNotFoundError: No module named apex 表示 Python 在搜索模块时无法找到名为 apex 的模块。这通常是因为您没有安装 apex 模块或安装不正确。 apex 是一个针对混合精度训练和优化的 PyTorch 扩展库,您可以通过…...
Python3 VScode 配置
Python3 VScode 配置 在上一章节中我们已经安装了 Python 的环境,本章节我们将介绍 Python VScode 的配置。 准备工作: 安装 VS Code 安装 VS Code Python 扩展 安装 Python 3 安装 VS Code VSCode(全称:Visual Studio Code&…...
VMware 修复了三个身份认证绕过漏洞
Bleeping Computer 网站披露,VMware 近期发布了安全更新,以解决 Workspace ONE Assist 解决方案中的三个严重漏洞,分别追踪为 CVE-2022-31685(认证绕过)、CVE-2022-31686 (认证方法失败)和 CVE-…...
实现一个简单的Database10(译文)
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者: 花家舍文章来源:GreatSQL社区原创 前文回顾 实现一个简单的Database系列 译注:csta…...
CTF-取证题目解析-提供环境
一、安装 官网下载:Volatility 2.6 Release 1、将windows下载的volatility上传到 kali/home 文件夹里面 3、将home/kali/vol刚刚上传的 移动到use/sbin目录里面 mv volatility usr/local/sbin/ 切换到里面 cd /usr/local/sbin/volatility 输入配置环境echo $PAT…...
计算机基础 | 网络篇 | TCP/IP 四层模型
前沿:撰写博客的目的是为了再刷时回顾和进一步完善,其次才是以教为学,所以如果有些博客写的较简陋,是为了保持进度不得已而为之,还请大家多多见谅。 一、OSI 七层模型 参考文章:OSI 和 TCP/IP 网络分层模型…...
实时数据仓库
1 为什么选择kafka? ① 实时写入,实时读取 ② 消息队列适合,其他数据库受不了 2 ods层 1)存储原始数据 埋点的行为数据 (topic :ods_base_log) 业务数据 (topic :ods_base_db) 2)业务数据的有序性&#x…...
leetcode 1250. 检查「好数组」
给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。 示例 1&…...
JDK动态代理和CGLib动态代理的区别
原文网址:JDK动态代理和CGLib动态代理的区别_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java中JDK动态代理和CGLib动态代理的区别。 区别概述 项 JDK动态代理 CGLIB动态代理 接口是否需实现 只能代理实现了接口的类。 可以代理没有实现接口的类。 原理 继承…...
Leetcode.1250 检查「好数组」
题目链接 Leetcode.1250 检查「好数组」 Rating : 1983 题目描述 给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1,那么原数组就是一个「…...
WMS系统推荐,如何选到适合企业的仓库管理系统
市场上有很多WMS系统,但是现在很多仓库管理系统都在使用WMS系统。那么在选择WMS系统时应该考虑什么呢?明确业务发展特征,准确表达能力目标许多物流企业在选择物流管理系统时,往往会被物流管理系统的整体系统所迷惑,在功…...
C语言的期末复习
🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢&a…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
