共識算法針對的問題
分佈式系統中,基礎的 共識算法(Consensus Algorithm) 希望解決的是如下問題:消息有亂序、丟失、重複情況下,多個分佈式節點對一個值達成最終絕對一致1。
- 不考慮消息內容的篡改(Byzantine)
- 節點存儲必須絕對可靠
爲什麼對 Paxos、Raft 等的研究很重要
傳統 2PC(兩階段提交)、3PC(三階段提交) 的缺點是這一個節點宕機則系統不可用(或存在 腦裂 問題不能解決);這些現代共識算法的目標就是在有多個副本同時參與、超半數仍正常工作的情況下(少數副本可以掛掉,從而可用性更高了)仍能保證 100% 一致性。
Paxos、Multi-Paxos、Raft
Paxos 和 Raft 的前世今生 | 知乎1 這篇文章是我認爲講解的比較讓我抓住了脈絡的文章,可以參考。
- Paxos: 保證單個提案的一致
- 方法:多個 Acceptors;Proposal = (ID, V),ID 有全序關係;超半數同意
- 保證永遠可用嗎?不:
- 一樣可能多數都掛掉,只是可靠性更高了
- 原始的 Paxos 會出現兩階段化帶來的活鎖
- 值得閱讀:
- Paxos 初版論文 from Lamport - The Part-Time Parliament, TOCS’982
- Paxos 二版解釋 from Lamport - Paxos Made Simple3
- 最清楚的解釋來自 wiki:https://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B3%954
- Multi-Paxos:提高性能但只需保證一批提案的最終一致
- 方法:利用 Paxos 選舉唯一的 leader,而後在 leader 有效期內所有的議案都只能由 leader 發起
- 值得閱讀:http://oceanbase.org.cn/?p=1115
- Raft:更貼近實踐、更易理解的 Multi-Paxos 方案
- 方法:加入 Timeout 機制;Leader Election & 任期(Term);Log Replication,Paxos 中的 ID 即爲 Raft 中的 Term + Log Index,一旦出現更新的 log 則聽從,保證 log 的最終一致性
- 值得閱讀:
- Raft 官網 - https://raft.github.io/
- Raft 論文 from Stanford - In Search of an Understandable Consensus Algorithm6
- 非常好的在線演示:http://thesecretlivesofdata.com/raft/