漫画:什么是拜占庭将军问题
轉載自?漫畫:什么是拜占庭將軍問題
什么是拜占庭將軍問題?
在很久很久以前,拜占庭是東羅馬帝國的首都。那個時候羅馬帝國國土遼闊,為了防御目的,因此每個軍隊都分隔很遠,將軍與將軍之間只能靠信使傳遞消息。
?
?
?
在打仗的時候,拜占庭軍隊內所有將軍必需達成一致的共識,才能更好地贏得勝利。但是,在軍隊內有可能存有叛徒,擾亂將軍們的決定。
?
?
這時候,在已知有成員不可靠的情況下,其余忠誠的將軍需要在不受叛徒或間諜的影響下達成一致的協議。
?
萊斯利·蘭伯特(?Leslie Lamport?)通過這個比喻,表達了計算機網絡中所存在的一致性問題。這個問題被稱為拜占庭將軍問題。
?
?
?
?
?
?
?
?
什么是 Raft 算法?
?
Raft 算法是一種簡單易懂的共識算法。它依靠?狀態機?和?主從同步?的方式,在各個節點之間實現數據的一致性。
?
在學習Raft算法的時候,大家需要了解Raft的兩個核心要點:
?
1.選取主節點
?
2.同步數據
?
?
不難理解,使用主從同步的方式,可以讓集群各個節點的數據更新以主節點為準,從而保證了一致性。那么,如何選取主節點呢?
?
?
?
?
?
?
?
?
我們的出生,離不開無數小蝌蚪之間的激烈競爭。在競爭的過程中,某個速度最快運氣最好的小蝌蚪最終勝出,讓我們誕生到了這個世界。
?
同樣道理,Raft算法在選擇主節點的過程中,也是通過多個節點之間的投票競爭。
?
說到這里,不得不說一下Raft算法的狀態機。Raft算法為節點定義了三種角色:
?
1.Leader(主節點)
2.Follower(從節點)
3.Candidate(參與投票競爭的節點)
?
讓我們來看一看選主的具體流程:
?
第一步,在最初,還沒有一個主節點的時候,所有節點的身份都是Follower。每一個節點都有自己的計時器,當計時達到了超時時間(Election Timeout),該節點會轉變為Candidate。
?
?
?
?
?
第二步,成為Candidate的節點,會首先給自己投票,然后向集群中其他所有的節點發起請求,要求大家都給自己投票。
?
?
?
?
?
第三步,其他收到投票請求且還未投票的Follower節點會向發起者投票,發起者收到反饋通知后,票數增加。
?
?
?
?
第四步,當得票數超過了集群節點數量的一半,該節點晉升為Leader節點。Leader節點會立刻向其他節點發出通知,告訴大家自己才是老大。收到通知的節點全部變為Follower,并且各自的計時器清零。
?
?
?
?
這里需要說明一點,每個節點的超時時間都是不一樣的。比如A節點的超時時間是3秒,B節點的超時時間是5秒,C節點的超時時間是4秒。這樣一來,A節點將會最先發起投票請求,而不是所有節點同時發起。
?
為什么這樣設計呢?設想如果所有節點同時發起投票,必然會導致大家的票數差不多,形成僵局,誰也當不成老大。
?
那么,成為Leader的節點是否就坐穩了老大的位置呢?并不是。Leader節點需要每隔一段時間向集群其他節點發送心跳通知,表明你們的老大還活著。
?
?
?
?
一旦Leader節點掛掉,發不出通知,那么計時達到了超時時間的Follower節點會轉變為Candidate節點,發起選主投票,周而復始......
?
?
?
?
?
?
?
?
?
讓我們來看一看數據同步的流程:
?
第一步,由客戶端提交數據到Leader節點。
?
?
?
?
?
第二步,由Leader節點把數據復制到集群內所有的Follower節點。如果一次復制失敗,會不斷進行重試。
?
?
?
?
?
第三步,Follower節點們接收到復制的數據,會反饋給Leader節點。
?
?
?
?
第四步,如果Leader節點接收到超過半數的Follower反饋,表明復制成功。于是提交自己的數據,并通知客戶端數據提交成功。
?
?
?
?
第五步,由Leader節點通知集群內所有的Follower節點提交數據,從而完成數據同步流程。
?
?
?
?
?
共識算法的應用場景?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
Paxos 算法:
早期的共識算法,由拜占庭將軍問題的提出者?Leslie Lamport?所發明。谷歌的分布式鎖服務?Chubby 就是以 Paxos 算法為基礎。
?
?
ZAB 算法:
Zookeeper 所使用的一致性算法,在流程上和 Raft 算法比較接近。
?
?
PBFT 算法:
區塊鏈技術所使用的共識算法之一,適用于私有鏈的共識。
?
?
?
?
總結
以上是生活随笔為你收集整理的漫画:什么是拜占庭将军问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何取消您在MochaHost的帐户并获
- 下一篇: 如何连接域并在MochaHost上安装W