做者:愛釣魚的桌子哥,資深架構師面試
目錄 算法
1. Paxos算法是什麼?架構
2. 團建主席的選舉過程分佈式
3. Paxos第一階段:申請階段3d
4. Paxos第二階段:比較順利的投票階段cdn
5. Paxos第二階段:若是投票不太順利呢?blog
6. 引伸:Paxos算法專業名詞解釋排序
Paxos算法是一個很是經典的算法,在分佈式系統中有很是普遍的使用,好比在大名鼎鼎的ZooKeeper中就有很核心的使用。數學
如今出去面試難度愈來愈大,尤爲是一些知名的互聯網公司。由於這些互聯網公司的系統都會用到各類各樣的技術,好比上述所說的ZooKeeper。it
前幾年,一個候選人出去面試大廠的Java職位,可能就讓你說一下對ZooKeeper的原理的理解以及使用就能夠了。
可是如今競爭愈來愈激烈,出去面試可能就會直接讓你說一個技術底層的核心算法實現,好比Paxos算法就是如今大廠愈來愈多會問到的一個問題。
可是像Paxos這類算法實在是很是的枯燥難懂,不少文章講這個都是用了一大堆的專業術語,還有不少的數學公式,並且裏面不少概念都解釋不清楚。
而對於工程方向的技術人來講,對Paxos算法只要從一個高層次的角度,對他核心的思想理解就已經能夠了。
因此本文咱們用比較通俗易懂的方式,從一個有趣的角度來描述一下Paxos算法的核心思想,幫助你在大廠面試中脫穎而出!
假如如今一個公司的團隊裏有25我的,如今這25我的之間須要找一我的出來做爲團建主席,也就是專門負責這個團隊團建相關的組織事宜,好比組織你們出去旅遊、出去吃喝玩樂。
這個團建的場景,以及團建主席這個角色你們應該很熟悉。
其實這個場景引伸到技術裏,就是很是典型的一個分佈式系統選舉的場景。若是有25臺機器,這些機器之間要選舉出來某一臺機器來做爲一個Leader角色的節點,負責對集羣進行總體上的 管控,是否是就跟一個團隊選舉一個團建主席一個道理。
此時確定有人說,那還不簡單,找一我的做爲投票負責人,先讓有興趣擔任團建主席的人自願申請提名本身,而後你們分別對這些人進行投票 ,投票給誰都告訴那個投票負責人,由那我的統計各個候選人的票數,看哪一個人的票數多最後就選擇誰當團建主席就能夠了。
這個方案確實是沒問題的,可是Paxos算法是不承認這種方式的。
從Paxos算法的角度而言,它會以爲若是你們都依賴一個投票負責人來進行投票,那萬一投票負責人忽然失聯了怎麼辦?
好比家裏有人生病了去醫院了,或者本身忽然食物中毒去醫院了,那你們不就無法選舉出來一個團建主席了?
提示音:
引伸到技術裏,那就是25臺機器挑選了其中一臺機器做爲投票選舉的負責人,專門收集你們的投票,而後票數排序,最後選擇出來一臺機器,那萬一那臺機器忽然宕機了怎麼辦?是否是會致使選舉失敗?因此Paxos算法是不接受這種方式的。
以下圖所示:
因此如今你們就換一個思路了,這25我的不要經過一個投票負責人的方式來投票選舉,而是互相之間發送短信,就經過互相發送短信的方式來選舉一個團建主席。
這個好處在於哪怕25我的裏有12我的都由於工做忙、在開會、孩子生病了,而後無法經過短信的方式參與投票,可是剩餘的13我的仍是有超過半數的人在這裏,他們就能夠完成最終的投票。
這樣投票的過程就不用依賴於某我的了,哪怕將近一半的人都失聯了,仍是能夠選舉出來這個團建主席。
提示音:
引伸到技術裏,就是25臺機器不要找一個投票負責人,它們互相之間發送消息進行通訊,來嘗試選舉出來一個團建主席。
這樣哪怕有12臺機器都故障宕機了,可是剩餘的已通過半數的13臺機器仍是能選舉出來一個團建主席的,對系統容錯性就有了大大的提高。
那麼那25我的到底怎麼經過互相發送短信來選舉一個團建主席出來呢?
首先這25我的裏,須要找出來其中5我的做爲選舉隊長,這5我的負責跟全部人收發短信肯定團建主席的人選,而後假設有3個候選人是要提名做爲團建主席。
下圖展現了這個過程:
首先,除了那5個隊長之外,全部人都須要在第一個階段嘗試申請跟投票隊長進行溝通。
這個階段,每一個團隊成員都會給每一個隊長髮送一條短信,並且是不停的發送短信,短信內容就是我申請跟你進行溝通。
而每一個隊長也會不停收到每一個成員發送過來的短信,對於隊長來講,拿到短信就根據時間戳判斷,若是一我的發送過來的短信是最新的,那麼就回話說我贊成跟你進行溝通。
若是一個成員收到超過半數(這裏就是3個)的隊長的回信說贊成溝通,那麼就能夠告訴那些贊成溝通的隊長,本身想要投票給誰。
可是這裏要注意一點,隊長是會不斷的收到別人發過來的短信的,因此極可能他剛剛答應跟你溝通,結果立馬收到別人的短信,發現別人的短信更新,因此就贊成跟別人進行溝通了,你的溝通權就會被取消。
因此若是一個成員狂發短信的過程當中,忽然發現本身被超過半數的隊長贊成溝通了,彆着急高興。
這個成員須要趕忙繼續下一個階段,告訴那些隊長本身想要投票的候選人,要是發晚了,人家隊長可能就在跟別人溝通了,不會理你了!
這個時候一個成員得到了跟半數以上隊長的溝通資格,而後就能夠發送一條短信過去,說本身想要選舉的人是三個候選人裏的誰,這我的選可能就是成員本身拍腦殼決定的,隨機選擇的一個候選人而已。
這時你們考慮一下,若是3個隊長都沒有收到其餘成員發過來的更新的申請短信,都保持着跟這個成員的溝通,那麼3個隊長收到他發過來的投票,好比說選舉「張三 」當作團建主席,那就直接經過了!
這個時候成員發現3個隊長都回話說,就用你說的那個「張三」同窗做爲團建主席了,那就定了,此時團建主席就是這個「張三」了。
後續其餘成員發申請短信給隊長的時候,若是它們跟那三個隊長得到溝通權,三個隊長都會回覆短信說,就是「張三」了,已經選舉出來了。
這個時候,其餘成員都會直接遵照這個選舉結果,就認爲是「張三」了。
另外一種狀況,此時要是某個其餘成員跟 1 個知道「張三」投票結果的隊長溝通,然而它跟另外 2 個知道「 張三 」投票結果的隊長沒創建上溝通,卻跟剩下的2個還不知道「張三」投票結果的隊長溝通,這個成員由於感知到了其中1個隊長已經選擇了「張三」,此時他就會嘗試說,我就投票給「張三」了,通知另外2個還在茫然中的隊長是「張三」。
此時另外兩個茫然的隊長也會選擇接受「張三」的投票結果,最後5個隊長都會接收「張三」這個投票結果,而後全部成員在跟隊長溝通的過程當中,也必然會所有接收到「張三」這個投票結果。
最後全部成員都會發現,最終的選舉結果,就是:張三。這是一個很是順利的投票階段。
那麼來複盤一下上面的狀況,萬一要是投票的過程不太順利呢?
好比一個成員好不容易獲取了跟三個隊長的溝通資格,結果發送投票請求過去的時候,其中一個隊長已經跟別人創建了溝通,此時就不會理睬你的投票。
那可能就只有2個隊長接收了你的「張三」的投票,可是沒到3個隊長就不能肯定選擇「張三」。
這個時候怎麼辦?可能在這種混亂的狀況下,好比5個隊長裏,其中2個隊長接收到的投票是「張三」,1個隊長是「李四」,2個隊長是「王五」,無法肯定選舉結果。
而後全部成員繼續持續不斷的重複上述步驟,跟隊長申請溝通,而後再嘗試投票。
假如一個成員跟3個隊長創建了溝通,其中2個隊長告訴他本身已經接收到「張三」投票了,1個隊長告訴他本身已經接收到「李四」投票了,那麼這個成員會看哪一個投票是最新的,好比說「李四」那個投票是最新的,那麼他就會說,我就投「李四」了。
此時那2個接收到「張三」投票的隊長就會改變本身的選票爲「李四」,而後就會出現3個隊長都接受了「李四」這個投票。
若是另一個成員跟1個接收「李四」投票的隊長以及2個接收「王五」投票的隊長創建了溝通,會發現「李四「是最新選出來的,此時他會說,我就投給「李四」了。
而後那2個接收「王五」投票的隊長,也會接收「李四」的投票。以此類推,你們開一下本身的腦洞,這個過程可能會持續很長時間,直到最後,全部隊長都接受了「李四」的投票,全部成員也會接收「李四」的投票。
其實上述過程已經用一個簡單的投票選舉團建主席的例子給簡化的很是通俗了,雖然仍是有點燒腦,可是建議你們多看幾遍,確定照着思路能大體想明白Paxos算法的一個思路。
他有兩個要點:一個是超過半數的運用,一個是隻用最新的投票 。
Paxos算法裏,對一堆機器中扮演隊長角色的機器叫作「Acceptor」,對於普通成員的角色叫作「Proposer」,互相發短信其實就是發消息進行通訊,短信的時間戳就是「epoch」。
你們把上述的過程換成機器之間的通訊以及選舉,就能清楚這個過程了。
END
長按下圖二維碼,即刻關注【狸貓技術窩】
阿里、京東、美團、字節跳動 頂尖技術專家坐鎮
爲IT人打造一個 「有溫度」 的技術窩!