raft理論與實踐[2]-lab2a實驗說明

準備工作


1、閱讀raft論文

2、閱讀我寫的raft理論與實踐[1]-理論篇

3、由於我們需要模擬rpc遠程調用, 因此需要查看我寫的這篇文章: 模擬RPC遠程過程調用

4、實驗開始,我們首先需要拉取代碼:


image.png


實驗說明


此代碼中labrpc 與 labgob 爲模擬rpc的 package。

raft文件夾爲此實驗用到的代碼框架。 在其中已經寫好了一部分代碼,還需要我們通過實驗來完善它。

在本實驗中,我們只需要關注raft.go文件,並實現選舉邏輯和心跳檢測邏輯。

本實驗的目標是要保證,唯一的leader能夠被選舉。

當leader被選舉後,如果沒有任何失敗,其將會保持leader。

當leader被選舉後,如果leader奔潰或者to/from leader 的網絡包丟失,則新的leader將會產生。

要驗證代碼的正確性,運行go test -run 2A


實驗提示


1、raft.go 的raft結構體 補充字段。 字段應該儘量與raft論文的Figure2接近。

2、填充RequestVoteArgs和RequestVoteReply結構。 修改Make()以創建一個後臺goroutine,該後臺goroutine將在有一段時間沒有收到其他節點的請求時通過發出RequestVote RPC來定期啓動領導者選舉。 這樣,節點將瞭解誰是leader(如果已經有leader),或者成爲leader本身。 實現RequestVote()RPC處理程序,以便節點之間相互投票。

3、要實現心跳檢測,請定義AppendEntries RPC結構(儘管您可能還不需要所有參數),並讓leader定期調用其他節點此方法。 編寫AppendEntries RPC方法,該方法將重置選舉超時,以便在已經有leader時,阻止其他節點成爲leader。

4、確保不同對等方的選舉超時不會總是同時觸發,否則所有節點都只會爲自己投票,而沒有人會成爲領導者。

5、測試要求leader每秒發送心跳RPC的次數不得超過十次。

6、測試要求在leader失敗後,也能夠再5秒之內選出新的leader。 您必須選擇足夠短的選舉超時時間(以及因此產生的心跳間隔),

以使選舉很有可能在不到五秒鐘的時間內完成,即使需要進行多輪選舉也是如此。

7、raft論文的5.2提到選舉超時的範圍是150到300毫秒,但是僅當領導者發送心跳的頻率大大超過每150毫秒一次的頻率時,此範圍纔有意義。

由於測試要求您的心跳檢測爲每秒10個,因此您將必須使用大於150到300毫秒的選舉超時時間,但不能太大,因爲那樣的話,您可能會在五秒鐘內無法選舉領導者。

8、使用go的rand方法產生隨機數。

9、go的time.Timer 和 time.Ticker 很難使用正確。

10、要調試代碼,可以將util.go 的debug設置爲1.

11、您應該使用go test -race檢查代碼,並修復它報告的所有問題。


參考


講義

講義新



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章