实验项目 https://github.com/HaoyangShi/RaftLab
本实验基于etcd代码改动而成。主要任务为实现etcd中Raft算法。
此次实验分为两部分,包括领导者选举及日志复制。请根据注释提示,完成代码填充,所有需要填充的代码均在**./raft/raft.go**文件中。
在完成实验后,可运行 ./raft/raftLab_test.sh以检验是否实现正确
请确保已经安装 go>=1.19, make
go安装:从 https://go.dev/doc/install 下载安装包并根据提示安装
(苹果电脑m1芯片及以上推荐使用linux虚拟机或服务器)
领导者选举部分注释标志为RaftLab Election。请根据注释的步骤,根据选举的逻辑将代码补充完整。
follower节点tick函数推进当前时间计数,如果发现一段时间内都未收到领导者消息,触发选举条件。其转变状态为candidate,并向集群中广播请求投票消息MsgVote。节点收到请求投票消息MsgVote,根据term和日志判断是否可以投票,回复投票消息MsgVoteResp。当candidate可以收到多数节点的投票消息,则成功当选,转变状态为leader并广播通知权威。
任务步骤:
需要填空的部分在./raft/raft.go中,以注释RaftLab Election标志
Step1:节点tick函数推进时间计数
更新electionTimeout,向前推进
Step2:触发选举条件,节点开始一轮新的选举
初始化electionElapsed,并触发处理MsgHup
Step3:follower节点开始选举,变更状态为candidate,并进行相关参数的初始化
设置state、term、vote、tick函数和step函数