分布式 Paxos算法 总结
前言
相关系列
- 《分布式 & 目录》
- 《分布式 & Paxos算法 & 总结》
- 《分布式 & Paxos算法 & 问题》
参考文献
- 《图解超难理解的 Paxos 算法(含伪代码)》
- 《【超详细】分布式一致性协议 - Paxos》
Basic-Paxos @ 基础帕克索斯算法
Paxos算法是目前公认解决分布式一致性问题的最有效算法之一,甚至可以说它是过去几十年里一切分布式一致性算法的源头。我们对Paxos算法进行描述时通常都会带上“容错&共识”两个关键字,那么它们具体代表的是什么呢?
- 容错:是指分布式系统在部分节点宕机的情况下依然能够对外提供服务,即CAP理论中的分区容错性;
- 共识:是指分布式系统的各节点都能就某个操作达成共识,即所有节点都批准执行这个操作。例如在分布式系统中操作A/B都想访问某服务,那么令集群中的所有(超半数/自定义数量)服务都批准执行操作A/B的的过程就是所谓的达成共识。
概念
在正式对流程进行阐述之前,我们需要先对Paxos算法的各类角色&变量进行讲解。Paxos算法具有四类角色…其名称/作用具体如下:
- client @ 客户端:负责向提案者发送操作请求;
- proposer @ 提案者:提案者负责接收&封装客户端的操作请求为proposal @ 提案,并为之生成全局唯一&增长的编号。随后向各接收者广播准备/接收请求,并根据其返回的通过/批准情况决定是否继续发送接收请求/判定其已达成一致;
- acceptor @ 接收者:接收者负责对准备&接收请求中的提案进行判定,以决定是否通过/批准该提案;
- learner @ 学习者:学习者负责获取已达成共识的提案并应用于分布式系统中。
Paxos算法具有三类“持久化”变量…其名称/作用具体如下:
- maxProposal @ 最大提案:接收者在准备请求中通过的最大提案编号;
- acceptedProposal @ 已批准提案:接收者在接收请求中批准的最大提案编号;
- acceptedValue @ 已批准值:接收者在接收请求中批准的最大提案值。
流程
Paxos算法的流程分为“批准/获取”两个部分,这其中“批准”部分负责提案的实际批准,具体又可分为“准备/接收”两个阶段;而“获取”部分则负责提案批准后的对外开放。关于提案批准的完整流程具体如下:
- prepare @ 准备阶段:提案者在接收到客户端的操作请求后,其会将之封装为提案并为之生成全局唯一&增长的编号,关于全局编号的具体生成方式此处不予讨论;
- 提案者会向各接收者广播(即全体发送)准备(当前提案编号)请求;
- 各接收者在收到准备(当前提案编号)请求后会比较“当前提案编号”和“最大提案”的大小,如果“当前提案编号” > “最大提案”则记录“最大提案”为“当前提案编号”并返回通过回应。而如果该接收者曾chosen @ 选中/批准过某项提案,则“已批准提案/已批准值”会随通过回应一同返回;否则便会无视请求/返回拒绝回应。而在未能收到超过半数/自定义数量通过回应的情况下,提案者会为提案生成重新新编号并再次开始流程;
- accept @ 接收阶段:提案者在收到超过半数/自定义数量的通过回应后会向接收者广播接收(当前提案编号&当前提案值)请求。如果在之前的准备请求回应中存在“已批准值”,那么在接收请求中携带的“当前提案值”就必须应用该值;否则就由当前提案者负责自定义。通过该规则可以得知:Paxos算法只支持单个值/操作的共识;
- 各接收者在收到接收(当前提案编号&当前提案值)请求后会再次比较“当前提案编号”与“最大提案”的大小,如果“当前提案编号” >= “最大提案”则记录“已批准提案&已批准值”为“当前提案编号&当前提案值”,并将“当前提案编号”返回,意味着已批准当前提案;否则便将原本的“最大提案”返回;
- 提案者在收到超过半数/自定义数量的“当前提案编号”后便会认为各接收者已对当前提案达成共识,至此该提案便可以被学习者所获取&应用于分布式系统了;否则便意味着当前提案被否决,提案者需要为提案重新生成新编号以再次开始流程。
当提案达成共识后,如何让学习者获取该提案也是值得细究的问题。提案获取通常有以下几种方案:
- 全量发送:接收者一旦批准提案便将该提案广播给所有学习者。这种做法虽然可以让学习者尽快的获得批准提案,但是却需要每个接收者与所有学习者逐一进行通信,通信次数为二者乘积,所以效率较低;
- 主从同步:选定主学习者,提案批准后由接收者通知主学习者,并由主学习者负责通知其它的学习者。这个方案虽然多了一个步骤,但是通信次数大大降低,通信次数为学习者的数量。该方案同时引出另一个问题:主学习者随时可能出现故障。
- 多主从同步:在主从同步的基础上,由单个主学习者扩展成一个主学习者集合。集合中学习者数量越高,可靠性也越好。
模拟
为了更好的熟悉Paxos算法,此处我们举例描述Paxos算法“提案批准”的完整过程,该案例中的Paxos集群共有A/B/C三个节点。注意!这里的任意节点都可同时扮演提案者&接收者。
提案者A/B分别将X赋值成3/5的操作请求封装为提案,并为之生成全局唯一&增长的编号1/2,随后向各接收者广播。在准备阶段它们的交互结果如下:
- 提案者A/B分别进入准备阶段,并向各接收者广播准备(1/2)请求;
- 接收者A/B在收到提案者A的准备(1)请求后发现自身并没有通过/批准任何准备/接收请求,因此直接返回空的通过回应;
- 接收者C由于在收到&通过提案者B的准备(2)请求之后再收到提案者A的准备(1)请求,并且提案者B的提案编号2大于提案者A的提案编号1,因此无视了准备(1)请求/返回了拒绝回应;
- 接收者A/B在收到提案者B的准备(2)请求后由于其提案编号2 > 已通过的提案编号1,因此两者都会返回空的通过回应。
由于提案者A/B的准备请求都收到了超过半数的通过回应,因此提案者A/B都将进入Paxos算法的接收阶段。
- 提案者A向各接收者广播接收(1&3)请求。由于之前的通过回应中没有携带“已批准提案”,因此提案的值可以完全自定义;
- 接收者A/B/C在收到接收(1&3)请求后,由于其之前已经各自通过了准备(2)请求,因此其都会返回提案编号2来表示未曾批准该请求;
- 提案者A在收到回应后发现提案编号2比自己的提案编号1大,因此知晓自身提案未曾被批准,因此重新回到准备阶段进行协商;
- 提案者B向各接收者广播接收(2&5)请求。由于之前的通过回应中没有携带“已批准提案”,因此提案的值可以完全自定义;
- 接收者A/B/C在收到接收(2&5)请求后,由于其都未通过提案编号更大的准备请求,因此其都会返回提案编号2来表示批准了该请求;
- 提案者B在收到回应后发现提案编号2与自身提案编号相同且数量超过半数,因此判定接收者对该提案已达成共识,学习者可正式获取&应用该提案。
在提案批准的流程中还有一种常见的情况是接收者在已批准某项提案的情况下收到提案编号更大的准备请求,这种情况下其就需要在通过回应中返回已批准提案的编号&值…模拟如下:
- 提案者B向各接收者广播接收(3&6)请求;
- 接收者A收到&批准了提案者B的接收(3&6)请求;
- 提案者A向各接收者广播准备(4)请求;
- 接收者B/C收到&通过提案者A的广播准备(4)请求,并因此未批准提案者B的接收(3&6)请求;
- 接收者A收到&通过提案者A的准备(4)请求,并在通过回应中携带了已批准提案编号&值(3&6);
- 提案者B判定接收者未能就提案达成共识,重新进入准备阶段;
- 提案者A因为收到超过半数的通过请求而进入接收阶段,向各接收者广播接收(4&6)请求。这其中6是因为在之前接收者A的通过回应中包含有已批准提案值,因此该值便被作为了提案者A的提案值;
- 接收者A/B/C收到&批准了接收(4&6)请求,提案者A判定各接收者已就该提案达成共识。
Multi-Paxos算法 @ 多帕克索斯算法
原始的Basic-Paxos算法只能达成一个值/操作的共识,而Leslie Lamport则提出可以通过多次执行Basic-Paxos算法来达成一系列值/操作的共识。但由于多次协商会增加通信开销&影响协商活性(即指协商进入死循环),因此Leslie Lamport则进一步提出了名为Multi-Paxos算法的解决方案。
Multi-Paxos算法对于Basic-Paxos算法的主要区别在于其引入了领导提案者的概念。在Multi-Paxos算法中,提案(准备&接收)请求的发送是由领导提案者专属负责的。Multi-Paxos系统会在启动时先通过Basic-Paxos算法从各提案者中选举出唯一的领导提案者用于“串行”发送提案请求,这样就能避免并发提交而解决Basic-Paxos算法的活锁(接收者不断通过编号更大的提案而导致无法批准已通过的旧提案,该问题正常情况下可通过随机延迟的方式进行缓解)问题。此外由于领导提案者会连续发送提案请求,因此除去首个提案请求需要完整执行准备&接收两个阶段(为了应对网络分区而保留,否则也可以不执行)外,后续提案请求的发送都可以只执行接收阶段,从而便能减少RPC来提升共识的达成效率。
Multi-Paxos算法可以支持多领导提案者并存的场景。在实际的Multi-Paxos系统中,由于网络分区情况的存在,其可能出现选举出多个领导提案者的情况。对于这种情况Multi-Paxos算法是提供支持的,因为如此一来其会自动退化成Basic-Paxos算法的多次执行场景。
领导提案者的宕机会导致Multi-Paxos系统不可用。对于一个功能完善的Multi-Paxos系统,其应该具备对领导提案者的故障监测&转移功能。理论上,领导提案者需要不断向系统中的其它节点发送心跳以表示自身存活,而一旦在指定时间内未收到心跳(及一系列综合性盘点),那么Multi-Paxos系统就会判定领导提案者已经宕机。这种情况下其就会选举新的领导提案者来代替工作,即使旧领导提案者只是因为网络分区而无法连接。而在不存在可用提案者的情况下,Multi-Paxos系统将陷入不可用的状态。
相关文章:

分布式 Paxos算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & Paxos算法 & 总结》《分布式 & Paxos算法 & 问题》 参考文献 《图解超难理解的 Paxos 算法(含伪代码)》《【超详细】分布式一致性协议 - Paxos》 Basic-Paxos 基础帕克索斯算法…...
我的宝贵经验
在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它是知识传承的载体,是团队协作的桥梁,更是产品成功的幕后英雄。然而,打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼?是否纠结…...

geoserver 瓦片地图,tomcat和nginx实现负载均衡
在地理信息系统(GIS)领域,GeoServer作为一个强大的开源服务器,能够发布各种地图服务,包括瓦片地图服务。为了提高服务的可用性和扩展性,结合Tomcat和Nginx实现负载均衡成为了一个有效的解决方案。本文将详细…...
Jenkins 启动 程序 退出后 被杀死问题
参考 Spawning Processes From Build (jenkins.io) 解决jenkins脚本启动项目后进程被杀死_jenkins杀进程-CSDN博客...

SEGGER | 基于STM32F405 + Keil - RTT组件01 - 移植SEGGER RTT
导言 RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的技术,它结合了SWO和半主机的优点,具有极高的性能。 使用RTT可以从MCU非常快速输出调试信息和数据,且不影响MCU实时性。这个功能可以用于很多支持J-Link的设备和MCU࿰…...
分布式开发学习
1、kratos的特点 gRPC:Kratos 默认支持 gRPC,提供高性能的远程调用能力,适用于微服务间通信。 HTTP :同时支持 HTTP/1.1 和 HTTP/2,方便微服务与外部系统交互。 Protocol Buffers: protoc 工具生…...

freeswitch(开启支持MCU视频会议,使用mod_av模块)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景说明: 有些场景想使用视频会议MCU融合画面进行开会使用方法: 第一步:下载插件 yum install -y epel-release yum install...
Vue3常见api使用指南(TS版)
defineProps() 和 defineEmits() 内置函数,无需import导入,直接使用。传入到 defineProps 和 defineEmits 的选项会从 setup 中提升到模块的范围。因此,传入的选项不能引用在 setup 范围中声明的局部变量(比如设置默认值时),但是…...

分布式 分布式事务 总结
前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节…...
onnx文件转pytorch pt模型文件
onnx文件转pytorch pt模型文件 1.onnx2torch转换及测试2.存在问题参考文献 从pytorch格式转onnx格式,官方有成熟的API;那么假如只有onnx格式的模型文件,该怎样转回pytorch格式? https://github.com/ENOT-AutoDL/onnx2torch提供了…...

智能座舱人机交互升级
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…...

RabbitMQ中点对点(Point-to-Point)通讯方式的Java实现
RabbitMQ是一个广泛使用的开源消息代理软件,它实现了高级消息队列协议(AMQP)。RabbitMQ支持多种消息传递模式,其中最基本的是点对点(Point-to-Point)通讯方式。在这种模式下,消息生产者将消息发…...
爬虫实战:获取1688接口数据全攻略
引言 在电商领域,数据的重要性不言而喻。1688作为中国领先的B2B电商平台,提供了海量的商品数据。通过爬虫技术获取这些数据,可以帮助企业进行市场分析、价格监控和供应链管理。本文将详细介绍如何使用Python爬虫技术合法合规地获取1688接口数…...

生成树协议STP工作步骤
第一步:选择根桥 优先级比较:首先比较优先级,优先级值越小的是根桥MAC地址比较:如果优先级相同,则比较MAC地址。MAC地址小的是根桥。 MAC地址比较的时候从左往右,一位一位去比 第二步:所有非根…...
Android14 AOSP支持短按关机
修改frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java diff --git a/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/base/services/core/java/com/android/server/policy/PhoneWindowManager.java in…...
C# 和 go 关于can通信得 整理
在C#中开发CAN(Controller Area Network)通信接口时,确实有一些现成的NuGet包可以简化你的开发工作。这些库通常提供了与CAN硬件接口通信所需的基本功能,如发送和接收CAN消息。下面是一些常用的NuGet包: PCANBasic.NET…...
vue常用命令汇总
nvm 一个nodejs版本管理工具,解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 npm 可以管理 nodejs 的第三方插件。 vue-cli 是Vue提供的一个官方cli,专门为单页面应用快速搭建繁杂的脚手架。 nginx 是一个高性能的HTTP和反向代理we…...

【C++习题】18.逆波兰表达式求值
题目:逆波兰表达式求值 链接🔗:逆波兰表达式求值 题目: 代码: class Solution {public:int evalRPN(vector<string>& tokens) {stack<int> s;for (size_t i 0; i < tokens.size(); i){string&a…...
本地如何使用 yarn link 调试本地 npm 包
如何使用 yarn link 调试本地 npm 包: 在前端开发中,通常我们会开发并使用许多 npm 包来实现项目的功能。随着开发的深入,我们经常需要调试或修改某些 npm 包的源码。如果你正在开发一个 npm 包,并且希望在本地项目中进行调试&am…...
江恩45年一书的自己一点读书见解
读了下江恩的华尔街45年,有些浅薄的体会,记录下 江恩的华尔街45年里面,感触比较深刻的有以下几点: 1.为什么会亏钱 1.利用大仓位来过度交易,违背了资本安全的原则。买卖过于频繁 2.没有用止损单来保护你的交易。 3.缺…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...