第一篇:https://blog.csdn.net/westbrookliu/article/details/107451683
project2 RaftKV——Leader election
这次实现的是Raft算法,该算法分为三部分实现:
- Leader election
- Log replication
- Raw node interface
预备知识
- 什么是Raft算法?
可以看看下面这篇文章了解一下
https://blog.csdn.net/westbrookliu/article/details/99713334
还可以在Raft官网玩玩:https://raft.github.io/
第一步:看代码
基本上只要看raft
目录下的几个文件:
raft.go
:主要要补充的文件,实现了Raft算法log.go
:Raft日志的实现raft_paper_test.go
:测试用例proto/pkg/eraftpb/eraft.pb.go
:一些协议值
第二步:跑代码
make project2aa
不用看,肯定过不了=_=
第三步:写代码
当然,首先要理解Raft算法才能动手写。然后理解一下raft.go
的几个函数:
tick()
:
看名字就和时间有关,调用一次这个函数说明过了一个时间单位,这个函数主要就是判断一些超时时间
func (r *Raft) tick() {
// Your Code Here (2A).
switch r.State {
case StateFollower, StateCandidate:
r.electionElapsed++
if r.electionElapsed >= r.randomElectionTimeout {
r.electionElapsed = 0
_ = r.Step(pb.Message{
MsgType: pb.MessageType_MsgHup,
From: r.id,
Term: r.Term,
})
}
case StateLeader:
r.heartbeatElapsed++
if r.heartbeatElapsed >= r.heartbeatTimeout {
r.heartbeatElapsed = 0
_ = r.Step(pb.Message{
MsgType: pb.MessageType_MsgBeat,
To: r.id,
Term: r.Term,
})
}
}
}
becomeXXX
当角色转换时需要做的一些状态值的变更
func (r *Raft) resetTime() {
r.electionElapsed = 0
r.heartbeatElapsed = 0
r.randomElectionTimeout = r.electionTimeout + rand.Intn