透過 golang 實作一個基本的 raft,分散式系統有大量鎖及併發的操作,也看了網路上一些心得文章,已經有心理準備會有滿滿的坑了,但分散式系統就是這樣才好玩對吧 XD。在開始實作前建議先看過 [3],[4] & [5],然後 ==Figure 2. 很重要、很重要、很重要==,誠如 TA Guide 所說,請對 Figure 2. 保持敬畏之心,確保 "完整" 的理解圖中所有內容,魔鬼藏在細節裡
Lab2A Leader Election
第一項任務是實作 Leader 選舉的機制,結構體參數的部分我直接參考論文設定,實作上有幾點比較重要的是:
要在正確的時刻重設 election timer轉變為 Follower 跟 Candidate 兩個狀態時,這點比較直觀
Follower 收到 "合法" AppendEntries RPC 時,合法代表請求的 Term >= CurrentTerm,否則代表該請求是由一個過期的 Leader 發送,那重設 timer 反而會觸發不必要的重新選舉
Follower 收到 "合法" RequestVote RPC 時,合法意味著請求的 Term >= CurrentTerm
Follower 在該 Term 還沒投過票 (rf.votedFor == -1)
請求的 log 跟自身比較是 up-to-date 的,代表 Candidate 的 log 至少不落於人後,up-to-date 的定義請參閱論文 5-4 Safety 章節中有關 Election Restriction 的部分