TIDB 拜占庭將軍問題和Raft演算法

2021-09-28 21:21:01 字數 2986 閱讀 6234

拜占庭將軍問題是乙個協議問題,拜占庭帝**隊的將軍們必須全體一致的決定(資料的一致性)是否攻擊某一支敵軍。問題是這些將軍在地理上是分隔開來的(分布式),並且將軍中存在叛徒。叛徒可以任意行動以達到以下目標:欺騙某些將軍採取進攻行動;促成乙個不是所有將軍都同意的決定,如當將軍們不希望進攻時促成進攻行動;或者迷惑某些將軍,使他們無法做出決定。如果叛徒達到了這些目的之一,則任何攻擊行動的結果都是注定要失敗的,只有完全達成一致的努力才能獲得勝利。

拜占庭假設是對現實世界的模型化,由於硬體錯誤、網路擁塞或斷開以及遭到惡意攻擊,計算機和網路可能出現不可預料的行為。拜占庭容錯協議必須處理這些失效,並且這些協議還要滿足所要解決的問題要求的規範。這些演算法通常以其彈性t作為特徵,t表示演算法可以應付的錯誤程序數。

很多經典演算法問題只有在n ≥ 3t+1時才有解,如拜占庭將軍問題,其中n是系統中程序的總數

raft 演算法是一種簡單易懂的共識演算法。它依靠狀態機主從同步的方式,在各個節點之間實現資料的一致性

在學習raft演算法的時候,我們需要了解raft的兩個核心要點:

選取主節點

主從同步資料

不難理解,使用主從同步的方式,可以讓集群各個節點的資料更新以主節點為準,從而保證了一致性。那麼,如何選取主節點呢?

人類的出生,離不開無數小蝌蚪之間的激烈競爭。在競爭的過程中,某個速度最快運氣最好的小蝌蚪最終勝出,讓我們誕生到了這個世界。

同樣道理,raft演算法在選擇主節點的過程中,也是通過多個節點之間的投票競爭

說到這裡,不得不說一下raft演算法的狀態機。raft演算法為節點定義了三種角色:

leader(主節點)

follower(從節點)

candidate(參與投票競爭的節點)

讓我們來看一看選主的具體流程:

第一步,在最初,還沒有乙個主節點的時候,所有節點的身份都是follower。每乙個節點都有自己的計時器,當計時達到了超時時間(election timeout),該節點會轉變為candidate。

第二步,成為candidate的節點,會首先給自己投票,然後向集群中其他所有的節點發起請求,要求大家都給自己投票

第三步,其他收到投票請求且還未投票的follower節點會向發起者投票,發起者收到反饋通知後,票數增加。

第四步,當得票數超過了集群節點數量的一半,該節點晉公升為leader節點。leader節點會立刻向其他節點發出通知,告訴大家自己才是老大。收到通知的節點全部變為follower,並且各自的計時器清零。

這裡需要說明一點,每個節點的超時時間都是不一樣的。比如a節點的超時時間是3秒,b節點的超時時間是5秒,c節點的超時時間是4秒。這樣一來,a節點將會最先發起投票請求,而不是所有節點同時發起。

為什麼這樣設計呢?設想如果所有節點同時發起投票,必然會導致大家的票數差不多,形成僵局,誰也當不成老大。

那麼,成為leader的節點是否就坐穩了老大的位置呢?並不是。leader節點需要每隔一段時間向集群其他節點傳送心跳通知,表明你們的老大還活著。

一旦leader節點掛掉,發不出通知,那麼計時達到了超時時間的follower節點會轉變為candidate節點,發起選主投票,周而復始……

raft 演算法同步資料的方式, 和 xa 二段提交有一些相似

第一步,由客戶端提交資料到leader節點。

第二步,由leader節點把資料複製到集群內所有的follower節點。如果一次複製失敗,會不斷進行重試

第三步,follower節點們接收到複製的資料,會反饋給leader節點。

第四步,如果leader節點接收到超過半數的follower反饋,表明複製成功。於是提交自己的資料,並通知客戶端資料提交成功。

第五步,由leader節點通知集群內所有的follower節點提交資料,從而完成資料同步流程。

在用於共享配置和服務發現的 k-v 儲存系統 [etcd] 中, 使用的就是 raft 演算法來保證分布式一致性

早期的共識演算法,由拜占庭將軍問題的提出者 leslie lamport 所發明。谷歌的分布式鎖服務 chubby 就是以 paxos 演算法為基礎。

zookeeper 所使用的一致性演算法,在流程上和 raft 演算法比較接近。

區塊鏈技術所使用的共識演算法之一,適用於私有鏈的共識。

參考:

拜占庭將軍問題

前進中的可信計算 拜占庭將軍問題 閔應驊 乙個可信的計算機系統必須容忍乙個或多個部件的失效。失效的部件可能送出相互矛盾的資訊給系統的其他部件。這正是目前網路安全要對付的情況,如銀行交易安全 存款安全。美國2001 9 11遭恐怖襲擊之後,大家普遍認識到銀行的異地備份非常重要。紐約的一家銀行可以在東京...

拜占庭將軍問題

假設有4個將軍圍攻乙個敵人,只有三個將軍同時出擊才可以將敵人擊敗,任意兩個或者乙個將軍出擊均會被敵人擊敗,4個將軍通過一對一的通訊機制協商共同出擊時機,同時4個將軍中有乙個是內奸,他會混淆通訊結果,避免3個將軍協商出統一的出擊時機。拜占庭將軍 pbft 問題既指在這種情況下將軍們如果達成共識,共同擊...

拜占庭將軍問題

拜占庭將軍問題 byzantine failures 是由萊斯利 蘭伯特提出的點對點通訊中的基本問題。含義是在存在訊息丟失的不可靠通道上試圖通過訊息傳遞的方式達到一致性是不可能的。因此對一致性的研究一般假設通道是可靠的,或不存在本問題。在很久很久以前,拜占庭是東羅馬帝國的首都。那個時候羅馬帝國國土遼...