1.背景
今天開始更新分散式的文章,工作幾年後還沒系統的學習分散式的內容,趁著還有時間學習沉澱的時候多輸出些文章
2.為什麼需要分散式共識演算法
思考:現在你有一份隨時變動的資料,需要確保它正確儲存在網路的幾臺不同機器上,並且要保證資料是隨時可用的,應該怎麼做?
在分散式環境下,可以不必去追求系統內所有節點在任何情況下的資料狀態都一致,採用“少數服從多數”的原則,認為資料的變化被正確儲存在系統中。因此,我們需要一種演算法,能夠讓分散式系統內部暫時容忍節點存在不同的狀態,但最終大多數節點的狀態能夠一致。
這種讓系統能最終表現出整體一致性的過程,急救室各個節點的協商共識
3.Paxos演算法的歷史
簡單寫下Paxos演算法的歷史,最早是由Leslie Lamport(就是大名鼎鼎的LaTeX中的“La”)提出的一種基於訊息傳遞的協商共識演算法。
Lamport 在 1990 年首次發表了 Paxos 演算法,選的論文題目就是“The Part-Time Parliament”。但是由於論文使用了希臘城邦的比喻,使得論文更為晦澀難懂,審稿人要求Lamport進行修改,Lamport 非常不爽,然後乾脆就撤稿不發了。 2001 年,Lamport 在“SIGACT News”雜誌上發表了這篇論文,並放棄了“希臘城邦”的比喻。
之後,2006 年,Google 的 Chubby、Megastore 和 Spanner 等分散式系統,都使用 Paxos 解決了分散式共識的問題,這才使得Paxos 演算法一夜間成為電腦科學分散式這條分支中,最炙手可熱網紅概念。
4.Basic Paxos演算法工作流程
Basic Paxos演算法將分散式系統中的節點分為提案節點、決策節點和記錄節點三類
- 提案節點Proposer:提出對某個值進行設定操作的節點,設定值這個行為就像提案,值設定成功後,不可變也不會丟失
- 決策節點Acceptor:應答提案的節點,需要對提案進行投票,同時需要記住自己的投票歷史
- 記錄節點Learner:超過半數決策節點就某個提案達成了共識,那麼記錄節點就需要接受這個提案,並就該提議作出運算,然後將運算結果返回給客戶端
4.1Paxos演算法怎麼解決併發操作帶來的競爭?
分散式環境下,一個節點取得鎖後,如果在釋放鎖之前發生崩潰,整個操作都會被無限期等待阻塞。
Paxos解決競爭分2個階段:
準備Prepare:提案節點先廣播一個Prepare請求,並附帶一個全域性數字n作為提案ID,決策節點收到請求後,“兩個承諾,一個應答”。承諾不在接收提案ID小於等於n的Prepare請求,也承諾不再接收小於n的Accept請求。應答已經批准過的提案中ID最大的那個。
批准Accept:提案節點收到多數派的應答後,會有兩種結果:
- 所有響應的決策節點此前沒有批准過這個值,即首次設值的情況,那就自己隨意選定值與提案ID,廣播給決策節點
- 響應決策節點中,已有至少一個節點的應答中包含有值了,非首次設值的情況,那麼需要從應答中找出提案ID最大的那個值,再廣播。協商共識結束
Basic Paxos 只能對單個值形成決議,並且決議的形成至少需要兩次網路請求和應答(準備和批准階段各一次),高併發情況下可能形成活鎖。現在只做理論學習就行了。下面講Multi Paxos演算法。
5.Multi Paxos共識演算法
5.1核心改進
概念:Multi-Paxos 只是一種思想,這種思想的核心就是透過多個 Basic Paxos 例項就一系列值達成共識。
相比較Basic Paxos演算法,Multi Paxos增加了選主
的過程:
- 提案節點發現沒有主提案節點時,使用準備、批准兩輪網路互動,向其他節點廣播自己競選主節點請求
- 得到決策節點多數派的批准時,競選主節點成功。
選主之後,所有客戶端請求都會由主節點來完成提案,不再需要準備過程,只需要 執行批准互動即可:
5.2只有主從節點
有了主節點後,角色可以簡化,不再區分提案、決策、記錄節點。只區分主、從節點。
於是,分散式系統中如何對某個值達成一致 的問題可以分為3部分解決:
- 如何選主
- 如何把資料複製到各個節點上
- 怎麼保證過程是安全的
3個問題解決了,就達成共識了。
這裡針對問題2和問題3寫些內容,用於應對可能的面試:
問題2:資料複製的過程?
- 主節點將 X 寫入自己的變更日誌,但先不提交,接著把變更 X 的資訊在下一次心跳包中廣播給所有的從節點,並要求從節點回復“確認收到”的訊息;
- 從節點收到資訊後,將操作寫入自己的變更日誌,然後給主節點傳送“確認簽收”的訊息;
- 主節點收到過半數的簽收訊息後,提交自己的變更、應答客戶端並且給從節點廣播“可以提交”的訊息;
- 從節點收到提交訊息後提交自己的變更,資料在節點間的複製宣告完成。
問題3:過程是安全的?
- 協定性Safety:保證選主的結果一定有且只有唯一的主節點
- 終止性Liveness:保證選主過程一定是在某一時刻能夠結束的
從極客時間課程原文上沒理解清楚這段的解釋,先空著吧,後面理解了再修改這段
總結
Paxos 演算法不直接應用於工業界,理解原理理論就行。它的變體演算法,比如我們今天學習的 Multi Paxos、Raft 演算法,以及沒有提到的 ZAB 等演算法,都是分散式領域中的基石。