探索分布式強一致性奧秘:Paxos共識算法的精妙之旅

????????提到分布式算法,就不得不提 Paxos 算法,在過去幾十年里,它基本上是分布式共識的代名詞,因為當前一批常用的共識算法都是基于它改進的。比如,Fast Paxos 算法、Cheap Paxos、Raft 算法等。

????????由萊斯利·蘭伯特(Leslie Lamport)于1990年首次提出,并在后續文章中進一步闡述。Paxos 算法旨在解決在一個可能發生網絡分區、節點失效或其他異常情況的分布式環境中,如何讓所有參與決策的節點對某個值達成一致同意的問題。

????????蘭伯特提出的Paxos總共包含兩部分:

  1. 一個是 Basic Paxos 算法,描述的是多節點之間如何就某個值(提案Value)達成共識
  2. 另一個是 Multi-Paxos 思想,描述的是執行多個 Basic Paxos 實例,就一系列值達成共識

Basic Paxos

????????先來看一個例子

? ? ? ? 假設有一個分布式集群,由三個節點 A、B、C 組成,提供只讀 KV 存儲服務,創建只讀變量的時候,必須要先寫入數據,而且這個數據后續不能被修改。因此一個節點寫入只讀變量后就不能再修改了,所以所有節點必須要先對只讀變量達成共識,然后所有節點在一次創建這個只讀變量。

????????當有多個客戶端(如客戶端1、2)訪問這個系統試圖創建同一個只讀變量(如X),客戶端1試圖創建值為3的X,客戶端2試圖創建值為7的X,這樣要如何達成共識,實現各節點上X值一直呢?

????????為了幫助人們更好的理解 Basic Paxos 算法,蘭伯特在講解時,也使用了一些獨有而且比較重要的概念,提案、準備(Prepare)請求、接受(Accept)請求、角色等等,其中最重要的就是角色。因為角色是對 Basic Paxos 中最核心的三個功能的抽象,比如,由接受者(Acceptor)對提議者的值進行投票,并存儲接受的值。

? ? ? ? 角色劃分

????????在 Basic Paxos 中,由提議者(Proposer)、接受者(Acceotor)、學習者(Learner)三種角色,如圖:

  • 提議者(Proposer):提議一個值,用于投票表決。為了方便演示,可以把客戶端1和2看做是提議者。但在絕大多數場景中,集群中收到客戶端請求的節點,才是提議者。這樣做的好處是,對業務代碼沒有侵入性,也就是說,我們不需要在代碼中實現算法邏輯,就可以像使用數據庫一樣訪問后端數據。
  • 接受者(Acceptor):對每個提議的值進行投票,并存儲接受的值,比如 A、B、C 三個節點。一般來說,集群中的所有節點都在扮演接受者的角色,參與共識協商,并接受和存儲數據。

? ? ? ? 這里需要強調一下:前面不是說接收客戶端請求的節點是提議者嗎?這里怎么又是接受者呢?這是因為一個節點(或進程)可以身兼多個角色。想象一下,一個 3 節點的集群,1 個節點收到了請求,那么該節點將作為提議者發起二階段提交,然后這個節點和另外 2 個節點一起作為接受者進行共識協商,就像下圖的樣子:

  • 學習者(Leaner):被告知投票的結果,接受達成的共識值,存儲保存,不參與投票的過程。一般來說,學習者是備份節點,比如“Master-Slave”模型中的Slave,被動的接受數據,容災備份。

? ? ? ? 達成共識過程

? ? ? ? 有這樣一個場景,假如你所在的公司有一個新項目需要開發,業務比較復雜,你的領導給組內每個成員下發了任務,要求每人寫一個項目方案,最終開會討論采用哪套方案,為了區分每套方案,每個方案都有一個標識,稱為提案編號,來唯一標識。

????????與你的做法類似,在 Basic Paxos 中,蘭伯特也使用提案代表一個提議。不過在提案中,除了提案編號,還包含了提議值。使用 [n, v] 表示一個提案,n 為提案編號,v 為提議值。

????????整個共識協商是分兩個階段進行的。假設客戶端 1 的提案編號為 1,客戶端 2 的提案編號為5,并假設節點 A、B 先收到來自客戶端1的準備請求,節點 C 先收到來自客戶端 2 的準備請求。

? ? ? ? 準備(Prepare)階段

????????先來看第一階段,首先客戶端 1、2 作為提議者,分別向所有接受者發送包含提案編號的準備請求:

? ? ? ??在準備請求時不需要準備提議的值的,只需要攜帶提案編號就可以了,這是容易誤解的地方。接著,當A、B收到提案編號為 1 的準備請求,節點 C 收到提案編號為 2 的準備請求后,將進行這樣的處理:

  • 由于之前沒有通過任何提案,所以節點 A、B 將返回一個"尚無提案"的響應。也就說節點 A和 B 在告訴提議者,我之前沒有通過任何提案,并承諾以后不在響應提案編號小于等于 1 的準備請求,不會通過編號小于1的提案。
  • 節點 C 也是如此,它將返回一個“尚無提案”的響應,并承諾以后不在響應提案編號小于 5 的提案,不會通過提案編號小于5的提案。

????????另外,當節點 A、B 收到提案編號為 5 的準備請求,和節點 C 收到提案編號為 1 的準備請求的時候,將進行這樣的處理:

  • 當節點 A、B 收到提案編號為 5 的準備請求時,因為提案編號 5 大于他們之前響應的準備請求的提案編號 1,而且兩個節點都沒有通過任何提案,所以它將返回一個“尚無提案”的響應,并承諾以后不在響應提案編號小于 5 的準備請求,不會通過提案小于 5 的提案。
  • 當節點 C 收到提案編號為 1 的準備請求時,由于天編號 1 小于之前響應的準備請求的提案編號 5,所以丟棄該準備請求,不做響應。

????????接受(Acceptor)階段

????????第二個階段也就是接受階段,首先客戶端 1、2 在收到大多數節點的準備響應之后,會分別發送接受請求:

  • 當客戶端 1 收到大多數的接受者(節點A、B)的準備響應之后根據響應中提案編號最大的提案值,設置接受請求中的值。因為該值在來自節點 A、B 的準備響應中都為空,所以就把自己的提議值 3 作為提案的值,發送接受請求 [1, 3]。
  • 當客戶端2收到大多數的接受者的準備響應后(節點A、B、C),根據響應中提案編號最大的提案值,來設置接受請求中的值。因為該值來自節點 A、B、C 準備響應都為空,所以就把自己的提議值7作為提案的值,發送接受請求 [5, 7]。

????????當三個節點接受到兩個客戶端的接受請求時,會進行這樣的處理:

  • 當節點 A、B、C 接受到請求 [1, 3] 的時候,由于提案的提案編號 1 小于三個節點承諾能通過的提案的最小提案編號 5,所以提案 [1, 3] 將被拒絕。
  • 當節點 A、B、C 接受到請求 [5, 7] 的時候,由于提案的提案編號 5 不小于三個節點承諾能通過的提案的最小提案編號 5,所以就通過提案 [5, 7],也就是接受了值 7,三個節點就 X 值為 7 達成共識。

????????如果集群中有學習者,當接受者通過了一個提案時,就通知給所有的學習者。當學習者發現大多數的接受者都通過了某個提案,那么它也通過該提案,接受該提案的值。??

Multi-Paxos算法?

????????Basic Paxos 只能就單個值(Value)達成共識,一旦遇到為一系列的值實現共識的時候,它就不管用了。雖然蘭伯特提到可以通過多次執行 Basic Paxos 實例(比如每接收到一個值時,就執行一次 Basic Paxos 算法)實現一系列值的共識。但是,讀完論文后,雖然每個英文單詞都能讀懂,但還是不理解蘭伯特提到的 Multi-Paxos,為什么 Multi-Paxos 這么難理解呢?

????????蘭伯特并沒有把 Multi-Paxos 講清楚,只是介紹了大概的思想,缺少算法過程的細節和編程所必須的細節。這就導致了每個人實現的 Multi-Paxos 都不一樣。不過從本質上看,大家都是在蘭伯特提到的 Multi-Paxos 思想上補充細節,設計自己的 Multi-Paxos 算法,然后實現它(比如 Chubby 的 Multi-Paxos 實現、Raft 算法等)。

????????所以這里補充一下,蘭伯特提出的 Multi-Paxos 是一種思想,不是算法。而 Multi-Paxos 是一種統稱,它是指基于 Multi-Paxos 思想,通過多個 basic-Paxos 實現一系列值的共識算法。這一點尤為重要。

? ? ? ? 到這里 Paxos 共識算法就介紹完了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring6學習技術|AOP

學習材料 尚硅谷Spring零基礎入門到進階,一套搞定spring6全套視頻教程(源碼級講解) AOP AOP(Aspect Oriented Programming)是一種設計思想,是軟件設計領域中的面向切面編程,它是面向對象編程的…

AIDL的工作原理與使用示例 跨進程通信 遠程方法調用RPC

AIDL的介紹與使用 AIDL(Android Interface Definition Language)是Android中用于定義客戶端和服務端之間通信接口的一種接口定義語言。它允許你定義客戶端和服務的通信協議,用于在不同的進程間或同一進程的不同組件間進行數據傳遞。AIDL通過…

深入探討YUV圖像處理:理論原理與OpenCV實踐

文章目錄 導言YUV模型的原理使用OpenCV處理YUV圖像1. 讀取YUV圖像2. 將YUV圖像轉換為RGB圖像3. 將RGB圖像轉換為YUV圖像 結語 導言 導言: 在圖像處理領域,YUV色彩模型因其對亮度和色度的分離而被廣泛使用,特別在視頻編碼和實時通信中發揮了巨…

算法項目(3)—— 從零實現KNN、樸素貝葉斯垃圾郵件分類

本文包含什么? 項目運行的方式項目代碼,自己實現KNN算法以及樸素貝葉斯算法.代碼介紹運行有問題? csdn上后臺隨時售后.項目說明 本文主要是自己從0實現KNN算法以及樸素貝葉斯算法.然后使用英文垃圾郵件數據集進行垃圾郵件分類.常見的代碼均調用sklearn庫來實現,本文自行實現…

AI推介-大語言模型LLMs論文速覽(arXiv方向):2024.01.01-2024.01.10

1.Pre-trained Large Language Models for Financial Sentiment Analysis 標題:用于金融情感分析的預訓練大型語言模型 author:Wei Luo, Dihong Gong date Time:2024-01-10 paper pdf:http://arxiv.org/pdf/2401.05215v1 摘要: 金融情感分析是指將金融文本內容劃分…

從零學習Linux操作系統第二十八部分 shell腳本中的執行流控制

一、什么是執行流、循環執行流 執行流:改變執行順序,使之更方便操作者 循環執行流:根據腳本是執行流再某一個狀態下進行循環執行,進行多次執行后再往下走(for語句) for語句 作用 為循環執行動作 for語句…

opencv判斷灰化情況

目的 先說說理論: 在圖像處理中,用RGB三個分量(R:Red,G:Green,B:Blue),即紅、綠、藍三原色來表示真彩色,R分量,G分量,B分…

LeetCode LCR 055.二叉搜索樹迭代器

實現一個二叉搜索樹迭代器類BSTIterator ,表示一個按中序遍歷二叉搜索樹(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 類的一個對象。BST 的根節點 root 會作為構造函數的一部分給出。指針應初始化為一個不存在…

vue實現拖拽(vuedraggable)

實現效果: 左側往右側拖動,右側列表可以進行拖拽排序。 安裝引用: npm install vuedraggable import draggable from vuedraggable 使用: data數據: componentList: [{groupName: 考試題型,children: [{componentType: danxua…

SQLite 的使用

SQLite 是一個輕量級、自包含和無服務器的關系型數據庫管理系統(RDBMS),廣泛應用于嵌入式系統、移動應用程序和小中型網站。它易于創建、需要的配置較少,并且提供了用于管理和操作數據的強大功能集。本文,我們將帶領你…

電路設計(26)——交通信號燈的multism仿真

1.功能要求 使用數字芯片設計一款交通信號燈,使得: 主干道的綠燈時間為60S,紅燈時間為45S 次干道的紅燈時間為60S,綠燈時間為45S 主、次干道,綠燈的最后5S內,黃燈閃爍 使用數碼管顯示各自的倒計時時間。 按…

【CMake】(5)搜索文件

方法1:使用aux_source_directory命令 aux_source_directory命令用于查找指定目錄下的所有源文件,并將文件列表存儲到一個變量中。這種方法簡單易用,適合于源文件位于單一目錄下的情況。 基本語法如下: aux_source_directory(<dir> <variable>)<dir>:…

openssl3.2 - 編譯 - zlib.dll不要使用絕對路徑

文章目錄 openssl3.2 - 編譯 - 編譯時的動態庫zlib.dll不要使用絕對路徑概述測試zlib特性在安裝好的目錄中是否正常筆記70-test_tls13certcomp.t80-test_cms.t對測試環境的猜測從頭再編譯測試安裝一次測試一下隨便改變位置的openssl用到zlib時是否好使測試一下隨便改變位置的op…

Docker Nginx 負載均衡搭建(服務宕機-配置高可用) - 附(Python案例,其它語言同理)

目錄 一 . 概要 1. 什么是負載均衡 2. 負載均衡有哪些優勢&#xff1f; &#xff08;1&#xff09;應用程序可用性 &#xff08;2&#xff09;應用程序可擴展性 &#xff08;3&#xff09;應用程序安全 &#xff08;4&#xff09;應用程序性能 3 . Nginx負載均衡調度策…

Java高級 / 架構師 場景方案 面試題(二)

1.雙十一億級用戶日活統計如何用 Redis快速計算 在雙十一這種億級用戶日活統計的場景中&#xff0c;使用Redis進行快速計算的關鍵在于利用Redis的數據結構和原子操作來高效地統計和計算數據。以下是一個基于Redis的日活統計方案&#xff1a; 選擇合適的數據結構&#xff1a; …

核密度分析

一.算法介紹 核密度估計&#xff08;Kernel Density Estimation&#xff09;是一種用于估計數據分布的非參數統計方法。它可以用于多種目的和應用&#xff0c;包括&#xff1a; 數據可視化&#xff1a;核密度估計可以用來繪制平滑的密度曲線或熱力圖&#xff0c;從而直觀地表…

【DOCKER】隨手記

目錄 1. 安裝1.1 LINUX1.2 Windows 2. 常用配置2.1 普通權限運行2.2 開機自啟動2.3 3 更換Docker鏡像源2.4 更改默認存儲位置 3. 顯示帶UI的軟件4. 基于DOCKER的服務4.1 FTP4.2 Portainer4.3 Watchtower4.4 SiYuan4.5 GitLab4.5.1 創建容器4.5.2 克隆路徑問題4.5.3 獲取默認密碼…

win系統下安裝php8.3版本并配置環境變量的詳細教程

本篇文章主要講解在win系統下安裝和配置php8.3版本&#xff0c;并配置環境變量的詳細教程。 日期&#xff1a;2024年2月22日 作者&#xff1a;任聰聰 一、下載php8.3版本包 php8.3版本官方下載地址&#xff1a;https://windows.php.net/download#php-8.3 步驟一、打開下載地址…

【Unity】Unity與安卓交互

問題描述 Unity和安卓手機進行交互&#xff0c;是我們開發游戲中最常見的場景。本教程將從一個簡單的例子來演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一個工程 2.選擇Empty Activity 然后點擊Next 3.點擊Finish完成創建 4.選擇File-New-New Mo…

【python 3.9.18】windowns安裝版

因為這個版本官方未提供&#xff0c;所以需要自己編譯出來&#xff0c;其他沒有的版本可以依據下面的進行生成一個exe也可行。 成品&#xff1a; https://gitee.com/greatLong/python-3.9.18/tree/master/python-3.9.18/PCbuild/amd64 1、環境準備 需要使用到 這里面還需要選…