共識演算法的基石 Paxos

2021-10-11 14:41:07 字數 2606 閱讀 8157

事物都是有聯絡的,通過前幾章的學習,我們再次總結如下:

對比2pc協議

對比主從一致

通過對比主從一致,就好像是面臨先有雞還是先有蛋的論題。那麼共識演算法是如何解決這個死迴圈的呢?

共識演算法的理論基石:basic paxos

為什麼叫 basic paxos 是理論基石呢?因為 basic paxos 是經過數學證明的。當然,證明過程不需要了解(實際也不了解,總是學不會~)。

basic paxos 的 basic 就在於是對乙個值達成共識,而不是對一系列值達成共識。基礎思想就可以對比全序關係廣播。

在 basic paxos 的場景中,最終需要達成共識的節點叫做接受者,提出寫資料請求的節點叫做提議者,還有乙個學習者角色我們不做考慮。並且 提議者 可以有多個,所以會出現併發寫入的問題,也即前文分析的偏序環境。提議者寫資料也叫做發出提案。

現在我們知道,偏序環境想要變成全序環境,就需要針對 節點id 做文章,也即針對 提議者 做文章。假設 提議者 寫資料為 v,basic paxos 認為每個提議的格式(即提案)應該為:[n,v],其中 n 就表示提案編號。可以看到,這裡的提案編號實際就是前文的節點id,只不過提案編號更為靈活。

所以通過提案編號,basic paoxs 就將偏序環境成功的改變成了全序環境

那麼它是如何在全序環境中,實現全序關係關係廣播的呢?答案是:兩階段提交 + 細節限制。

首先,提議者會向所有接受者傳送 [n,] 的預提案,可以看到,此時並不會攜帶提案數值。當提議者收到大多數的接受者響應後,就會進入第二階段,傳送 [n,v] 的提案。其中 v 就是這個提議者提議的數值。最終,所有 接受者 就能針對該提案達成一致。

經過上面的過程描述,很明顯有幾處問題含糊不清,我們來一一分析。

當第一階段有多個提議者執行時怎麼辦?

n個接受者,那麼半數就是 n/2,所以乙個提議者要收到大於 n/2 個接受者的同意,才能進入到第二階段。第二個提議者也是如此,所以必然至少有乙個接受者,是會收到這兩個提議者的提案的。所以,我們的關注點應該在這個接受者怎麼處理上,而不是去考慮其他節點。

當這個接受者收到a提議者的提案後,假設提案資訊為 [n,],那麼當它在執行第二階段之前,又收到了第二個接受者的提案,比如為 [m,]。那麼會做判斷:

當第二階段有多個提議者提交提案時怎麼辦?

假設這個接受者當前同意的預提案為:[n, ]:

兩階段後,未達成共識的節點,最後是如何達成共識的?

經過上面的分析,可以看到兩階段之後,因為是針對大多數節點共識,所以有部分節點可能會存在未達成共識的情況。但是我們知道,共識演算法是要保證最終一致性的,怎麼做到呢?

為什麼會有節點不一致呢?肯定是兩類原因導致的:

如果是通訊網路中斷,那麼提議者就知道上個提案超時了,所以可以重新發起提案。重新發起提案又是走兩階段過程,所有網路恢復的節點就會同步到資料。

如果是節點崩潰,其實也相當於網路中斷。節點無法主動去向提議者同步資料,因為提議者可能有多個。所以主要還是依靠提議者重新發起提案,經過二階段提交,資料會最終達成一致。

是否會發生多個提議者不斷提案的情況

這個問題先保留,到後面選主的時候再分析。

共識演算法的思想基石:multi paxos

為什麼把 multi paxos 叫做思想基石呢?因為 multi paxos 沒有經過數學證明,只是一種思想,對後續分布式共識演算法有啟發作用,屬於經典思想。

basic paxos 在全序環境中對乙個值達成共識,而 multi paxos 則是在全序環境中,實現全序關係廣播。

相對於 basic paxos,multi paxos引入了幾個重要的優化。

提議者只有乙個,即主節點

這樣子,就和主從複製非常像了。只不過主節點是選舉出來的,至於主節點如何選舉,是開放性的。比如可以選主階段參照 basic paxos,來確認唯一的主節點。

一系列值的共識過程中,二階段降為一階段

第一階段主要是為了處理多個提議者提案衝突的情況,因為只有乙個提議者(主節點),所以在一系列值的共識過程中,就沒必要進行第一階段了。

對於 multi paxos 的學習,由於其實理論思想,所以這裡只稍微提一下,重點還是後續要學習的 raft 演算法。等理解了 raft 演算法,再回過頭看 multi paxos,會理解更深刻。

一系列值,怎麼記錄?

答案是通過日誌記錄,但是這裡我們先不管它。multi paxos 演算法是理論指導,raft 演算法是經過數學證明的 multi paxos 類演算法。所以等 raft 學習之後,再回過頭看 multi paxos 會更好。

提到日誌記錄,這裡放兩個概念,作為日後的聯絡對比:

可以先查檢視,下篇文章,我們先進入 raft 的學習,然後再迭代回來學習先前的知識。

raft演算法 Paxos和Raft共識演算法(二)

raft 譯文 在過去的 10 年中,leslie lamport 的 paxos 演算法幾乎已經成為了一致性演算法的代名詞,但是paxos 有兩個致命的缺點 第乙個是 paxos 太難以理解,第二個缺點是它難以在實際環境中實現。其中乙個原因是,對於多決策 paxos multi paxos 大家還...

諸葛 VS 龐統,拿下 Paxos 共識演算法

分布式確實是乙個有趣的話題,只要你留心觀察,分布式在生活中無處不在。前兩講主要是講解分布式理論,涉及到了分布式的四大理論。拜占庭將軍問題 用三國殺講分布式演算法,舒適了吧?base cap acid 用太極拳講分布式理論,舒服!從這篇開始,將會講解分布式的八大協議 演算法。本篇主要講解 paxos ...

Paxos 演算法簡介

拜占庭將軍問題 byzantine failure 是由萊斯利 蘭伯特提出的點對點通訊中的基本問題。意思就是,在存在訊息丟失的不可靠的通道上保證資訊的一致性是不可能的。所以在一般討論一致性的問題上時,比如paxos 演算法,都先假定不會存在拜占庭問題。paxos 是乙個分布式一致性演算法。主要解決的...