目录

Paxos 是什么(What)

Paxos 的目的(Why)

角色与职责(Who)

基本流程(How)

常见问题与对策

什么是多数派(Quorum)

Paxos vs Raft 异同点


Paxos 是什么(What)

核心问题:在节点可能宕机、网络可能乱序/丢失的环境里,让副本对一个值达成一致(共识),并保证安全性:系统绝不会最终选出两个不同的值;在条件稳定时还要有活性:最终能选出一个值。

Safety(安全性):永远不会发生坏事。在共识里指不会选出两个不同的值、不会破坏不变量。

Liveness(活性):好事最终会发生。只要条件稳定(如有多数派、网络稳定),最终会选出一个值。

Single-Decree Paxos:只为一次决议选择一个值(例如第 k 个位置的值是什么)。它证明:一旦某值被多数派接受,这个值就是全局唯一的被选定值

Multi-Paxos:把单次决议按槽位/索引重复,形成一条复制日志(slot 0、1、2…)。实践里通常选出一个稳定 Leader:第一步先做一次准备(Phase 1),随后大量槽位直接走接受阶段(Phase 2),从而把消息轮次降到近似两个来回/条目

与 2PC 的关系:两阶段提交(2PC)假定可靠协调者,一旦协调者崩溃就可能阻塞;Paxos 则通过多数派 + 可抢占编号 + 持久化承诺/接受来保证崩溃容错下的安全性(即使协调者样的角色失败,也不会选出两个值),在网络稳定时还能继续前进。

槽位/索引(slot/index):Multi-Paxos 中每一次决议对应的位置
可抢占编号:谁的排队号大,谁就能接着推进
持久化承诺 / 接受:说过的话、同意的事,要写在纸上存好,不能反悔。也就是会存到硬盘里

用一段话区分共识(决定一个值)与复制日志(决定很多值)

共识(决定一个值)关注的是对某一个槽位最终选哪个值,确保系统在任何时刻都不会出现两个不同的被选定值;达成一次就结束。复制日志(决定很多值)则把对单个槽位的共识按序多次执行,为每个槽位各自达成一次共识,进而得到一条全体副本顺序一致的操作序列;只要状态机是确定性的,把这条日志在各副本重放,就能得到同样的状态与输出。因此,共识是原子“砖块”,复制日志是把许多砖块按顺序砌成墙;Multi-Paxos 是用 Paxos 砖块去砌这堵一致的日志之墙。

状态机是确定性的:同样的初始状态 + 同样的指令顺序,一定会得到同样的结果和最终状态

Paxos 的目的(Why)

目标
Safety(安全性)永远成立:协议在任何时刻都不会让同一槽位产生两个不同的被选定值。Liveness(活性)在良好条件下成立:出现稳定时期、有可达多数派、且竞争趋缓/稳定 Leader时,最终会选出一个值。

可达的意思是指节点之间能够正常通信

非目标
不承诺最短/固定时间内完成决定(无有界终止时间保证)
在强竞争(多主互抢)、网络分区或不到多数派时可能无进展,但不会出错(Safety 仍保留)

角色与职责(Who)

Proposer(提议者)
生成提案(编号 n,值 v),发起两阶段;在 Multi-Paxos 中常由Leader担任,负责连续多个槽位(日志索引)

Acceptor(接受者)
作为“法官”投票:对较大的 n 做承诺(Promise),并在不违背承诺的前提下接受(Accept)某个 (n, v)。安全性核心在它。

Learner(学习者)
收集“Accepted”证据,当获知多数派接受同一 (n, v) 即学习/提交该值;不参与仲裁。

Distinguished Proposer / Leader(特殊提议者 / 领导者)(工程常见)
通过选主把并发冲突降到最低;稳定后可在多数派上一次 Phase-1,多次 Phase-2(Multi-Paxos)

Acceptor 必须落盘保证安全;Proposer/Learner 可不落盘,只影响活性与恢复体验(工程上常做适度持久化更稳定)

如果leader被替换,acceptor又接受了这个leader的提案怎么办?

如果 Leader 被替换,Acceptor 也会把自己曾经接受过的提案报告给新 Leader,新 Leader 必须继承这些值;因此 Paxos 保证:旧 Leader 已经多数派接受的值不会丢,没形成多数的值可以被覆盖,否则会破坏 Safety。

基本流程(How)

Phase 1|Prepare/Promise
Proposer 发送 Prepare(n);任何接到的 Acceptor 若 n > promised_n,则:
将 promised_n ← n(持久化),承诺不再接受 < n 的提案
用 Promise 回应,并携带自己已接受过的最高对 (accepted_n, accepted_value)(如果有)

Phase 2|Accept/Accepted
Proposer 收到多数 Promise 后:
若看到任何已接受值,则取编号最高的那个值 v;否则可用自己的值
发送 Accept(n, v);Acceptor 若不违背承诺(n ≥ promised_n)则:
accepted_n ← n,accepted_value ← v(持久化),并回 Accepted(n, v)

决议/学习
当多数 Acceptor 对同一 (n, v) 回 Accepted,该值 v 被选定;Learner 收敛/提交

常见问题与对策

1. 多主竞争导致活锁
现象:多个 Proposer 同时用不同编号发起 Prepare/Accept,互相抢占,提案不断被更大编号打断,迟迟难以完成一次决议。
对策:选主(Leader)集中出提案;或加退避/随机化与编号跃迁策略,减少碰撞。

退避

现象:多个 Proposer 同时冲突 → 都收不到多数 → 继续发更大编号提案 → 无限抢占 → 活锁。

退避策略:当 Proposer 发现自己提案被抢占(比如收到了更大编号的 Promise),就不要立刻重试,而是等待一段时间再试。

意义:给对方机会先跑完一轮,避免无限抢占循环。

随机化

问题:如果大家都用同样的退避时间,可能同时醒来 → 再次冲突。

随机化策略:把等待时间加点随机抖动,例如退避时间 = 基础延迟 + 随机数。

效果:减少同步碰撞,提升协议最终达成的概率。

编号跃迁

现象:一个 Proposer收到更大编号的 Prepare/Promise,说明自己落后。

编号跃迁:它可以直接把自己下一次提案编号调得远远更大(而不是简单 +1),确保下一次不会再次被眼前的竞争者压制。

效果:快速超车,减少多次小幅度冲突。工程里常设计为 <term, proposerId> 形式,保证全局有序。

2. 网络分区 / 少数派可达
现象:无法触达多数派时,协议无法前进,但不会产出冲突决定。
对策:维持 CP 取舍(牺牲部分可用性换一致性),等待多数派恢复再推进。

3. 崩溃与恢复
现象:节点重启若丢失承诺/已接受状态,会破坏历史约束。
对策:Acceptor 必须落盘 promised_n / accepted_n / accepted_value,恢复后严格遵守已承诺语义。

为什么竞争只影响活性而不破坏安全?

1. Paxos 的安全性建立在多数派交集 + 承诺单调 + 值继承三件套上,这些约束与消息时序无关,因此永远成立。
2. 即使多个 Proposer 并发竞争、频繁抢占编号,Acceptor 仍旧遵守承诺后不再接受小编号这一不可回退规则。
3. 新一轮 Proposer 在进入 Phase 2 前必须继承在多数派回复中观测到的最高编号已接受值,因此无法绕过历史去提出相反的值。
4. 由于任意两个多数派集合必有交集,任何已被多数接受过的值都会被后继提案看见,从而被延续而非被覆盖。
5. 于是,并发竞争所造成的只是不断被更大编号打断,表现为延迟变大/无进展(活性受损),但不会产生两个不同的被选定值。
6. 在网络分区或只触达少数派的情况下,协议选择不前进而不是各自决定,因此宁停不乱,安全不失。
7. 崩溃恢复后,Acceptor 通过持久化状态继续履行既有承诺,保证历史不被遗忘,也就不可能因为重启而“选出另一个值”。

什么是多数派(Quorum)

定义:在 N 个 Acceptor 中,每次需要一个法定集合同意才能推进;若法定集合大小取 > N/2,则任意两个法定集合必有交集(至少一个共同成员)
意义:交集节点会把自己已接受过的最高编号值报告给后续 Proposer,使后者必须继承历史值,从而维持一致性。

任意两个多数派集合必有交集,交集的作用是:
假设某个值 v 已经在多数派 A 被接受(chosen 的候选)
后续任何新 Proposer 都必须再从另一个多数派 B收集 Promise
因为 A ∩ B ≠ ∅,所以至少有一个 Acceptor 会记得 v
新 Proposer 必须继承这个历史值 v(规则:继承已接受的最高编号的值)
因此 Paxos 能保证一旦某个值可能被多数派选中,之后所有被选定的值都必须与它一致

为什么后续任何新 Proposer 都必须再从另一个多数派 B收集 Promise?

因为不知道历史上的多数派是哪一组,为了保证能看见那段历史,必须向多数派 B 收集Promise,这样可保证 B 与多数派 A必有交集。
一旦两组都是多数派,就有 A∩B≠∅。交集里的某个 Acceptor 会把自己已接受的最高对 (n_a, v_a) 报告给Proposer ,Proposer 就被迫继承该值,安全性因此成立。

5 句自然语言证明多数派交集不会选出两个不同的值

1. 假设某值 v 已在一个法定集合 Q1内被多数 Acceptor 接受。
2. 之后任何新的 Proposer 想要继续推进,必须从另一个法定集合 Q2收集承诺。
3. 因为法定集合都是多数,故 Q1​ 与 Q2 必有交集,存在至少一个共同的 Acceptor。
4. 该交集 Acceptor 会按规则报告它已接受过的最高编号值,于是新 Proposer 必须继承该值进入 Phase 2。
5. 因此,任何后来被选定的值都与 v 一致,不可能再选出与 v 不同的第二个值,故多数派交集不会选出两个不同的值。

Paxos vs Raft 异同点

相同点
目标一致:都要实现崩溃容错的复制状态机
依赖条件:需要多数派可用,节点维护持久化元数据(承诺/日志/任期)才能保证崩溃恢复后 Safety。
结果保证:在部分同步网络中,Safety 永远成立,Liveness 在稳定时期成立。

不同点(工程视角)

可理解性
Paxos:抽象层次高,核心论文偏“数学证明”;需要额外补充选主、多槽位日志等细节才能变成可用系统。
Raft:设计目标就是易于理解。明确提出了 Leader-based 流程:任期、心跳、日志匹配、选主、成员变更。

日志与成员变更
Paxos:基本论文只解决单次决议,Multi-Paxos + 工程补丁才形成日志复制;成员变更没有标准化方案。
Raft:把日志复制、任期切换、Joint Consensus(联合共识的配置变更)都标准化为协议的一部分。

实现生态

工业界常见的 Multi-Paxos 实现 ≈ Leader 驱动复制,体验上和 Raft 很像,但实现复杂度高。
Raft 的落地实现有完整生态;Paxos 系统更多是历史遗产或大厂定制。

若从零做复制,为什么可能更偏向 Raft?
因为 Raft 在设计时就把 Leader 选举、日志复制、任期、配置变更全部纳入协议核心,流程直观、易实现、社区支持丰富;对一个新项目来说,可以快速实现一个可维护的高可用系统。相比之下,Paxos 虽然理论完备,但要从论文到工程落地,还需要自己拼接 Multi-Paxos、Leader 选主、重配置等模块,复杂度高。

若接手已有 Paxos 系统,我需要重点关注什么?
必须清楚它是基于 Multi-Paxos 的哪个变体(是否有稳定 Leader、是否支持批量/流水线);明确 Acceptor 的持久化语义;确认系统是否已经实现了重配置机制(例如 Joint Consensus 或自研方案);同时要评估其冲突处理和活性优化手段(退避、编号跃迁、Leader 心跳)。只有弄清这些工程化补丁,才能确保 Paxos 系统在实际环境里安全且有足够活性。

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

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

相关文章

第十二篇:Qcom Camx打印实时帧率 FPS

一、第一种方式(有些低平台可能没有) adb shell setprop persist.vendor.camera.enableFPSLog TRUE adb shell setprop persist.vendor.camera.systemLogEnable TRUE adb shell setprop vendor.debug.camera.overrideLogLevels 0xff chi-cdk/core/chiframework/chxextensi…

TRAE通用6A规则+敏捷开发5S规则

网上研究别人的一些规则,也搞一份给大家 6A工作流项目规则 身份定义 你是一位资深的软件架构师和工程师,具备丰富的项目经验和系统思维能力。你的核心优势在于: 上下文工程专家:构建完整的任务上下文,而非简单的提示响应 规范驱动思维:将模糊需求转化为精确、可执行的规…

【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:

目录 引言 1 nginx.conf的整体结构 2 main全局块详解 2.1 核心指令解析 2.1.1 user&#xff1a;运行用户 2.1.2 worker_processes&#xff1a;工作进程数 2.1.3 pid&#xff1a;PID文件路径 2.1.4 worker_rlimit_nofile&#xff1a;文件描述符限制 2.2 main块配置示例…

【前端教程】从基础到优化:一个登录页面的完善过程

最近做了一个简单的登录页面,主要练习了文本框的onfocus与onblur事件的使用。虽然功能实现了,但仔细想想还有不少可以改进的地方。今天就来分享一下这个登录页面的开发过程和优化思路。 初始实现与解析 先来看一下最初的实现代码: <!DOCTYPE html> <html> &l…

独家 | 抖音生活服务调整:涂晴接管市场和达人运营,旭凯担任北部大区负责人

文/刀客doc(头条精选作者)刀客doc独家获悉&#xff0c;9月8日抖音生活服务完成新一轮组织调整&#xff0c;并已在内部all hands完成官宣。此次调整主要涉及北部大区、达人运营与市场部三大条线的人事轮换与汇报关系变更。核心变动如下&#xff1a;涂晴&#xff0c;原抖音生活服…

class_9:java 抽象类和接口

抽象类 需要用abstract 修饰类和接口abstract class Person{String address;String name;abstract public void eat();abstract public void drink();public void printInfo(){System.out.println("name " name);}} class Student extends Person{public void eat()…

【C++】队列queue的使用

语法 在 C 中&#xff0c;队列的语法如下&#xff1a; #include <queue>// 声明队列 std::queue<Type> q;这里 Type 是队列中存储元素的数据类型。 常用操作 队列提供了以下常用操作&#xff1a; empty(): 检查队列是否为空。 size(): 返回队列中的元素数量。 fron…

HTTP 协议的基本格式

目录 &#xff08;一&#xff09;HTTP是什么 &#xff08;二&#xff09;报文格式 &#xff08;1&#xff09;请求 ①首行 1.URL 2.方法&#xff08;method&#xff09; Ⅰ.GET Ⅱ.POST Ⅲ.PUT Ⅳ.DELETE 3.版本号 ②请求头&#xff08;header&#xff09; 1.键值对…

计算机网络的基本概念-2

1、数据交换技术&#xff1a;电路交换、报文交换与分组交换网络核心部分的关键设备是路由器&#xff0c;其工作方式是分组交换。要理解分组交换&#xff0c;必须先了解其前两种技术。1. 电路交换 (Circuit Switching)核心思想&#xff1a;通信前必须预先建立一条专用的物理通路…

车载网络技术--SOME_IP协议详解

文章目录前言SOME/IP概念SOME/IP协议格式SOME/IP功能介绍序列化序列化规则发布和订阅服务发现&#xff08;SOME/IP-SD&#xff09;SOME/IP-TP协议使用场景SOME/IP-TP协议参考文章&#xff1a;前言 本文介绍了SOME/IP协议的具体内容&#xff0c;包括报文格式&#xff0c;协议选…

JVM 核心知识全解析:从类加载到垃圾回收的深度认知

什么是JVM&#xff1f; JVM全称&#xff08;Java Virtual Machine&#xff09;&#xff0c;中译为&#xff1a;Java虚拟机 本质&#xff1a;是一个运行在计算机上的程序 职责&#xff1a;运行Java字节码文件&#xff08;因为计算机只能认识机器码文件&#xff0c;所以需要JVM将…

Keepalived 负载均衡

Keepalived 负载均衡 Keepalived 可以与 LVS&#xff08;Linux Virtual Server&#xff09;结合&#xff0c;提供强大的四层负载均衡功能。它通过 IPVS&#xff08;IP Virtual Server&#xff09;内核模块实现高性能的负载分发。 核心组件 Virtual Server&#xff1a;虚拟服务器…

拷打DeepSeek实现自动生成差分电荷计算文件和后处理

差分电荷&#xff08;charge density difference&#xff09;是材料模拟中分析电子结构变化的直观工具。 它把成键后的真实电荷密度减去成键前各碎片叠加的电荷密度&#xff0c;得到一张“电子迁移地图” 于是可以一眼看出化学键形成时电子从哪里来到哪里去&#xff0c;表面吸…

AI问答-Nuxt4:什么时候发布的,有哪些特性,和Nuxt3相比 有哪些优势 / Nuxt4 / Nuxt-v4

Nuxt 4于2025年7月至8月期间正式发布&#xff0c;作为Nuxt框架的重大版本更新&#xff0c;其核心聚焦于稳定性提升、开发者体验优化及性能增强&#xff0c;与Nuxt 3相比&#xff0c;优势体现在项目结构、数据获取、类型系统、开发工具链等多个层面。一、Nuxt 4 发布时间线测试阶…

isinstance()和insubclass()

​​isinstance() 和 issubclass() 的功能与用法​​​​1. isinstance(obj, classinfo)​​​​功能​​&#xff1a;检查对象 obj 是否是 classinfo 类&#xff08;或其子类&#xff09;的实例。 ​​返回值​​&#xff1a;True 或 False。 ​​用法​​&#xff1a;class A…

判断QMetaObject::invokeMethod()里的函数是否调用成功

今天&#xff0c;在Qt编程&#xff0c;碰到一个需要使用invokeMethod方式来获取函数是否执行成功的情况。     invokeMethod()即可以同步调用&#xff0c;也可以异步调用。若调用者、被调用者&#xff0c;都在同一个线程&#xff0c;则是同步调用&#xff1b;若调用者、被调用…

【linux】特殊权限

us对文件&#xff1a;用户执行该文件时&#xff0c;会以文件所有者的权限运行chmod us filename # 符号模式 chmod 4755 filename # 数字模式&#xff08;4表示SetUID&#xff09;典型应用&#xff1a;/usr/bin/passwd&#xff08;允许普通用户修改自己的密码&#xff0c;…

OpenCV:指纹识别

目录 一、核心算法 1&#xff1a;SIFT 特征提取&#xff08;尺度不变特征变换&#xff09; 1.1 算法原理&#xff08;4 步核心流程&#xff09; 1.2 重点代码实现与参数解析 1.3 关键输出解读 二、核心算法 2&#xff1a;FLANN 特征匹配&#xff08;快速最近邻搜索&#x…

快速排序:高效的分治排序算法

快速排序因其平均时间复杂度$O(n\log n)$而成为广泛应用的高效排序算法。其核心是分治法: 选择基准 (Pivot):从待排序序列中选取一个元素(如第一个元素$arr[0]$)。 分区 (Partition):将序列重新排列,所有小于基准的元素置于其前,大于或等于的置于其后。基准元素最终位于…

网络编程之UDP广播与粘包问题

一&#xff0c;广播简介从上述讲的例⼦中&#xff0c;不管是TCP协议还是UDP协议&#xff0c;都是”单播”, 就是”点对点”的进⾏通信&#xff0c;如果要对网络里面的所有主机进⾏通信&#xff0c;实现”点对多”的通信&#xff0c;我们可以使用UDP中的⼴播通信。 理论上可以像…