raft理论与实践[2]-lab2a实验说明

准备工做网络


一、阅读raft论文框架

二、阅读我写的raft理论与实践[1]-理论篇ide

三、因为咱们须要模拟rpc远程调用, 所以须要查看我写的这篇文章: 模拟RPC远程过程调用测试

四、实验开始,咱们首先须要拉取代码:debug


image.png


实验说明调试


此代码中labrpc 与 labgob 为模拟rpc的 package。blog

raft文件夹为此实验用到的代码框架。 在其中已经写好了一部分代码,还须要咱们经过实验来完善它。rpc

在本实验中,咱们只须要关注raft.go文件,并实现选举逻辑和心跳检测逻辑。it

本实验的目标是要保证,惟一的leader可以被选举。class

当leader被选举后,若是没有任何失败,其将会保持leader。

当leader被选举后,若是leader奔溃或者to/from leader 的网络包丢失,则新的leader将会产生。

要验证代码的正确性,运行go test -run 2A


实验提示


一、raft.go 的raft结构体 补充字段。 字段应该尽可能与raft论文的Figure2接近。

二、填充RequestVoteArgs和RequestVoteReply结构。 修改Make()以建立一个后台goroutine,该后台goroutine将在有一段时间没有收到其余节点的请求时经过发出RequestVote RPC来按期启动领导者选举。 这样,节点将了解谁是leader(若是已经有leader),或者成为leader自己。 实现RequestVote()RPC处理程序,以便节点之间相互投票。

三、要实现心跳检测,请定义AppendEntries RPC结构(尽管您可能还不须要全部参数),并让leader按期调用其余节点此方法。 编写AppendEntries RPC方法,该方法将重置选举超时,以便在已经有leader时,阻止其余节点成为leader。

四、确保不一样对等方的选举超时不会老是同时触发,不然全部节点都只会为本身投票,而没有人会成为领导者。

五、测试要求leader每秒发送心跳RPC的次数不得超过十次。

六、测试要求在leader失败后,也可以再5秒以内选出新的leader。 您必须选择足够短的选举超时时间(以及所以产生的心跳间隔),

以使选举颇有可能在不到五秒钟的时间内完成,即便须要进行多轮选举也是如此。

七、raft论文的5.2提到选举超时的范围是150到300毫秒,可是仅当领导者发送心跳的频率大大超过每150毫秒一次的频率时,此范围才有意义。

因为测试要求您的心跳检测为每秒10个,所以您将必须使用大于150到300毫秒的选举超时时间,但不能太大,由于那样的话,您可能会在五秒钟内没法选举领导者。

八、使用go的rand方法产生随机数。

九、go的time.Timer 和 time.Ticker 很难使用正确。

十、要调试代码,能够将util.go 的debug设置为1.

十一、您应该使用go test -race检查代码,并修复它报告的全部问题。


参考


讲义

讲义新

相关文章
相关标签/搜索