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)

大家都在看

  • VS2015中GLAUX库的链接问题

    最近学习OpenGL,照着例子写了个程序,用到了GLAUX库。 #include #pragma comment(lib, "glaux") 在程序中加了这两句…

    Linux 2023年6月14日
    089
  • requests模块

    掌握 headers参数的使用 掌握 发送带参数的请求 掌握 headers中携带cookie 掌握 cookies参数的使用 掌握 cookieJar的转换方法 掌握 超时参数t…

    Linux 2023年6月8日
    0126
  • 投票活动进行中!探讨问题:从互联网大量收集学习资料再包装成产品售卖盈利是否属于侵权违法?

    写在开篇 今天不聊某项技能的知识点,我们聊点别的。那么,到底聊啥好呢?笔者想想… 有了,这两天笔者从一个微信公众号中发现一个非常恶劣的营销行为。事情大概背景是这样的:运…

    Linux 2023年6月7日
    084
  • redis持久化存储

    redis持久化存储 redis多被用于缓存和消息中间件,当被用作缓存时,数据的读写都是在内存中进行的,而内存一旦在主机断电或者主机重启时里面的数据将被清空,为保证数据不被丢失,r…

    Linux 2023年6月7日
    0114
  • 如何正确地使用Entity Framework Database First

    毕设依旧在不紧不慢地以每天解决一个问题的进度进行中。今天遇到的问题就是在建立数据模型时遇到的。因为项目是基于数据库构建的,所以理所应当地采用DB First来构造实体类和DbCon…

    Linux 2023年6月14日
    0118
  • Java — 注解

    Java 注解(Annotation)又称为 Java 标注,是 Java5 开始支持加入源代码的特殊语法元数据。 Java 语言中的类、方法、变量、参数和包等都可以被标注。 Ja…

    Linux 2023年6月8日
    098
  • Question09-查询学过编号为”01″并且也学过编号为”02″的课程的同学的信息

    * — 学过01,且学过02 — 学过01 SELECT sc.SID FROM SC sc WHERE sc.CID = ’01’; — 学过02 SELECT sc.SI…

    Linux 2023年6月7日
    095
  • mycat2 读写分离配置(详解)

    mycat2相对mycat1来说升级还挺多的,但是全网资料太少了,这里尽可能详细的将读写分离说清楚,目前这套配置已经在我司生产环境应用,日UV6W左右,暂时没发现问题。 1.1下载…

    Linux 2023年6月6日
    0110
  • PHP设计模式—享元模式

    定义: 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。 结构: Flyweight:享元抽象类,所有具体享元类的接口,通过这个接口,Flyweight 可…

    Linux 2023年6月7日
    086
  • rpm简单使用

    rpm描述:利用源码包编译成rpm时,会去指定安装好这个包的位置本质:解压,然后拷贝到相关的目录,然后执行脚本 查询所有已经安装过的包 查看安装位置 解压rpm 查看脚本 查看配置…

    Linux 2023年6月7日
    077
  • [Linux]LVS(Linux Virtual Server)

    LVS(Linux Virtual Server) LVS(Linux Virtual Server) 什么是LVS? 为什么要用LVS? LVS的组成及作用 LVS相关术语 LV…

    Linux 2023年6月13日
    093
  • 解决vscode+python不提示numpy函数的问题

    使用vscode编写numpy代码时,对于numpy.array()等方法总是无法提示。查找了很多博客后,大部分都是修改配置和安装多种vscode插件,经过尝试后方法对于我来说无效…

    Linux 2023年6月7日
    0104
  • Dockerfile

    基本结构 Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。 Dockerfile 由一行行命令语句组成,并且支持以 # 开头…

    Linux 2023年6月13日
    0103
  • 关于面试的那些事

    这周做了三次的笔试,周日的XXX,周三的XXX,周五的XXX。 首先周日的XXX,考了四道算法题,两个小时,说实话题目都没怎么读懂,算法基本没接触过,结果一道也没有做出来,只想说,…

    Linux 2023年6月7日
    0123
  • Redis 事务与锁

    基本操作 事务的基本操作 开启事务,设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中 multi 取消事务,终止当前事务的定义,发生在 multi 之后,exec 之…

    Linux 2023年5月28日
    086
  • Harbor部署

    harbor 无论是使用Docker-distribution去自建仓库,还是通过官方镜像跑容器的方式去自建仓库,通过前面的演示我们可以发现其是非常的简陋的,还不如直接使用官方的D…

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