第一步,理解RSM,可复制的状态机。
https://www.infoq.cn/article/raft-paper
阅读这篇文章的前2节,一直到复制状态机那章。
第二步,直观的感受下RAFT再做什么
http://thesecretlivesofdata.com/raft/
第三步,阅读LAB2的文档
https://pdos.csail.mit.edu/6.824/labs/lab-raft.html
看到2A即可
第四步,回过头来,重读论文,一直读到5.2
这一步很关键,找个安静的地方,带着思考阅读。有时读到后面需要参阅图2的表哥。自己在纸上笔笔画画。
随后再看一遍动画,理解下领导选举是怎么做的
第五步,阅读框架代码(怎么获得在上一篇里)
type Raft struct
这边我们要把每一个RAFT SERVER的状态该写好
func (rf *Raft) GetState() (int, bool) {
这里我们要返回server 的当前的TERM 和 是不是LEADER的信息
persist,readPersist 先不用管
RequestVoteArgs
RequestVoteReply
这是申请投票的RPC的REQUEST 和 RESPOND,可以根据论文的图2定义
func (rf *Raft) RequestVote(args *RequestVoteArgs, reply *RequestVoteReply) {
这是一个RPC 收到RequestVote的HANDLER
func (rf *Raft) sendRequestVote(server int, args *RequestVoteArgs, reply *RequestVoteReply) bool {
这个是告诉我们怎么发送一个RPC CALL。
start,kill 这2个方法先不用管
func Make(peers []*labrpc.ClientEnd, me int,
这个方法是用来初始化SERVER的值,以及启动一个协程来监听CHANNEL的。
第六步,了解GO语言语法
如果你已经知道GO怎么写了,就进入到下一章实现领导选举吧。
要用到的GO知识点
- = vs :=
- defer 的作用
- if,for,switch,enum 怎么写
- 如何初始化一个数组
- goroutine 的作用和用法
- 指针 和 地址 (* &)
- 如何NEW 对象
- go interface
- select ,chanel