分布式確實是乙個有趣的話題,只要你留心觀察,分布式在生活中無處不在。
前兩講主要是講解分布式理論,涉及到了分布式的四大理論。
拜占庭將軍問題:《用三國殺講分布式演算法,舒適了吧?》
base、cap、acid:《用太極拳講分布式理論,舒服!》
從這篇開始,將會講解分布式的八大協議/演算法。本篇主要講解 paxos 共識演算法。
paxos
是分布式演算法中的老大哥,可以說 paxos 是分布式共識的代名詞。最常用的分布式共識演算法都是基於它改進。比如 raft 演算法(後面也會介紹)。所以學習分布式演算法必須先學習 paxos 演算法。
paxos 演算法主要包含兩個部分:
basic paxos 演算法是 multi-paxos 思想的核心,multi 的意思就是多次,也就是說多執行幾次 basic paxos 演算法。所以 basic paxos 演算法是重中之重。
三國中劉備集團,有兩大軍師:諸葛亮和龐統,都是非常厲害的人物,當他們有不同作戰計畫給多名武將時,如何達成一致?
paxos 中有三種角色:提議者、接受者、學習者。
讓我們用更通俗的方式來講解 paxos 演算法。讓我們穿越回東漢末年,劉備集團的帳營中一同學習 paxos 演算法是怎麼攻打曹操的。
劉備的帳營中人物介紹:
為什麼說節點可以扮演接受者,也可以扮演提議者呢?
上篇我在講解 base 協議的時候,講到二階段
提交協議。其中有乙個協調者的身份,協調者既可以是接受者,也可以是提議者。
如下圖所示,節點 1 作為提議者和接受者,節點 2 和節點 3 作為接受者。
三國中有劉備集團(佔據西蜀)、曹操集團(佔據北邊)、孫權集團(佔據江南)。
諸葛亮
和龐統
作為提議者,向三個接受者進作戰計畫的提案。提案中有兩個屬性:
諸葛亮
的作戰計畫是從北邊
進攻曹操,龐統
的作戰計畫是從南邊
進攻曹操,而關羽、張飛、趙雲先後收到了他們的作戰計畫,該聽誰的呢?這裡就是乙個共識
的問題。而 paxos 演算法達成共識分兩個階段。準備(prepare)階段
和接受(accept)階段
。
諸葛亮和龐統作為提議者,分別向所有的接受者(關羽、張飛、趙雲)傳送包含作戰計畫編號(提案編號)的準備請求
,但不包含作戰計畫(提案值)。
注意:準備階段不需要攜帶具體的作戰計畫,所以作戰計畫可以為空,但是提議編號必須有。
按照接受請求的時間順序,關羽和張飛收到諸葛亮的請求[1,空]
,趙雲收到龐統的請求[2,空]
。
因為關羽、張飛之前沒有收到提案,所以返回乙個尚無提案
的響應。也就是告訴諸葛亮,不會再響應編號小於等於1
的準備請求了,也不會通過編號小於1
的提案。響應的時間點是 14 點和 15 點。
而趙雲之前也沒有收到提案,所以返回乙個尚無提案
的響應。也就是告訴龐統,不會再響應編號小於等於2
的準備請求了,也不會通過編號小於2
的提案。響應的時間點是 16 點。
而對於龐統的準備請求,關羽、張飛收到編號為2
的準備請求,而 編號2
大於之前接受到的編號1
,而且關羽和張飛沒有通過任何提案,所以還是會返回給龐統一個尚無提案
的響應。也就是告訴龐統不會再響應編號小於等於2
的準備請求了,也不會通過編號小於2
的提案。響應的時間點是14 點和 15 點。
而趙雲最後收到諸葛亮編號為1
的準備請求
後,因編號1
小於之前響應的準備請求的提案編號2
,所以直接丟棄該準備請求,不做響應,如上圖的 ❌ 圖示。
諸葛亮和龐統收到準備響應後,會分別傳送接受請求,如下圖所示:
諸葛亮
收到大多數接受者(關羽和張飛)的準備響應
後,根據響應中提案編號最大的提案的值,設定接受請求
中的值。因為關羽和張飛返回的準備響應都是尚無提案,所以還是傳送提案編號為1
,提案值為北
的接受請求
,北
代表從北邊進攻曹操。傳送的時間點是15 點過 1 分、16 點。
為什麼是 15 點過 1 分?因為只要滿足大多數接受者的準備請求後,就可以傳送接受請求
了。關羽和張飛響應的時間點是 14 點和 15 點,所以 15 點以後就可以傳送了。
而龐統
收到大多數接受者(關羽、張飛和趙雲)的準備響應
後,根據響應中提案編號最大的提案的值,,設定接受請求
中的值。因為關羽、張飛和趙雲返回的準備響應都是尚無提案,所以還是傳送提案編號為2
,提案值為南
的接受請求
,南
代表從南邊進攻曹操。傳送的時間點是18 點、19 點、20 點。
當關羽、張飛、趙雲收到諸葛亮和龐統的接受請求
後,會進行如下處理,如下圖所示:
關羽、張飛、趙雲收到諸葛亮傳送的提案 [1,北]時候,因為提案編號1
小於他們承諾的能通過的提案的最小提案編號2
,所以諸葛亮的提案被拒絕了。
而當他們收到龐統的傳送的提案 [2,南] 的時候,因為編號 2 不小於之前承諾的編號 2,所以通過龐統的提案 [2,南] ,所以關羽、張飛、趙雲他們的作戰計畫是從南邊進攻曹操。達成了共識。
當接受者通過了乙個提案時,就通知所有的學習者。當學習者發現大多數的接受者都通過了某個提案,那麼學習者也會通過該提案,接受該提案的值。
也就是說關羽、張飛、趙雲達成了共識後,學習者法正
和馬良
也同樣通過從南邊進攻的作戰計畫。
龐統的求職記錄 雜談大學生面試
龐統的求職記錄 雜談大學生面試 看過 三國演義 的讀者恐怕還記得龐統這個人物,按照水鏡先生的說法,臥龍 鳳雛,二人得一,可安天下 臥龍是諸葛亮,鳳雛是龐統,二人才能不相上下。但是龐統的求職的經歷卻遠遠沒有諸葛亮那麼順利,可以說是一波三折。公元210年,周瑜死後,孫權任命魯肅接替周瑜,但是魯肅擔心自己...
諸葛亮北伐的目的根本不是為了滅魏,而是一統三秦
魏蜀之戰,先後有兩大勝負手,一是漢中地的歸屬,乙個就是關中地的歸屬。誰佔據了全部,誰就是又乙個秦帝國。結果是兩家各佔乙個。諸葛亮北伐的根本目的,不是為了滅魏,而為了一統三秦 而司馬氏則對諸葛亮打的是什麼算盤心知肚明,鑑於曹魏國內外博弈的情況,司馬氏決定固守關中,耗死諸葛亮和他的蜀漢,同樣也不斷消耗曹...
諸葛亮vs司馬懿,排序演算法大戰誰能笑到最後?
公元234年,蜀漢丞相諸葛孔明再次北伐。一日,與司馬仲達所率魏軍兩軍相峙,二人陣前舌戰。司馬曰 諸葛村夫,吾與汝相鬥數年,鬥兵鬥陣鬥謀略,均已疲乏。今日,何不一改陳規,鬥點新奇玩意?諸葛輕撫羽扇,言道 仲達今日想比試些什麼?你我各遣相等數量兵士,立作一排,再互派一人至對方軍前,看誰派遣之人先將這一排...