準備工作
1、閱讀raft論文
2、閱讀我寫的raft理論與實踐[1]-理論篇
3、由於我們需要模擬rpc遠程調用, 因此需要查看我寫的這篇文章: 模擬RPC遠程過程調用
4、實驗開始,我們首先需要拉取代碼:
實驗說明
此代碼中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檢查代碼,並修復它報告的所有問題。
參考
講義
講義新