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)

大家都在看

  • 机器学习:正态方程 python实现

    前言 一、算法介绍 二、核心算法 1. 公式 2.python实现 总结 前言 使用python简单实现机器学习中正态方程算法。 一、算法介绍 与梯度下降算法相比,正态方程同样用于…

    Linux 2023年6月7日
    058
  • Docker安装及配置镜像加速

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月10日
    0180
  • 抓到 Netty 一个 Bug,顺带来透彻地聊一下 Netty 是如何高效接收网络连接的

    本系列Netty源码解析文章基于 4.1.56.Final版本,大家如果看到图片显示不了的话,可以查看公众号原文 对于一个高性能网络通讯框架来说,最最重要也是最核心的工作就是如何高…

    Linux 2023年6月6日
    080
  • js中对象深度拷贝的方法(浅拷贝)

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年11月8日
    0185
  • ASP.NET Core设置URLs的几种方法

    前言 在使用ASP.NET Core 3.1开发时,需要配置服务器监听的端口和协议,官方帮助文档进行简单说明,文档中提到了4种指定URL的方法 设置 ASPNETCORE_URLS…

    Linux 2023年6月8日
    055
  • linux shell 软件 terminator 的一些设置

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月11日
    0169
  • mac安装homebrew

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年11月8日
    0191
  • Linux之Nginx模块扩展

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    056
  • CSS解决父级边框坍塌的问题

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年11月7日
    0204
  • Visual studio prebuild/postbuild 设置条件不生效

    这两天有一个需求就是,在编译完成后,对生成的dll进行混淆加密处理,并且自动上传到nuget。混淆加密和自动上传已经写成了cmd命令,但是又不想在Debug模式下调用这个命令,毕竟…

    Linux 2023年6月13日
    063
  • Linux: split 文件分割和合并

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月24日
    0262
  • 编写一个简单的linux kernel rootkit

    一、前言 linux kernel rootkit跟普通的应用层rootkit个人感觉不大,个人感觉区别在于一个运行在用户空间中,一个运行在内核空间中;另一个则是编写时调用的API…

    Linux 2023年6月8日
    076
  • Git 修改文件后,文件夹目录层级未显示红色

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月30日
    0229
  • Linux

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月20日
    0505
  • 2021年1月-第02阶段-前端基础-HTML+CSS进阶-VS Code 软件

    软件安装 VSCode软件 能够安装 VS Code 能够熟练使用 VS Code 软件 能够安装 VS Code 最常用的插件 1. VS Code简介 1.1 VS Code …

    Linux 2023年6月8日
    061
  • shell xargs技巧

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

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