分布式一致性協議介紹(Paxos Raft)

2022-07-03 13:54:13 字數 3621 閱讀 1649

兩階段提交

two-phase commit(2pc):保證乙個事務跨越多個節點時保持 acid 特性;

兩類節點:協調者(coordinator)和參與者(participants),協調者只有乙個,參與者可以有多個。

過程:準備階段:協調者詢問參與者事務是否執行成功;

提交階段:如果事務在每個參與者上都執行成功,協調者傳送通知讓參與者提交事務;否則,協調者傳送通知讓參與者回滾事務。

需要注意的是,在準備階段,參與者執行了事務,但是還未提交。只有在提交階段接收到協調者發來的通知後,才進行提交或者回滾。

存在的問題

paxos(lamport):

分布式系統中的節點通訊存在兩種模型:共享記憶體

(shared memory)和訊息傳遞

(messages passing)。

基於訊息傳遞通訊模型的分布式系統,不可避免的會發生以下錯誤:程序可能會慢、被殺死或者重啟,訊息可能會延遲、丟失、重複,在基礎paxos場景中,先不考慮可能出現訊息篡改即拜占庭錯誤

的情況。

paxos演算法解決的問題是在乙個可能發生上述異常的分布式系統

中如何就某個值達成一致,保證不論發生以上任何異常,都不會破壞決議的一致性。

主要有三類節點:

提議者(proposer):提議乙個值;

接受者(acceptor):對每個提議進行投票;

告知者(learner):被告知投票的結果,不參與投票過程。

過程:規定乙個提議包含兩個字段:[n, v],其中 n 為序號(具有唯一性),v 為提議值。

下圖演示了兩個 proposer 和三個 acceptor 的系統中執行該演算法的初始過程,每個 proposer 都會向所有 acceptor 傳送提議請求。

當 acceptor 接收到乙個提議請求,包含的提議為 [n1, v1],並且之前還未接收過提議請求,那麼傳送乙個提議響應,設定當前接收到的提議為 [n1, v1],並且保證以後不會再接受序號小於 n1 的提議。

如下圖,acceptor x 在收到 [n=2, v=8] 的提議請求時,由於之前沒有接收過提議,因此就傳送乙個 [no previous] 的提議響應,並且設定當前接收到的提議為 [n=2, v=8],並且保證以後不會再接受序號小於 2 的提議。其它的 acceptor 類似。

如果 acceptor 接受到乙個提議請求,包含的提議為 [n2, v2],並且之前已經接收過提議 [n1, v1]。如果 n1 > n2,那麼就丟棄該提議請求;否則,傳送提議響應,該提議響應包含之前已經接收過的提議 [n1, v1],設定當前接收到的提議為 [n2, v2],並且保證以後不會再接受序號小於 n2 的提議。

如下圖,acceptor z 收到 proposer a 發來的 [n=2, v=8] 的提議請求,由於之前已經接收過 [n=4, v=5] 的提議,並且 n > 2,因此就拋棄該提議請求;acceptor x 收到 proposer b 發來的 [n=4, v=5] 的提議請求,因為之前接收到的提議為 [n=2, v=8],並且 2 <= 4,因此就傳送 [n=2, v=8] 的提議響應,設定當前接收到的提議為 [n=4, v=5],並且保證以後不會再接受序號小於 4 的提議。acceptor y 類似。

當乙個 proposer 接收到超過一半 acceptor 的提議響應時,就可以傳送接受請求。

proposer a 接受到兩個提議響應之後,就傳送 [n=2, v=8] 接受請求。該接受請求會被所有 acceptor 丟棄,因為此時所有 acceptor 都保證不接受序號小於 4 的提議。

proposer b 過後也收到了兩個提議響應,因此也開始傳送接受請求。需要注意的是,接受請求的 v 需要取它收到的最大 v 值,也就是 8。因此它傳送 [n=4, v=8] 的接受請求。

acceptor 接收到接受請求時,如果序號大於等於該 acceptor 承諾的最小序號,那麼就傳送通知給所有的 learner。當 learner 發現有大多數的 acceptor 接收了某個提議,那麼該提議的提議值就被 paxos 選擇出來。

raft(14年):簡化,更容易理解,也更容易實現。

引入主節點,通過競選。

節點型別:follower、candidate 和 leader

leader 會週期性的傳送心跳包給 follower。每個 follower 都設定了乙個隨機的競選超時時間,一般為 150ms~300ms,如果在這個時間內沒有收到 leader 的心跳包,就會變成 candidate,進入競選階段。

流程:① 下圖表示乙個分布式系統的最初階段,此時只有 follower,沒有 leader。follower a 等待乙個隨機的競選超時時間之後,沒收到 leader 發來的心跳包,因此進入競選階段。

② 此時 a 傳送投票請求給其它所有節點。

③ 其它節點會對請求進行回覆,如果超過一半的節點回覆了,那麼該 candidate 就會變成 leader。

④ 之後 leader 會周期性地傳送心跳包給 follower,follower 接收到心跳包,會重新開始計時。

① 如果有多個 follower 成為 candidate,並且所獲得票數相同,那麼就需要重新開始投票,例如下圖中 candidate b 和 candidate d 都獲得兩票,因此需要重新開始投票。

② 當重新開始投票時,由於每個節點設定的隨機競選超時時間不同,因此能下一次再次出現多個 candidate 並獲得同樣票數的概率很低。

① 來自客戶端的修改都會被傳入 leader。注意該修改還未被提交,只是寫入日誌中。

② leader 會把修改複製到所有 follower。

③ leader 會等待大多數的 follower 也進行了修改,然後才將修改提交。

④ 此時 leader 會通知的所有 follower 讓它們也提交修改,此時所有節點的值達成一致。

理解分布式一致性協議Paxos

question 大名鼎鼎的paxos協議是啥?ansower 分布式一致性協議 這麼逼格的術語,就問你怕不怕?能不能搞的中國話一點,簡單一點,而不是翻譯 paxos made 呢?一直覺得lesile lamport的腦迴路和常人不一樣好伐。文章前面部分一眼都懂,後面的,眼睛瞄瞎都不一定看得懂。本...

分布式一致性演算法之Paxos

paxos的重要概念 提案 proposal proposal訊息包括提案編號 proposal id 和提案的值 最終一致值value paxos演算法角色 client 客戶端,主要是向分布式系統發出請求,並等待響應。例如 對分布式檔案伺服器中檔案的寫請求 proposer 提案發起者,提倡客戶...

分布式一致性

分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...