MIT6.824-Raft筆記:腦裂、Majority Vote(過半投票/過半選舉)

本部分主要是問題引入,以及給出一個解決方案

1 腦裂(Split Brain)

replication system的共同點:單點

前面幾個容錯特性(fault-tolerant)的系統,有一個共同的特點。

  • MapReduce復制了計算,但是復制這個動作,或者說整個MapReduce被一個單主節點控制。
  • GFS以主備(primary-backup)的方式復制數據,會實際的復制文件內容,但它也依賴一個單主節點,來確定每一份數據的主拷貝的位置。
  • VMware FT在一個Primary虛機和一個Backup虛機之間復制計算相關的指令。當其中一個虛機出現故障時,為了能夠正確的恢復,需要一個Test-and-Set服務來確認,Primary虛機和Backup虛機只有一個能接管計算任務。

它們都是一個多副本系統(replication system),背后存在一個共性:它們需要一個單節點來決定,在多個副本中,誰是主(Primary)使用一個單節點的好處是,它不可能否認自己,因為只有一個節點,它的決策就是整體的決策;缺點是,它本身又是一個單點故障(Single Point of Failure),將系統容錯的關鍵點,轉移到了這個單點上。在系統出現局部故障時,通過primary copy繼續工作。使用單點是為了避免腦裂(Split-Brain)。當出現故障時,要極其小心的決定數據的主拷貝,否則需要面臨腦裂的場景。

這里主要說明多副本系統,雖然是多副本,但是最終還是搞了一個單點來做決定,而這樣做的目的是為了避免腦裂;同樣單點故障又可以通過新的primary繼續工作。
下面通過示例可以得知,如果是多副本系統,要么同時等待所有副本響應,這樣還不如單點,因為多個是一個出現問題的多倍;要么不等待多個,那這樣就會出現腦裂,根源也很簡單,在分布式系統中,根本無法確定你連接不上的這個服務到底是宕機了,還是僅僅你連接不上而其它服務可以。

腦裂帶來的問題及其嚴重性

這里通過將單點Test-and-Set服務設計為多副本,說明為什么出現故障時,很難避免腦裂。
VMware FT中的Test-and-Set之前是一個單點服務,而VMware FT依賴這個Test-and-Set服務來確定Primary虛機,為了提高系統的容錯性構建一個多副本的Test-and-Set服務。網絡里面有兩個服務器(S1,S2)都是Test-and-Set服務的拷貝,還有兩個客戶端(C1,C2),它們需要通過Test-and-Set服務確定主節點是誰。在這個例子中,這兩個客戶端本身就是VMware FT中的Primary和Backup虛擬機。
這兩個Test-and-Set服務器中的數據記錄將從0開始,任意一個客戶端發送Test-and-Set指令,這個指令會將服務器中的狀態設置成1,兩個服務器都應該設置成1,然后將舊的值0,返回給客戶端。本質上來說,這是一種簡化了的鎖服務。
**當一個客戶端可以與其中一個服務器通信,但是不能與另一個通信時,有可能出現腦裂的問題。**假設客戶端需要將請求同時發送給兩個服務器。這時就需要考慮腦裂問題,即會出現各種情況的網絡分區,以及服務器不響應需要如何處理。

  • 如果我們只將C1的請求設置給S1,而不設置給S2,會導致S2的數據不一致。或許應該規定,對于任何操作,客戶端必須總是與兩個服務器交互,而不是只與其中一個服務器交互。**但是這是一個錯誤的想法,因為這里根本就沒有容錯,甚至比只使用一個服務器更糟。**因為當兩個服務器中的一個故障了或者失聯了,我們的系統就不能工作了。對于一個單點的服務,我們只依賴一個服務器。現在我們有兩個服務器,并且兩個服務器都必須一致在線,這里的難度比單個服務器更大。
  • 如果客戶端不能同時與兩個服務器交互,那它就與它能連通的那個服務器交互,同時認為另一個服務器已經關機了。這也是一個錯誤的答案呢?我們的故障場景是,另一個服務器的狀態無從知曉,實際可能是網絡線路出現了故障,從而導致C1可以與S1交互,但是不能與S2交互。同時C2可以與S2交互,但是不能與S1交互。如果一個客戶端連接了兩個服務器,為了達到一定的容錯性,客戶端只與其中一個服務器交互也應該可以正常工作。但是這樣就不可避免的出現了這種情況:假設這根線纜中斷了,將網絡分為兩個部分。C1發送Test-and-Set請求給S1,S1將自己的狀態設置為1,并返回之前的狀態0給C1。C1對應的虛擬機會認為自己可以成為主節點。但是同時S2里面的狀態仍然是0。如果現在C2也發送了一個Test-and-Set請求,本來應該發送給兩個服務器,但是現在從C2看來,S1不能訪問,根據之前定義的規則,那就發送給S2吧。同樣的C2也會認為自己持有了鎖。如果這個Test-and-Set服務被VMware FT使用,那么這兩個VMware 虛機都會認為自己成為了主虛擬機而不需要與另一個虛擬機協商,這是一個錯誤的場景。

這里主要是針對上面的共同點,通過舉反例說明單點的必要性。
實際上Lecture4中最后也提到 test and set 應該也是具有容錯性的服務,而不是某個單點。

**在有兩個拷貝副本的配置中,看起來我們只有兩種選擇:要么等待兩個服務器響應,那么這個時候就沒有容錯能力;要么只等待一個服務器響應,那么就會進入錯誤的場景(通常稱為腦裂)。**這基本是上世紀80年代之前要面臨的挑戰。多副本系統時,需要排除腦裂的可能,這里有兩種技術:

  • 構建一個不可能出現故障的網絡。比如電腦中,連接了CPU和內存的線路就是不可能出現故障的網絡。如果網絡不會出現故障,這樣就排除了腦裂的可能。當網絡不出現故障時,那就意味著,如果客戶端不能與一個服務器交互,那么這個服務器肯定是關機了。這里假設有足夠多的資金,就能接近這個假設。

主要還是,只要有網絡的情況下,節點A和節點B連接異常,但是B本身是什么樣的,節點B和其他節點是什么樣的是未知的。

  • 人工解決問題,不要引入任何自動完成的操作。默認情況下,客戶端總是要等待兩個服務器響應,如果只有一個服務器響應,永遠不要執行任何操作。之后通過運維人員檢查,進行關機等處理,這里本質上把人作為了一個決策器,這個人也是個單點。

很長一段時間內,人們都使用以上兩種方式中的一種來構建多副本系統。這雖然不太完美,因為人工響應不能很及時,不出現故障的網絡又很貴,但是這些方法至少是可行的。

2 Majority Vote (quorum)

盡管存在腦裂的可能,人們發現哪怕網絡可能出現故障,可能出現分區,實際上是可以正確的實現能夠自動完成故障切換的系統。這種能自動恢復,同時又避免腦裂的多副本系統,關鍵點在于多數投票(Majority Vote)。這也是用來構建Raft的一個基本概念。
網絡分區(Partition):當網絡出現故障將網絡分割成兩半,網絡的兩邊獨自運行且不能訪問對方。
多數投票系統的第一步在于,服務器的數量要是奇數,而不是偶數。如果只有兩個服務器,被網絡故障分隔的兩邊,它們看起來完全是一樣的,它們運行了同樣的軟件,它們也會做相同的事情,這樣不太好(會導致腦裂)。但如果服務器的數量是奇數的,那么當出現一個網絡分割時,兩個網絡分區將不再對稱,這是多數投票吸引人的地方。首先你要有奇數個服務器。然后為了完成任何操作,例如Raft的Leader選舉,例如提交一個Log條目,在任何時候為了完成任何操作,你必須湊夠過半的服務器來批準相應的操作

如果是偶數會如何呢,這里舉兩個例子:

  1. 2副本,那么如果分區,就要等待過半投票,即2/2 + 1 = 2,也就是每一個都要等待2個的響應,那這個和6.1中第二小節示例中的方案一:必須與所有副本通信,又有何區別,反而提高了故障概率。
  2. 4副本,過半投票 4/2+1=3,這里好一些了,能夠容忍1個的故障,但是這和3副本相比,并不能提高容錯概率,還不如之間5副本或者3副本,浪費反而不會提高容錯。

綜上:偶數情況下,如果被網絡故障均分,那么整個系統依然是不可用的。

這里背后的邏輯是,如果網絡存在分區,最多只有一個分區能夠擁有過半的服務器。這里有一點需要明確,當我們在說過半的時候,我們是在說所有服務器數量的一半,而不是當前開機服務器數量的一半。這個點困擾了我(Robert教授)很長時間,如果你有一個系統有3個服務器,其中某些已經故障了,如果你要湊齊過半的服務器,你總是需要從3個服務器中湊出2個,即便你知道1個服務器已經因為故障關機了。過半總是相對于服務器的總數來說

服務器的總數:一是因為實際上很難完全知道具體出現故障的機器到底是怎么了,另一方面是因為為了后面的過半更新+過半選舉,這樣選出來的leader一定包含有最新數據。

個人思考:

  1. 這里的開機,在有網絡的情況下,A連接不上B,無法判斷B是否開機,B和C是否連接?
  2. 需要及時處理故障機
  3. 需要提供快速的數據恢復

對于多數投票,可以用一個更通用的方程式來描述:如果系統有 2 * F + 1 個服務器,那么系統最多可以接受F個服務器出現故障,仍然可以正常工作。這也被稱為多數投票(quorum)系統,因為3個服務器中的2個,就可以完成多數投票。
有關多數投票系統的一個特性就是,最多只有一個網絡分區會有過半的服務器,我們不可能有兩個分區可以同時完成操作。這里背后更微妙的點在于,如果你總是需要過半的服務器才能完成任何操作,同時你有一系列的操作需要完成,其中的每一個操作都需要過半的服務器來批準,例如選舉Raft的Leader,那么每一個操作對應的過半服務器,必然至少包含一個服務器存在于上一個操作的過半服務器中任意兩組過半服務器,至少有一個服務器是重疊的。實際上相比其他特性,Raft更依賴這個特性來避免腦裂。
例如,當一個Raft Leader競選成功,那么這個Leader必然湊夠了過半服務器的選票,而這組過半服務器中,必然與舊Leader的過半服務器有重疊。新的Leader必然知道舊Leader使用的任期號(Term ID),因為新Leader的過半服務器必然與舊Leader的過半服務器有重疊,而舊Leader的過半服務器中的每一個必然都知道舊Leader的任期號。類似的,任何舊Leader提交的操作,必然存在于過半的Raft服務器中,而任何新Leader的過半服務器中,必然有至少一個服務器包含了舊Leader的所有操作。這是Raft能正確運行的一個重要因素。
在多數投票這種思想的支持下,大概1990年的時候,有兩個系統基本同時被提出。這兩個系統指出,你可以使用這種多數投票系統,從某種程度上來解決之前明顯不可能避免的腦裂問題,例如,通過使用3個服務器而不是2個,同時使用多數投票策略。兩個系統中的一個叫做Paxos(1989),Raft論文對這個系統做了很多的討論;另一個叫做ViewStamped Replication(VSR, 1988)。盡管Paxos的知名度高得多,Raft從設計上來說,與VSR更接近。VSR是由MIT發明的。
學生提問:可以為Raft添加服務器嗎?
Rober教授:Raft的服務器是可以添加或者修改的,Raft的作者提出了方法來處理這種場景,但是比較復雜。

參考文獻:
https://pdos.csail.mit.edu/6.824/schedule.html
https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165095.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript框架 Angular、React、Vue.js 的全棧解決方案比較

在 Web 開發領域,JavaScript 提供大量技術棧可供選擇。其中最典型的三套組合,分別是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)進行簡化比較。 MERN 技術棧詳解 MERN 技術棧包含四大具體組件: MongoDB&am…

藍橋杯物聯網競賽_STM32L071_3_Oled顯示

地位: 對于任何一門編程語言的學習,print函數毫無疑問是一種最好的調試手段,調試者不僅能通過它獲取程序變量的運行狀態而且通過對其合理使用獲取程序的運行流程,更能通過關鍵變量的輸出幫你驗證推理的正確與否,樸素的…

常見網絡安全防護

1 阻斷服務攻擊(DOS) 阻斷服務攻擊,想辦法目標網絡資源用盡變種:分布式阻斷服務攻擊 影響: 寬帶消耗性(消耗目標的帶寬)資源消耗型(消耗目標的計算資源) 解決方案&am…

人工智能對網絡安全的影響越來越大

如果問當前IT行業最熱門的話題是什么,很少有人會回答除了人工智能(AI)之外的任何話題。 在不到 12 個月的時間里,人工智能已經從一項只有 IT 專業人員才能理解的技術發展成為從小學生到作家、程序員和藝術家的每個人都使用的工具…

MySQL索引事務基礎

目錄 1. 索引 1.1索引的概念 1.2索引的特點 1.3 索引的使用場景 1.4索引的使用 1.4.1查看索引 1.4.2創建索引 1.4.3刪除索引 1.5索引保存的數據結構 2.事務 2.1經典例子 2.2事務的概念 2.3事務的使用 2.4事務的4個核心特性 2.5事務的并發問題 2.5.1臟讀 2.5.2不可…

Python + Docker 還是 Rust + WebAssembly?

在不斷發展的技術世界中,由大語言模型驅動的應用程序,通常被稱為“LLM 應用”,已成為各種行業技術創新背后的驅動力。隨著這些應用程序的普及,用戶需求的大量涌入對底層基礎設施的性能、安全性和可靠性提出了新的挑戰。 Python 和…

Java項目如何打包成Jar(最簡單)

最簡單的辦法,使用Maven插件(idea自帶) 1.選擇需要打包的mudule,點擊idea右側的maven插件 2.clean操作 3.選擇需要的其他mudule,進行install操作(如果有) 4.再次選擇需要打包的module&#…

Vue.observable 是什么

Observable 翻譯過來我們可以理解成可觀察的 Vue.js2.6 新增 Vue.observable,讓一個對象變成響應式數據。Vue 內部會用它來處理 data 函數返回的對象 。 返回的對象可以直接用于渲染函數和計算屬性內,并且會在發生變更時觸發相應的更新。也可以作為最小化…

Git的指令

Git 各平臺安裝包下載地址為:http://git-scm.com/downloads Ubuntu Git 安裝命令為: $ apt-get install git用戶信息 配置個人的用戶名稱和電子郵件地址: $ git config --global user.name "runoob" $ git config --global user.…

Python----類對象和實例對象

目錄 一.類和類的實例 二.類屬性和實例屬性 三.私有屬性和公有屬性 四.靜態方法和類方法 五.__init__方法,__new__方法和__del__方法: 六.私有方法和公有方法 七.方法的重載 八.方法的繼承 九.方法的重寫 十.對象的特殊方法 十一.對象的引用&a…

軟件開發模式開源和閉源的優劣之爭

開源和閉源,兩種截然不同的開發模式,對于大模型的發展有著重要影響。開源讓技術共享,吸引了眾多人才加入,推動了大模的創新。而閉源則保護了商業利益和技術優勢,為大模型的商業應用提供了更好的保障。 開源與閉源軟件的…

基于命令行模式設計退款請求處理

前言 這篇文章的業務背景是基于我的另一篇文章: 對接蘋果支付退款退單接口-CSDN博客 然后就是說設計模式是很開放的東西,可能我覺得合適,你可能覺得不合適,這里只是做下討論,沒有一定要各位同意的意思.... 相關圖文件 這里我先把相關的圖文件放上來,可能看著會比較清晰點 代碼邏…

sql之left join、right join、inner join的區別

sql之left join、right join、inner join的區別 left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄 inner join(等值連接) 只返回兩個表中聯結字段相等的行 舉例如下&#xff1…

Web服務器(go net/http) 處理Get、Post請求

大家好 我是寸鐵👊 總結了一篇Go Web服務器(go net/http) 處理Get、Post請求的文章? 喜歡的小伙伴可以點點關注 💝 前言 go http請求如何編寫簡單的函數去拿到前端的請求(Get和Post) 服務器(后端)接收到請求后,又是怎么處理請求&#xff0c…

【限時免費】20天拿下華為OD筆試之【前綴和】2023B-尋找連續區間【歐弟算法】全網注釋最詳細分類最全的華為OD真題題解

文章目錄 題目描述與示例題目描述輸入描述輸出描述示例一輸入輸出說明 示例二輸入輸出 解題思路代碼PythonJavaC時空復雜度 華為OD算法/大廠面試高頻題算法練習沖刺訓練 題目描述與示例 題目描述 給定一個含有N個正整數的數組,求出有多少個連續區間(包…

【網絡奇緣】- 計算機網絡|分層結構|ISO模型

🌈個人主頁: Aileen_0v0🔥系列專欄: 一見傾心,再見傾城 --- 計算機網絡~💫個人格言:"沒有羅馬,那就自己創造羅馬~" 目錄 計算機網絡分層結構 OSI參考模型 OSI模型起源 失敗原因: OSI模型組成 協議的作用 📝全文…

二十四、RestClient操作文檔

目錄 一、新增文檔 1、編寫測試代碼 二、查詢文檔 1、編寫測試代碼 三、刪除文檔 1、編寫測試代碼 四、修改文檔 1、編寫測試代碼 五、批量導入文檔 批量查詢 一、新增文檔 1、編寫測試代碼 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…

【棧】不同字符的最小子序列

題目: /*** 思路:棧,使用數組記錄每個字母出現的次數,再用一個數組標記字符是否在棧中* 遍歷棧,存儲字符時比較棧頂字符,若小于棧頂字符并且后面有重復的字符則* 棧頂元素出棧,否則入棧。** au…

PS 注釋工具 基礎使用方法講解

好 上文PS 顏色取樣器&標尺工具 基本使用講解中 我們講了 顏色取樣器和標尺工具的基本用法 下面我們來看一下 注釋工具 這個 主要是后面 比較大的作品 可能不是我們一個人取設計 團隊作圖 就需要用到它 選擇 注釋工具 后 我們隨便點擊圖像任何一個位置 右側就會出現一個輸…

gitlab各版本安裝注意點:

研發團隊在安裝gitlab各版本過程中可能遇到各種問題,為了后續容易查看特將我們在實踐過程中遇到的各類問題要點總結如下: gitlab 10.8.3 (564c342)安裝 centos Linux yum安裝網址查找網址:gitlab/gitlab-ce - Results for gitla…