我們在設計Raft算法時有幾個目標:必須為系統構建提供完整實用的算法基礎,從而顯著減少開發者所需的設計工作;它必須在所有條件下都是安全的,並且在典型操作條件下可用;對於常規操作,它必須是高效的。但是我們最重要的目標和最困難的挑戰是Raft算法的可理解性。該算法必須易於被大量讀者理解。此外,開發者必須能夠直觀地指導算法的工程化開發,讓系統構建者在面臨問題時能夠意識到不可避免的算法擴展。
在筏形基礎的設計中,我們不得不面對各種可行方法的選擇。在這些情況下,我們基於可理解性評估備選方案:評估解釋每個備選方案的難度(例如,其狀態空間有多復雜,是否有復雜的隱藏內容/信息?)並嘗試評估讀者完全理解Raft算法及其隱含信息的難易程度。
我們意識到這種分析非常主觀。盡管如此,我們仍然使用兩種可行的技術來評估它。首先是問題解構(把壹個大問題分解成幾個小問題)。例如,我們將Raft算法分為三個部分:領導者選舉、日誌復制和安全性。第二種方法是通過減少要考慮的狀態來減少狀態機的狀態空間,使壹致性算法盡可能有序,消除不確定性。具體來說,Raft算法不允許日誌有空洞(空洞是指壹個條目中沒有對應的內容,但是後面的條目有內容,這是Paxos算法的壹個缺點),Raft算法限制了日誌不壹致的可能性(通過對領導者選舉的限制和只有領導者是主要數據源的限制,保證了跟隨者之間不會相互傳輸日誌內容,只要和領導者壹致,減少了各個服務器上日誌的不壹致)。雖然我們盡量避免算法中的不確定性,但有時也通過這種不確定性來增強算法的可理解性(這是以可理解性為首要目標的表現)。比如隨機法引入了不確定性,但是可以縮減狀態空間(通過隨機法,我們可以避免處理系統中可能出現的各種問題,比如當領袖當選時,不同的候選人通過加時發起下壹輪選舉,從而避免。
Raft算法是壹種以2.1節中描述的形式管理日誌副本的算法。圖3.1總結了算法供參考,圖3.2列出了算法的關鍵屬性。本章的其余部分將在幾節中討論。
Raft首先選擇壹個服務器作為領導者,然後讓領導者完全負責管理系統中的日誌副本。Leader接受來自客戶機的日誌條目,將它們復制到其他服務器上,並告訴服務器何時將日誌條目應用到其狀態機是安全的。通過Leader management簡化日誌副本的管理。例如,領導者可以在不咨詢其他服務器的情況下決定在日誌中放置新條目,數據以簡單的方式從領導者流向其他服務器(追隨者或候選人)。領導者可能會失敗或與其他服務器斷開連接,在這種情況下,將選擇新的領導者。
Raft算法通過基於領導者的方法,將壹致性問題分解為三個相對獨立的子問題:
在介紹了Raft共識算法之後,本章討論了可用性問題、定時在系統中的作用(3.9節),以及服務器之間的Leader轉換的可選擴展(3.10節)。
圖3-1顯示了Raft算法中的關鍵元素、操作和原理。因為整個畫面太大,我們就把這個大圖分成四個小圖來說明。
圖3-1狀態(狀態)
1 .所有服務器上的持久狀態(所有服務器上的持久狀態)
(在回復RPC請求之前更新本地永久存儲)
& ltcenter style = " box-sizing:border-box;邊距-頂部:0px邊距-底部:0px顏色:rgb(192,192,192);文本裝飾:下劃線;"& gt圖3.2-2請求投票RPC < /center >
(候選人將此請求稱為收集選票)
3.AppendEntries RPC是壹個RPC請求,用於領導者與跟隨者同步日誌條目。通過這個RPC請求,領導者請求追隨者追加日誌條目,實現日誌的同步。
(由領導調用,用於日誌條目的備份,該請求還將肩負心跳檢查的功能)
為了說明prevLogIndex和prevLogTerm之間的比較方案,請參見下圖。
圖中領導者和跟隨者的任期是3,領導者中的logentries比跟隨者中的要新,所以領導者需要發送壹個AppendEntries請求,讓跟隨者同步這些logentries。即RPC請求中的previewindex和previewterm分別為i-1和3。當跟隨者收到這個RPC請求時,其當前日誌條目的索引是I-1,任期是3,與RPC消息中的previewindex和previewterm相匹配,因此跟隨者可以使用entries[]中的日誌條目來填充其I到N..如果跟隨者最新日誌條目的索引(這裏暫稱為FollowerIndex)不等於i-1,有兩種情況。第壹種是跟隨者index < PrevLogIndex,表示跟隨者的日誌仍然缺失,那麽跟隨者將回復false,領導者將再次更新PrevLogIndex、prevLogTerm和entries[]並發起AppendEntries請求(將在下壹章詳細描述);第二章,遵循索引& gtprevLogIndex,這意味著Follower在PrevLogIndex和prevLogTerm之後同步了日誌條目。但是,後壹個日誌條目的內容與RPC請求中的內容相同嗎?以及prevLogIndex和prevLogTerm的日誌條目中的內容是否與Leader相同?“這裏的問題看完後面的內容會更新的。”
& lt& lt前壹章:Raft算法的目的
下壹章:Raft算法基礎。