Paxos協議

目錄

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中的?播通信。 理論上可以像…