mit 6.824 lab2A ,raft 领导人选举实现(lab2D中有关于此处大量代码修改,找出了很多错误)

lab2 说明:

https://pdos.csail.mit.edu/6.824/labs/lab-raft.html

参考博客:

https://zhuanlan.zhihu.com/p/514512060

实现内容:

实现 Raft 领导选举和心跳(AppendEntries RPCs 没有日志条目)。第 2A 部分的目标是选举单个领导者,如果没有失败,领导者仍然是领导者,如果旧领导者失败或发往/来自旧领导者的数据包被新领导者接管,则丢失的。

根据raft论文图二实现raft结构

按照mit 提供的框架,首先要完成Make函数

Make函数用于初始化服务器。

在论文中

2.Follwer 一段时间没接收到消息即选举超时,发起新选举。

从这里我们知道,初始化服务器时候status 要设置为Follower,需要开启一个监听函数用于超时选举,在mit框架中是tick函数

第七行 设置每个服务器初始化为Follwer,

setElectionTime() 设置了超时时间,go rf.ticker() 监听超时时间。

监听超时时间,每隔50毫秒就检查一遍当前时间是否超过设定好的超时时间

超时了,开始选举。

先重置自身超时时间 rf.setElectionTime() ,因为选举可能失败再来一次

开始选举。Follower 自增 term(任期号)并转为 Candidate,并行向其他节点发送 RV RPC 等待给自己投票。

请求投票requestVotes()
这个函数接受者实现有个细节,接受者是 Followers,并且投票成功要重置自身超时时间保持Followers                接受者是Leader 只要符合日志至少一样新和未投票,就会变为Followers。               不管接受者是何种身份,只要term > currentTerm,就重置自身为Followers并投票。以下为接受者投票处理函数
blimit 是5.4选举限制。14行只要自身未投票或者已经投票给当前请求(重发) 并且符合选举限制就投票。请求选票函数要注意加锁的位置,在mit6.824课程中特意强调不用加锁给RPC请求,而是获得RPC返回结果后再加锁

第18行,因为是并发发送RPC请求,所以可能已经成为leader 但是后几条RPC请求刚刚返回,所以没必要多次执行下面成为leader的代码了。

因为是2A ,所以还没完全实现心跳响应,发送的是空包,并且只是简单的重置了自身超时时间,这部分代码后面我还要进行大改动。

Original: https://www.cnblogs.com/thotf/p/16596312.html
Author: thotf
Title: mit 6.824 lab2A ,raft 领导人选举实现(lab2D中有关于此处大量代码修改,找出了很多错误)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582250/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球