1. 程式人生 > >分散式中的一致性演算法:Paxos和Raft比較

分散式中的一致性演算法:Paxos和Raft比較

概述

分散式中的一致性可以被描述為在協作解決問題的一組操作之間達成一致的行為。隨著開源分散式計算和儲存平臺的興起,一致性演算法已成為複製的基本工具。其中Paxos和Raft是最受歡迎的一致性演算法,通過消除單點故障來提高系統的彈性。

雖然Paxos在分散式一致性方面主導著學術和商業話語,但協議本身太複雜而無法推理,因此需要更易理解的演算法。研究人員對Paxos進行了廣泛的研究,而Raft在工程師中非常受歡迎。Raft的受歡迎程度來自這樣一個事實:儘管研究人員對Paxos感興趣,但工程師仍然需要閱讀幾篇論文,以便能夠理解並建立解決實際問題的解決方案,並在通訊步驟方面提供良好的效能。此外,他們仍然需要填補自定義實施的一些空白,這些實施有時會變得非常脆弱。

為了克服這個障礙,Diego Ongaro和John Ousterhout建立了一個名為Raft的新一致性演算法,它被設計為更容易理解,併為構建實用系統提供了比Paxos更好的基礎。雖然Raft為分散式系統的複雜世界帶來了一些新鮮血液,但它仍然與Paxos有許多共同之處。例如,兩者都要選出一位負責決定協商一致的領導者。

在這篇博文中,我們將簡要介紹Paxos和Raft之間的相同點和不同點。首先,我們將描述一致的演算法是什麼。其次,我們將描述如何使用一致性演算法的例項來構建複製解決方案。然後我們將描述如何在演算法和一些安全和活躍屬性中選出領導者。

一致性

分散式系統的特徵在於一組安全性和活躍性或兩者的混合。簡單地講,安全是一種財產,規定在執行程式期間不會發生任何不良事件。另一方面,活躍性規定最終會發生一些好事。

一致性的目標是使一組伺服器在一個值上達成一致,所以活躍的特徵在於最終每個伺服器都可以決定一個值。安全性表明沒有兩臺伺服器來設定值。

不幸的是,伺服器執行演算法步驟可能比其他伺服器花費更長時間,並且可能崩潰並停止處理一致性演算法。郵件可能會延遲,無序傳遞或丟失。這些方面使得一致性演算法的實施變得非常困難,並迫使它們在“不穩定”期間降低標準並保持安全。確切地說,當系統變得“穩定”時雖然未知,但最終它將保持足夠長的“穩定”,以便一致性演算法能夠做出決定達成最終的一致性。

在穩定執行中,系統需要兩個通訊步驟:leader - (1) - > servers - (2) - > leader:
協商一致的影象


領導者向所有伺服器傳送它想要達成協議的值,並且每個伺服器回覆給領導者,通知他已經接受了請求。因此,當領導者從法定數量(n/2+1節點)的伺服器接收訊息時,就達成了協議。

請注意,我們在此分析中省略了兩條訊息:將伺服器希望與領導者達成協議的值轉發給伺服器的訊息以及通知伺服器已達到該值協議的訊息。如果伺服器將接受訊息傳送到所有伺服器,或者在領導者傳送給伺服器的下一條訊息中捎帶資訊,則後一條訊息可能不是必需的。

複製

為了實現複製,執行一致性演算法的幾個例項,並且每個例項都被限制在複製日誌中的一個槽條目中,該條目可能會持久儲存在磁碟上。領導者可以並行執行多個例項以填充不同的插槽,從而提高效能。但是,並行度高度依賴於硬體、使用的網路和應用程式。

每個領導者都對自己當選時增加的一輪或一個週期負有獨特的責任:
插槽影象

領導人選舉

Paxos和Raft都認為最終會有一個領導者,所有穩定的伺服器都會信任,而一個領導者負責一個週期(Term)。如果懷疑現任領導人有問題,新領導人將提出一個新任期,必須大於前一任期。

在Raft中,伺服器向其他伺服器傳送“領導請求”,並且在認為自己是領導者之前期望大多數伺服器的回覆。如果它沒有得到大多數伺服器的回覆或者接收到另一個伺服器已成為領導者的訊息,它將超時並重新開始新的選舉過程。伺服器每個Term只能投票給一個領導者請求。

但是,Paxos並沒有真正定義伺服器如何成為領導者。為簡單起見,研究人員利用伺服器id(整數)等程序之間的先後排名。因此,沒有被懷疑的排名最高或最低的伺服器成為新的領導者。雖然這是一個簡單直觀的解決方案,但它需要在伺服器之間劃分術語空間:新術語=舊術語+ N,其中N是伺服器的最大數量。

Raft對領導者選舉過程施加限制:只有最新的伺服器才能成為領導者。基本上,它保證領導者擁有以前週期中的所有已提交條目,並且不需要了解它不知道的複製日誌中的舊條目。因此,在成為領導者之後,伺服器可以簡單地在其他伺服器上“強加”其“願望”。

然而,Paxos允許任何伺服器成為領導者。因此,伺服器必須在開始在其他伺服器上“強加”其“願望”之前瞭解過去,提高了靈活性但也伴隨著額外的複雜性。
領導者影象
在Raft中,伺服器1或伺服器2可以成為領導者。而在Paxos中,任何一個都可以。

安全

由於系統的非同步性質,伺服器可能在不同時間感知故障和選舉。這意味著伺服器可能會以不同的方式臨時執行,但最終所有伺服器都會收斂到一個Term。

在任何情況下,如果伺服器從比其當前版本更早的Term獲得訊息,則這意味著傳送者要麼是領導者,要麼試圖成為舊Term中的一個,並且接收者必須拒絕該訊息並通知傳送者。

如果伺服器從一個大於當前的Term獲得訊息,這意味著有一個新Term和一個新的領導者,並且接收者必須開始接受領導者的“願望”。

但是,兩種演算法都必須小心避免覆蓋舊領導做出的決定,從而違反安全規定。這就是Raft和Paxos分歧的地方,我們可以看到Raft使用了簡單而優雅的方法。

如上所述,Raft對領導者選舉演算法施加限制,只有最新的伺服器才能成為領導者:

Raft通過比較日誌中最後一個條目的索引和術語來確定兩個日誌中哪一個更新。如果日誌包含具有不同術語的最後一個條目,則具有較晚術語的日誌將更新。如果日誌以相同的術語結束,則更長的日誌更新是最新的。

然後,領導者只需要確保伺服器中的複製日誌最終收斂,這是通過施加以下限制來完成的:如果伺服器之前沒有接受插槽的值,“n"伺服器不能接受插槽的值"n - 1”。領導者包括當前請求中的先前日誌條目的術語,並且如果其先前請求的術語與領導者傳送的術語匹配,則伺服器僅接受該請求。否則,它要求領導者首先發送先前失蹤的請求,如此反覆"n - 2"和 "n - 3"等。

在Paxos中,任何伺服器都可以成為領導者,因此避免決策不被覆蓋的任務變得有點複雜,因為新的領導者必須在開始“強加”它之前找出其他伺服器已處理的內容。希望“在別人身上。這是Paxos演算法的準備階段,必須在選出新領導者後執行一次。準備訊息包含新術語和插槽號,“n"通過該插槽號可以達到所有先前條目的協議。伺服器回覆有關大於的插槽的資訊"n”,此資訊用於限制新領導者為這些插槽建議的值。

活躍度

只要大多數伺服器還活著,保證n/2+1節點正常就能夠提供服務。

結論

我們已經展示了Raft和Paxos之間的相似之處,關鍵的區別在於如何選出領導者並保持安全。在Raft中,只有最新的伺服器才能成為領導者,而Paxos允許任何伺服器成為領導者。然而,這種靈活性伴隨著額外的複雜性。

請注意,Raft和Paxos中的領導者可能會成為瓶頸,因為所有流量都會通過它。