分布式 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.缺…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
