第一步,理解RSM,可復制的狀態(tài)機。
https://www.infoq.cn/article/raft-paper
閱讀這篇文章的前2節(jié),一直到復制狀態(tài)機那章。
第二步,直觀的感受下RAFT再做什么
http://thesecretlivesofdata.com/raft/
第三步,閱讀LAB2的文檔
https://pdos.csail.mit.edu/6.824/labs/lab-raft.html
看到2A即可
第四步,回過頭來,重讀論文,一直讀到5.2
這一步很關(guān)鍵,找個安靜的地方,帶著思考閱讀。有時讀到后面需要參閱圖2的表哥。自己在紙上筆筆畫畫。
隨后再看一遍動畫,理解下領(lǐng)導選舉是怎么做的
第五步,閱讀框架代碼(怎么獲得在上一篇里)
type Raft struct
這邊我們要把每一個RAFT SERVER的狀態(tài)該寫好
func (rf *Raft) GetState() (int, bool) {
這里我們要返回server 的當前的TERM 和 是不是LEADER的信息
persist,readPersist 先不用管
RequestVoteArgs
RequestVoteReply
這是申請投票的RPC的REQUEST 和 RESPOND,可以根據(jù)論文的圖2定義
func (rf *Raft) RequestVote(args *RequestVoteArgs, reply *RequestVoteReply) {
這是一個RPC 收到RequestVote的HANDLER
func (rf *Raft) sendRequestVote(server int, args *RequestVoteArgs, reply *RequestVoteReply) bool {
這個是告訴我們怎么發(fā)送一個RPC CALL。
start,kill 這2個方法先不用管
func Make(peers []*labrpc.ClientEnd, me int,
這個方法是用來初始化SERVER的值,以及啟動一個協(xié)程來監(jiān)聽CHANNEL的。
第六步,了解GO語言語法
如果你已經(jīng)知道GO怎么寫了,就進入到下一章實現(xiàn)領(lǐng)導選舉吧。
要用到的GO知識點
- = vs :=
- defer 的作用
- if,for,switch,enum 怎么寫
- 如何初始化一個數(shù)組
- goroutine 的作用和用法
- 指針 和 地址 (* &)
- 如何NEW 對象
- go interface
- select ,chanel