分布式理論

2021-09-17 07:34:05 字數 3270 閱讀 3680

拜占庭將軍問題(byzantine failures),是由萊斯利·蘭伯特提出的點對點通訊中的基本問題。含義是在存在訊息丟失的不可靠通道上試圖通過訊息傳遞的方式達到一致性是不可能的。因此對一致性的研究一般假設通道是可靠的,或不存在本問題。

萊斯利·蘭波特在其**中描述了如下問題:

一組拜占庭將軍分別各率領一支軍隊共同圍困一座城市。為了簡化問題,將各支軍隊的行動策略限定為進攻或撤離兩種。因為部分軍隊進攻部分軍隊撤離可能會造成災難性後果,因此各位將軍必須通過投票來達成一致策略,即所有軍隊一起進攻或所有軍隊一起撤離。因為各位將軍分處城市不同方向,他們只能通過信使互相聯絡。在投票過程中每位將軍都將自己投票給進攻還是撤退的資訊通過信使分別通知其他所有將軍,這樣一來每位將軍根據自己的投票和其他所有將軍送來的資訊就可以知道共同的投票結果而決定行動策略。

系統的問題在於,將軍中可能出現叛徒,他們不僅可能向較為糟糕的策略投票,還可能選擇性地傳送投票資訊。假設有9位將軍投票,其中1名叛徒。8名忠誠的將軍**現了4人投進攻,4人投撤離的情況。這時候叛徒可能故意給4名投進攻的將領送信表示投票進攻,而給4名投撤離的將領送信表示投撤離。這樣一來在4名投進攻的將領看來,投票結果是5人投進攻,從而發起進攻;而在4名投撤離的將軍看來則是5人投撤離。這樣各支軍隊的一致協同就遭到了破壞。

由於將軍之間需要通過信使通訊,叛變將軍可能通過偽造信件來以其他將軍的身份傳送假投票。而即使在保證所有將軍忠誠的情況下,也不能排除信使被敵人截殺,甚至被敵人間諜替換等情況。因此很難通過保證人員可靠性及通訊可靠性來解決問題。

假始那些忠誠(或是沒有出錯)的將軍仍然能通過多數決定來決定他們的戰略,便稱達到了拜占庭容錯。在此,票都會有乙個預設值,若訊息(票)沒有被收到,則使用此預設值來投票。

上述的故事對映到計算器系統裡,將軍便成了計算器,而信差就是通訊系統。雖然上述的問題涉及了電子化的決策支援與資訊保安,卻沒辦法單純的用密碼學與數字簽名來解決。因為電路錯誤仍可能影響整個加密過程,這不是密碼學與數字簽名演算法在解決的問題。因此計算器就有可能將錯誤的結果提交去,亦可能導致錯誤的決策

將拜占庭將軍問題根據常見的工作上的問題進行簡化:假設將軍中沒有叛軍,信使的資訊可靠但有可能被暗殺的情況下,將軍們如何達成一致性決定?

對於這個簡化後的問題,有許多解決方案,第乙個被證明的共識演算法是 paxos,由拜占庭將軍問題的作者在2023年提出,最初以**難懂而出名,後來這哥們在2001重新發了一篇簡單版的** paxos made ******,然而還是挺難懂的。

因為 paxos 難懂,難實現,所以史丹福大學的教授在2023年發表了新的分布式協議 raft。與 paxos 相比,raft 有著基本相同執行效率,但是更容易理解,也更容易被用在系統開發上。

每個節點有三種狀態:follower,candidate,leader,狀態之間是互相轉換的

每個節點上都有乙個倒計時器 (election timeout),時間隨機在 150ms 到 300ms 之間。有幾種情況會重設 timeout:

收到選舉的請求

收到 leader 的 heartbeat (後面會講到)

在 raft 執行過程中,最主要進行兩個活動:

選主 leader election

複製日誌 log replication

這是最簡單的選主情況,只要有超過一半的節點投支援票了,candidate 才會被選舉為 leader,5個節點的情況下,3個節點 (包括 candidate 本身) 投了支援就行。

一開始已經有乙個 leader,所有節點正常執行。

leader 出故障掛掉了,其他四個 follower 將進行重新選主。

4個節點的選主過程和5個節點的類似,在選出乙個新的 leader 後,原來的 leader 恢復了又重新加入了,這個時候怎麼處理?在 raft 裡,第幾輪選舉是有記錄的,重新加入的 leader 是第一輪選舉 (term 1) 選出來的,而現在的 leader 則是 term 2,所有原來的 leader 會自覺降級為 follower

假設一開始有4個節點,都還是 follower

有兩個 follower 同時 timeout,都變成了 candidate 開始選舉,分別給乙個 follower 傳送了投票請求。

兩個 follower 分別返回了ok,這時兩個 candidate 都只有2票,要3票才能被選成 leader。

但是因為 follower 在這一輪選舉中,都已經投完票了,所以都拒絕了他們的請求。所以在 term 2 沒有 leader 被選出來。

這時,兩個節點的狀態是 candidate,兩個是 follower,但是他們的倒計時器仍然在執行,最先 timeout 的那個節點會進行發起新一輪 term 3 的投票。

兩個 follower 在 term 3 還沒投過票,所以返回 ok,這時 candidate 一共有三票,被選為

如果 leader heartbeat 的時間晚於另外乙個 candidate timeout 的時間,另外乙個 candidate 仍然會傳送選舉請求。

兩個 follower 已經投完票了,拒絕了這個 candidate 的投票請求。

leader 進行 heartbeat, candidate 收到後狀態自動轉為 follower,完成選主。

以上是 raft 最重要活動之一選主的介紹,以及在不同情況下如何進行選主。

分布式理論 分布式事務

資料庫事務 事務的基本特性 事務有4個非常重要的特性,即我們常說的 acid atomicity 原子性 是說事務是乙個不可分割的整體,所有操作要麼全做,要麼全不做 只要事務中有乙個操作出錯,回滾到事務開始前的狀態的話,那麼之前已經執行的所有操作都是無效的,都應該回滾到開始前的狀態。consiste...

分布式理論 BASE理論

根據cap定理,我們在分布式系統最多只能在 一致性 可用性 分割槽容錯性 中三選二。那能不能解決3選2的問題呢?想要解決3選2的問題,首先需要思考分割槽是百分之百出現的嗎?如果不出現分割槽,那麼就能夠同時滿足cap。如果出現了分割槽,可以根據策略進行調整。比如c不必使用那麼強的一致性,可以先將資料存...

分布式CAP理論

根據維基百科定義 cap 根據定理,乙個分布式系統最多只能滿足其中兩項,不可能同時滿則c a p三項 首先說一下對各項原則的理解 1 一致性c 單機環境下,資料只有乙份,所有的客戶端訪問的是同乙份資料,不會出現兩個客戶端看到不一樣的資料 分布式環境下,同乙份資料會儲存在多台伺服器上,大量客戶端來訪問...