1. 程式人生 > >分散式一致性的paxos演算法

分散式一致性的paxos演算法

一致性協議

Paxos是一個一致性協議。什麼叫一致性?一致性有很多種,從強到弱分了很多等級,如線性一致性、因果一致性、最終一致性,等等。什麼是一致?這裡舉個例子,三臺機器,每臺機器的磁碟儲存為128位元組,如果三臺機器這128位元組資料都完全相同,那麼可以說這三臺機器是磁碟資料是一致的,更為抽象地說,就是多個副本確定同一個值,大家記錄下來同一個值,那麼就達到了一致性。

Paxos能達到什麼樣的一致性級別?這是一個較為複雜的問題。因為一致性往往不取決於客觀存在的事實,如3臺機器雖然擁有相同的資料,但是資料的寫入是一個過程,有時間的先後,而更多的一致性取決於觀察者,觀察者看到的並未是最終的資料。這裡就先不展開講,先暫且認為Paxos保證了寫入的最終一致性。

為何說是一個協議而不是一個演算法,可以這麼理解,演算法是設計出來服務於這個協議的,如同法律是協議,那麼演算法就是各種機構的執行者,使得法律的約束能得到保證。

Paxos的協議其實很簡單,就三條規定。我認為這三條規定也是Paxos最精髓的內容,各個執行者奮力去保護這個協議,使得這個協議的約束生效,自然就得到了一致性。

分散式環境

為何要設計出這麼一套協議,其他協議不行麼?如最容易想到的,一個值A,往3臺機器都寫一次,這樣一套簡單的協議,能不能達到一致性的效果?這裡就涉及到另外一個概念,Paxos一致性協議是在特定的環境下才需要的,這個特定的環境稱為非同步通訊環境。而恰恰,幾乎所有的分散式環境都是非同步通訊環境,在計算機領域面對的問題,非常需要Paxos來解決。

非同步通訊環境指的是訊息在網路傳輸過程中,可能發生丟失、延遲、亂序現象。在這種環境下,上面提到的三寫協議就變得很雞肋了。訊息亂序是一個非常惡劣的問題,這個問題導致大部分協議在分散式環境下都無法保證一致性,而導致這個問題的根本原因是網路包無法控制超時,一個網路包可以在網路的各種裝置交換機等停留數天,甚至數週之久,而在這段時間內任意發出的一個包,都會跟之前發出的包產生亂序現象。無法控制超時的原因更多是因為時鐘的關係,各種裝置以及交換機時鐘都有可能錯亂,無法判斷一個包的真正到達時間。

非同步通訊環境並非只有Paxos能解決一致性問題,經典的兩階段提交也能達到同樣的效果,但是分散式環境裡面,除了訊息網路傳輸的惡劣環境,還有另外一個讓人痛心疾首的,就是機器的當機,甚至永久失聯。在這種情況下,兩階段提交將無法完成一個一致性的寫入,而Paxos,只要多數派機器存活就能完成寫入,並保證一致性。

至此,總結一下Paxos就是一個在非同步通訊環境,並容忍在只有多數派機器存活的情況下,仍然能完成一個一致性寫入的協議。

提議者

前面講了這麼多都是協議協議,在分散式環境當中,協議作用就是每臺機器都要扮演一個角色,這個角色嚴格遵守這個協議去處理訊息。在Paxos論文裡面這個角色稱之為Acceptor,這個很好理解。大家其實更關心另外一個問題,到底誰去發起寫入請求,論文裡面介紹發起寫入請求的角色為提議者,稱為Proposer。Proposer也是嚴格遵守paxos協議,通過與各個Acceptor的協同工作,去完成一個值的寫入。在Paxos裡面,Proposer和Acceptor是最重要的兩個角色。

確定一個值

既然說到寫入資料,到底怎麼去寫?寫一次還是寫多次,還是其他?這也是我一開始苦惱的問題,相信很多人都會很苦惱。

這裡先要明確一個問題,Paxos到底在為誰服務?更確定地說,到底在為什麼資料服務?還是引上面的例子,Paxos就是為這128位元組的資料服務,Paxos並不關心外面有多少個提議者,寫入了多少資料,寫入的資料是不是一樣的,Paxos只會跟你說,我確定了一個值,當這個值被確定之後,也就是這128位元組被確定了之後,無論外面寫入什麼,這個值都不會改變再改變了,而且三臺機確定的值肯定是一樣的。

說到這估計肯定會有人懵了,說實話我當時也懵了。我要實現一個儲存服務啊,我要寫入各種各樣的資料啊,你給我確定這麼一個值,能有啥用?但先拋開這些疑問,大家先要明確這麼一個概念,Paxos就是用來確定一個值用的,而且大家這裡就先知道這麼個事情就可以了,具體Paxos協議是怎樣的,怎麼通過協議裡面三條規定來獲得這樣的效果的,怎麼證明的等等理論上的東西,都推薦去大家去看看論文,但是先看完本文再看,會得到另外的效果。

如下圖,有三臺機器(後面為了簡化問題,不做特別說明都是以三臺機器作為講解例子),每臺機器上執行這Acceptor來遵守paxos協議,每臺機器的Acceptor為自己的一份Data資料服務,可以有任意多個Proposer。當Paxos協議宣稱一個值被確定(Chosen)後,那麼Data資料就會被確定,並且永遠不會被改變。
這裡寫圖片描述

Proposer只需要與多數派的Acceptor互動,即可完成一個值的確定,但一旦這個值被確定下來後,無論Proposer再發起任何值的寫入,Data資料都不會再被修改。Chosen value即是被確定的值,永遠不會被修改。

確定多個值

對我們來說,確定一個值,並且當一個值確定後是永遠不能被修改的,很明顯這個應用價值是很低的。雖然我都甚至還不知道確定一個值能用來幹嘛,但如果我們能有辦法能確定很多個值,那肯定會比一個值有用得多。我們先來看下怎麼去確定多個值。

上文提到一個三個Acceptor和Proposer各自遵守paxos協議,協同工作最終完成一個值的確定。這裡先定義一個概念,Proposer,各個Acceptor,所服務的Data共同構成了一個大的集合,這個集合所執行的paxos演算法最終目標是確定一個值,我們這裡稱這個集合為一個Paxos例項。

一個例項可以確定一個值,那麼多個例項自然可以確定多個值,很簡單的模型就可以構建出來,只要我們同時執行著多個例項,那麼我們就能完成確定多個值的目標。

這裡強調一點,每個例項必須是完全獨立,互不干涉的。意思就是說Acceptor不能去修改其他例項的Data資料,Proposer同樣也不能跨越例項去與其他例項的Acceptor互動。

如下圖,三臺機器每臺機器執行兩個例項,每個例項獨立運作,最終會產生兩個確定的值。這裡兩個實際可以擴充套件成任意多個。

這裡寫圖片描述

至此,例項成為了我現在介紹Paxos的一個基本單元,一個例項確定一個值,多個例項確定多個值,但各個例項獨立,互不干涉。

然而比較遺憾的一點,確定多個值,仍然對我們沒有太大的幫助,因為裡面最可恨的一點是,當一個值被確定後,就永遠無法被修改了,這是我們不能接受的。大部分的儲存服務可能都需要有一個修改的功能。

有序確定多個值

我們需要轉換一下切入點,也許我們需要Paxos確定的值,並不一定是我們真正看到的資料。我們觀察大部分儲存系統,如LevelDB,都是以AppendLog的形式,確定一個操作系列,而後需要恢復儲存的時候都可以通過這個操作系列來恢復,而這個操作系列,正是確定之後就永遠不會被修改的。到這已經很豁然開朗了,只要我們通過Paxos完成一個多機一致的有序的操作系列,那麼通過這個操作系列的演進,可實現的東西就很有想象空間了,儲存服務必然不是問題。

如何利用Paxos有序的確定多個值?上文我們知道可以通過執行多個例項來完成確定多個值,但為了達到順序的效果,需要加強一下約束。

首先給例項一個編號,定義為i,i從0開始,只增不減,由本機器生成,不依賴網路。其次,我們保證一臺機器任一時刻只能有一個例項在工作,這時候Proposer往該機器的寫請求都會被當前工作的例項受理。最後,當編號為i的例項獲知已經確定好一個值之後,這個例項將會被銷燬,進而產生一個編號為i+1的例項。

基於這三個約束,每臺機器的多個例項都是一個連續遞增編號的有序系列,而基於Paxos的保證,同一個編號的例項,確定的值都是一致的,那麼三臺機都獲得了一個有序的多個值。

下面結合一個圖來詳細說明一下這個運作過程,以及存在什麼異常情況以及異常情況下的處理方式。

這裡寫圖片描述

圖中A,B,C代表三個機器,紅色代表已經被銷燬的例項,根據上文約束,最大的例項就是當前正在工作的例項。A機器當前工作的例項編號是6,B機是5,而C機是3。為何會出現這種工作例項不一樣的情況?首先解釋一下C機的情況,由於Paxos只要求多數派存活即可完成一個值的確定,所以假設C出現當機或者訊息丟失延遲等,都會使得自己不知道3-5編號的例項已經被確定好值了。而B機比A機落後一個例項,是因為B機剛剛參與完成例項5的值的確定,但是他並不知道這個值被確定了。上面的情況與其說是異常情況,也可以說是正常的情況,因為在分散式環境,發生這種事情是很正常的。

下面分析一下基於圖示狀態的對於C機的寫入是如何工作的。C機例項3處理一個新的寫入,根據Paxos協議的保證,由於例項3已經確定好一個值了,所以無論寫入什麼值,都不會改變原來的值,所以這時候C機例項3發起一輪Paxos演算法的時候就可以獲知例項3真正確定的值,從而跳到例項4。但在工程實現上這個事情可以更為簡化,上文提到,各個例項是獨立,互不干涉的,也就是A機的例項6,B機的例項5都不會去理會C機例項3發出的訊息,那麼C機例項3這個寫入是無法得到多數派響應的,自然無法寫入成功。

再分析一下A機的寫入,同樣例項6無法獲得多數派的響應,同樣無法寫入成功。同樣假如B機例項5有寫入,也是寫入失敗的結果,那如何使得能繼續寫入,例項編號能繼續增長呢?這裡引出下一個章節。

例項的對齊(Learn)

上文說到每個例項裡面都有一個Acceptor的角色,這裡再增加一個角色稱為Learner,顧名思義就是找別人學習,她回去詢問別的機器的相同編號的例項,如果這個例項已經被銷燬了,那說明值已經確定好了,直接把這個值拉回來寫到當前例項裡面,然後編號增長跳到下一個例項再繼續詢問,如此反覆,直到當前例項編號增長到與其他機器一致。

由於約束裡面保證僅當一個例項獲知到一個確定的值之後,才能編號增長開始新的例項,那麼換句話說,只要編號比當前工作例項小的例項(已銷燬的),他的值都是已經確定好的。所以這些值並不需要再通過Paxos來確定了,而是直接由Learner直接學習得到即可。

這裡寫圖片描述

如上圖所示,B機的例項5是直接由Learner從A機學到的,而C機的例項3-5都是從B機學到的,這樣大家就全部走到了例項6,這時候例項6接受的寫請求就能繼續工作下去。

狀態機

一個有序的確定的值,也就是日誌,可以通過定義日誌的語義進行重放的操作,那麼這個日誌是怎麼跟Paxos結合起來的呢?我們利用Paxos確定有序的多個值這個特點,再加上這裡引入的一個狀態機的概念,結合起來實現一個真正有工程意義的系統。

狀態機這個名詞大家都不陌生,一個狀態機必然涉及到一個狀態轉移,而Paxos的每個例項,就是狀態轉移的輸入,由於每臺機器的例項編號都是連續有序增長的,而每個例項確定的值是一樣的,那麼可以保證的是,各臺機器的狀態機輸入是完全一致的。根據狀態機的理論,只要初始狀態一致,輸入一致,那麼引出的最終狀態也是一致的。而這個狀態,是有無限的想象空間,你可以用來實現非常多的東西。

如下圖這個例子是一個狀態機結合Paxos實現了一個具有多機一致的KV系統。

這裡寫圖片描述

例項0-3的值都已經被確定,通過這4個值最終引出(b, ‘jeremy’)這個狀態,而各臺機器例項系列都是一致的,所以大家的狀態都一樣,雖然引出狀態的時間有先後,但確定的例項系列確定的值引出確定的狀態。

下圖例子告訴大家Proposer,Acceptor,Learner,State machine是如何協同工作的。

這裡寫圖片描述

一個請求發給Proposer,Proposer與相同例項編號為x的Acceptor協同工作,共同完成一值的確定,之後將這個值作為狀態機的輸入,產生狀態轉移,最終返回狀態轉移結果給發起請求者。

相關推薦

分散式系統Paxos演算法

 這是一個有關Paxos演算法非常形象的講解與示範。Paxos是能夠基於一大堆完全不可靠的網路條件下卻能可靠確定地實現共識一致性的演算法。也就是說:它允許一組不一定可靠的處理器(伺服器)在某些條件得到滿足情況下就能達成確定的安全的共識,如果條件不能滿足也確保這組處理器(伺

分散式一致性hash演算法

寫在前面   在學習Redis的叢集內容時,看到這麼一句話:Redis並沒有使用一致性hash演算法,而是引入雜湊槽的概念。而分散式快取Memcached則是使用分散式一致性hash演算法來實現分散式儲存。所以就專門學習了一下 什麼是分散式?什麼是一致性?什麼是雜湊?   1

redis分散式一致性hash演算法

        當我們在部署redis節點時,使用者連結redis儲存資料會通過hash演算法來定位具體連結那個redis節點,在redis節點數量沒有改變的前提下,之前的使用者通過hash演算法會固定的連結某一臺redis節點,但是若此時我們增加了redis節點,使用者再次

memcache分散式 [一致性hash演算法] 的php實現

 最近在看一些分散式方面的文章,所以就用php實現一致性hash來練練手,以前一般用的是最原始的hash取模做 分散式,當生產過程中新增或刪除一臺memcache都會造成資料的全部失效,一致性hash就是為了解決這個問題,把失效資料降到最低,相關資料可以 google一下! php實現效率有一定的缺失,如

深入剖析分散式一致性共識演算法

一、共識演算法 -- 拜占庭問題 兩忠一叛問題:   如上圖所示,將軍A、B、C約定同時進攻或者撤退,假如將軍C叛變了,被中間人擷取訊息併發送進攻給A、撤退給B,當所有將軍訊息都收到後結果如下:A:2票進攻1票撤退;B:2票撤退1票進攻;導致最終A獨自去攻打敵軍,B撤退,最終會任務失敗。 &nb

分散式一致性協議之Paxos演算法

最近特別喜歡一句話:實踐是最好的成長,發表是最好的記憶。 筆者在今年國慶7天沒有回家,累計有6天的時間是在公司度過,要麼寫部落格,要麼看書。我記得當時寫的關於分散式系統一致性的原理和實踐。作者是倪超。書名《從Paxos到Zookeeper分散式一致性原理與實踐》。當時就想要通過發表Paxos來跟自己做心靈的

分散式一致性的基石---Paxos演算法(1)

分散式一致性的基石---Paxos演算法(1)   Paxos演算法是由微軟的工程師Lamport提出,Lamport依靠Paxos演算法獲得圖靈獎;   Paxos演算法旨在解決相互信任的分散式系統中,多個節點能快速達成一個一致的值;   目前,google的Chubby

Zookeeper的Paxos分散式一致性演算法-類比的方式去理解

Paxos是一個基於訊息傳遞的一致性演算法,近幾年被廣泛應用於分散式計算中,Google的Chubby,Apache的Zookeeper都是基於它的理論來實現的,Paxos還被認為是到目前為止唯一的分散式一致性演算法,其它的演算法都是Paxos的改進或簡化。Paxos只有

區塊鏈系列----分散式一致性演算法---Paxos 和 Raft

背景 在一個分散式系統中,如何保證叢集中所有節點中的資料完全相同並且能夠對某個提案(Proposal)達成一致是分散式系統正常工作的核心問題,而共識演算法就是用來保證分散式系統一致性的方法。 然而分散式系統由於引入了多個節點,所以系統中會出現各種非常複雜

分散式一致性paxos演算法

一致性協議 Paxos是一個一致性協議。什麼叫一致性?一致性有很多種,從強到弱分了很多等級,如線性一致性、因果一致性、最終一致性,等等。什麼是一致?這裡舉個例子,三臺機器,每臺機器的磁碟儲存為128位元組,如果三臺機器這128位元組資料都完全相同,那麼可以說這

分散式一致性演算法:paxos

一、背景 分散式系統中存在資料一致性問題,一般可以通過共享記憶體(需要鎖)或者訊息傳遞實現。目前解決此類問題的主流演算法是Paxos 演算法,採用的是訊息傳遞實現。 二、介紹 作為一個基於訊息傳遞的一致性演算法, LeslieLamport 在 1990 年提出,近幾年被廣

Paxos--分散式一致性演算法

相關概念 instance(例項):一次Paxos演算法執行。 proposal(議案):未經批准的決議稱為議案。 value(決議):被最終批准通過的議案中的value,也就是proposal提案對應的值 Proposer(提案者):提出議案 Acc

Paxos到Zookeeper分散式一致性原理與實踐 讀書筆記之(一) 分散式架構

1.1 從集中式到分散式  1 集中式特點  結構簡單,無需考慮對多個節點的部署和節點之間的協作。  2  分散式特點 分不性:在時間可空間上隨意分佈,機器的分佈情況隨時變動 對等性:計算機之間沒有主從之分,所有計算機之間是對等的。副本是分散式系統對資料

分散式演算法(一致性Hash演算法)

一、分散式演算法     在做伺服器負載均衡時候可供選擇的負載均衡的演算法有很多,包括: 輪循演算法(Round Robin)、雜湊演算法(HASH)、最少連線演算法(Least Connection)、響應速度演算法(Response Time)、加權法

分散式一致性協議Paxos

轉自:https://blog.csdn.net/qq_35440678/article/details/78080431 什麼是paxos協議? Paxos用於解決分散式系統中一致性問題。分散式一致性演算法(Consensus Algorithm)是一個分散式計算領域的基礎性

共識演算法(三)—— Raft(分散式一致性演算法

Raft簡介 Raft替代了paxos(太複雜),並提供了一種在計算系統叢集中分佈狀態機的通用方法,確保叢集中的每個節點都同意一系列相同的狀態轉換,也就是說,它在提供的計算機叢集分佈狀態機時,有個別或者多個狀態機down掉了,從而使其狀態不統一併影響了consensus一致性,繼而影響了整個

容錯分散式一致性演算法——totem(一)

  第一次接觸分散式一致性演算法是通過totem,現在開始研究paxos和raft之類,後面也是會做筆記的,便先將totem演算法先寫下來,用於對比學習。   totem協議,全稱是The Totem Single-Ring Ordering and Membership Protoco

《從 PAXOS 到 ZOOKEEPER:分散式一致性原理與實踐》讀書筆記[3]——Zookeeper 技術內幕

1 系統模型 1.1 資料模型 Zookeeper 中,每一個數據節點都被稱為一個 ZNode,所有 ZNode 按層次化結構進行組織,節點路徑標識方式和 Unix 檔案系統路徑相似,由一系列使用 / 進行分割的路徑表示,開發人員可以向這個節點中寫入資料,也可以在節點下面建立子節點 Zo

《從 PAXOS 到 ZOOKEEPER:分散式一致性原理與實踐》讀書筆記[2]——初識 Zookeeper

1 Zookeeper 概論 Zookeeper 是一個分散式資料管理與協調框架,它是叢集的管理者,監視著叢集中各個節點的狀態根據節點提交的反饋進行下一步合理操作。分散式應用程式可以基於它實現諸如資料釋出/訂閱,負載均衡,命名服務,分散式協調/通知,叢集管理,Master 選舉,分散式鎖和分散式

《從 PAXOS 到 ZOOKEEPER:分散式一致性原理與實踐》讀書筆記[1]——一致性協議

1 分散式 1.1 定義 分散式系統是一個硬體或軟體元件分佈在不同的網路計算機上,彼此之間僅僅通過訊息傳遞進行通訊和協調的系統 1.2 特點 分佈性、對等性、併發性、缺乏全域性時鐘、故障總是會發生 2 CAP 和 BASE 2.1 CAP CAP 理論:一個分散式系統不可