首页 > 其他分享 >MIT 6.5840 Raft Implementation(2A, Leader Election)

MIT 6.5840 Raft Implementation(2A, Leader Election)

时间:2023-07-21 11:58:01浏览次数:34  
标签:false 函数 Implementation 6.5840 跟随者 2A Raft ticker MIT

Raft实现思路+细节

2A

任务分解

总体来说,2A中主要的任务就是选出领导人,在选出领导人的时候,我们要遵循下图。

在2A中,由于并没有出现日志复制,所以我们只需要考察两者的任期是否相等,以及接收者在本轮任期中有没有投票即可。

因而我们可以这样地给出2A中的实现内容:

  • 完善GetState()函数,这样才能让评测机知道我们选出了Leader

  • 完善Raft结构体(见论文上的State)

  • 完善RequestVote()函数,按照上图中的逻辑

  • 完善Make()函数,对成员进行初始化

  • 完善ticker()MakeElection()函数,在没有收到领导人信息的时候开始选举

  • 初步写出heartbeat相关功能(只需要在接收时变成跟随者即可)

实现细节

  1. 关于Raft结构体,基本上需要参考论文上的State即可。

    我在这里多加了一个safe状态(表示作为跟随者在这个周期内有没有收到领导人的信息,在收到RPC时置为true,在ticker()初始化和变成跟随者时变成false,若ticker()检查时为false,则直接开始选举),这样就模拟了发动选举的过程。(credit to @Vargvain )

  2. 关于RequestVote()函数,在2A阶段我们先判断任期的大小关系,如果候选人更大,那就让接收者先同步任期,并变成追随者;如果接收者更大,就直接返回false。如果相等,那么就看是否已经投过票,如果投过,返回false,反之返回true

    在这里,我建议封装好toCandidate(), toFollower(), toLeader()这几个函数,这样可以减少代码复用,而且用到的也确实挺多的

  3. 关于Make()函数,我们暂时只要给不同变量赋上初始值。

  4. 关于ticker()函数。首先要做的是调整ElectionTimeout,论文中有提到heartbeatInterval << ElectionTimeout,并且通过分析可以发现ElectionTimeout中随机值上界不超过下界的两倍,我选择ElectionTimeout = 400 + (rand.Int63() % 400)。接下来就是看是否是一个not safe的跟随者,如果是这样,那就开始选举(一个Go程)。

    选举函数基本是2A中最大的难点。首先,我们需要给RequestVoteArgs赋好初始值,然后就对于每一个peer(当然,peerId != rf.me),处理RequestVoteReply,如果回复的任期更高,那就变成Follower,反之,统计票数,如果超过半数,就变成领导人。

  5. 关于heartbeat,只需要依照RequestVoteRPC的格式完成基本的AppendEntriesRPC,并在变成领导人时给每个人发就行。

注意事项

关于锁的一些小建议(credit to @lauyeeyu)

  • 尽量缩短 Lock() 和 Unlock() 之间的长度(更细的控制)
  • 在Sleep或者耗时间的操作中不要持有锁,会占用进程,或导致死锁
  • 小心控制流语句 (continue, break, return) 可能会跳过你写的 Unlock()
  • 读写变量前别忘了上锁
  • 必要时(为了缩短上锁区域的长度)可以变量先读到临时变量,然后就可以解锁了,之后读取可以使用临时变量(但是要小心数据修改可能的隐患)

关于并发

  • 有必要再去了解一下并发进行的形式和原理
  • 对于这种情况,如果里面不用_peerId会出问题,因为在新开的Go程进行到某一阶段时可能peerId已经发生了变化。

关于测试

总时长情况大概如下图:

关于每一个测试后面的四个数字意义,见MIT课程页面

标签:false,函数,Implementation,6.5840,跟随者,2A,Raft,ticker,MIT
From: https://www.cnblogs.com/lixingyang/p/17570908.html

相关文章

  • appsmith使用第三方库进行http请求
    安装使用exportdefault{ debugMeter:async()=>{ letrID=Number(Select1.selectedOptionValue); letmetricName=Input6.text; letmeterAsset=Input7.text; letbusAddr=Input8.text; letmeterAddr=Number(Input9.text); letregisterAddr=......
  • MIT 6.S081 Thread switching
    Multiplexingxv6通过将cpu从一个进程切换到另一个进程来实现multiplex(多路复用),进程的切换会在两种情形下发生:xv6的sleep与wakeup机制在进程等待IO完成或者等待子进程退出又或者在sleep系统调用中等待的时候切换进程。xv6会周期性地强制切换进程,从而应对那些长时......
  • 【linux】gcc编译选项:-fomit-frame-pointer,-fno-tree-vectorize,-fno-strict-aliasing
    Date:2018.9.81、参考https://www.cnblogs.com/islandscape/p/3444122.htmlhttps://blog.csdn.net/chdhust/article/details/8462414https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc.pdfhttps://blog.csdn.net/u012927281/article/details/50999138https://blog.csdn.net/sof......
  • 新晋 Committer!来自复旦大学的帅哥一枚
    点亮Star⭐️·支持我们https://github.com/apache/dolphinscheduler最近,社区星力量又迎来一位新晋Committer,这次是来自复旦大学研究生在读的王维饶同学,一起来认识一下吧!个人简介姓名:王维饶职位:复旦大学研究生在读GitHubID:Radeity感兴趣领域:平时在实验室会做一些偏......
  • 新晋 Committer!来自复旦大学的帅哥一枚
    点亮Star⭐️·支持我们https://github.com/apache/dolphinscheduler最近,社区星力量又迎来一位新晋Committer,这次是来自复旦大学研究生在读的王维饶同学,一起来认识一下吧!个人简介姓名:王维饶职位:复旦大学研究生在读GitHubID:Radeity感兴趣领域:平时在实验室会做一些偏......
  • MySQL在分页查询时的limit深分页问题
    在平时业务中我们会发现当分页数据特别大的时候,会出现SQL很慢的情况,下面我们来分析下为什么会出现这种情况以及如何去解决一、limit深分页问题解析我们有如下一张表CREATETABLEaccount(idint(11)NOTNULLAUTO_INCREMENTCOMMENT'主键Id',namevarchar(255)DEFAU......
  • git commit 时报错:husky - pre-commit hook exited with code 1 (error)
    在使用git进行commit时出现错误:husky-pre-commithookexitedwithcode1(error)。方式一chatgpt的回答是:报错信息“husky-pre-commithookexitedwithcode1(error)”表示在执行Git提交操作时,pre-commit钩子脚本返回了非零的退出码,表示出现了错误。这种......
  • MIT 6.S081 Multiprocessors and locking
    whylock防止多核并行运行下的racecondition导致的错误。内核中的数据是典型的concurrently-accessed的数据。raceconditionandhowthelockavoiditAraceconditionisasituationinwhichamemorylocationisaccessedconcurrently,andatleastoneaccess......
  • git tag commit ID 标签
    gittag是给commitID标签,这样能让人知道代码在哪个节点,发布了版本,或截至到哪个ID,来做个记录1.查看本地所有tag:gittag或者gittag-l2.查看远程所有tag:gitls-remote--tagsorigin3.指定标签信息tag:gittag-av1.14.创建附注标签示例:gittag-av0.1......
  • MIT6.s081/6.828 lectrue1:Introduction and examples
    目前课程官网能够查到2020,2021.2022秋季的课程表,但是视频都是2020年录制的那一版简单复习+回顾下自己的OS学习之旅参考资料:官网:https://pdos.csail.mit.edu/6.828/2022/schedule.html视频翻译:https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/教材英文......