实验说明:6.824 Lab 2: Raft

可视化:Raft

实现目标

根据论文Figure 2和5.2实现Raft系统的选主和心跳

整体流程

新节点启动时,大致的流程如下:

  1. 初始化自己的属性信息,主要有votedFor=-1,currentTerm=0;设置选举超时(论文的election timeout)的时间范围为1000ms-2000ms,心跳间隔为150ms;设置自己的状态为Follower,开启electionTimeout计时器。
  2. 如果接收到来自其他节点的投票请求,(me表示自己,request表示请求者)
    1. 如果me.currentTerm >request.Term,或者me.currentTerm ==request.Term而且自己已经把票投给出去了(不是投给request),此时就直接拒绝这个请求,并把自己的currentTerm放回给request
    2. 经过第一点的过滤后,如果判断出日志不是up-to-date的,也同样拒绝这个请求; 如果日志是up-to-date的,而且me.currentTerm <request.Term,就更新自己的currentTerm,同时设置votedFor=request.ID,并把自己的状态转为Follower,重置自己的electionTimeout计时器;
  3. 如果接收到来自其他节点的心跳请求(me表示自己,request表示请求者)
    1. 判断me.currentTerm > request.Term,就否定这个心跳请求,并返回自己的currentTerm给请求者
    2. 如果me.currentTerm > request.Term,就更新自己的me.currentTerm=request.Term, me.votedFor=-1;转为自己为Follower,重置自己的electionTimeout计时器;
  4. 如果自己的electionTimeout计时器触发了
    1. me.currentTerm 自增1
    2. 投票给自己(me.votedFor=me.ID)
    3. 重置自己的electionTimeout计时器
    4. 发送投票请求给其他节点
      1. 如果收到半数节点的投票,就转为Leader,并开启自己的心跳计时器,周期性给其他节点发送心跳请求
      2. 如果收到一个节点的否定响应,同时对端节点的currentTerm比自己的大,就设置自己的currentTerm等于对端节点的currentTerm,votedFor=-1,并转化为Follower
      3. 如果一直没有得到半数节点的投票,也没有收到currentTerm比自己大的否定影响,就等待electionTimeout计时器再次触发
  5. 作为leader给其他发送心跳请求后,如果收到拒绝的响应,同时对端节点的currentTerm比自己的大,就设置自己的currentTerm等于对端节点的currentTerm,votedFor=-1,并转化为Follower

在这个过程主要关注两个过程,代码的实现也是从这里作为入口来实现的,一个是自身程序触发的,一个是接收到来自其他节点的请求触发的;

  • 自身程序触发的也就是raft.go里面的ticker函数,主要等待两个信号,一个electionTimeout计时器的触发,这里触发后就开始自我的选举;一个是心跳计时器的触发,这个触发只有身份是leader的才有动作
  • 接收其他节点的请求,主要有投票请求(RequestVote)和心跳请求(AppendEntries),具体的处理逻辑看上面描述的流程就可以了

测试

root@dev-0003:~/workspace/gocode/gomodule/mit-6.824-2021/src/raft# go test -run 2A -race
Test (2A): initial election ...... Passed --   4.6  3   38    9716    0
Test (2A): election after network failure ...... Passed --   6.0  3   76   15566    0
Test (2A): multiple elections ...... Passed --   8.1  7  378   79306    0
PASS
ok      6.824/raft  18.757s

6.824 Spring 2021 -- Lab 2A相关推荐

  1. 6.824 raft lab 2A 2B实验分析

    一.背景 为突破单机的容量和性能瓶颈,现在都采用分布式存储系统,而分布式存储系统就是采用分片扩大容量.多副本提供容错和性能的能力,可以简单.自动地横向扩展. 1 一致性算法介绍 raft就是非常著名的 ...

  2. Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)

    传送门 文章目录 题意: 思路: 题意: 给你nnn个朋友,一共有mmm种货币,一个朋友最多喜欢ppp种,用二进制给出111代表喜欢,让你选出最多的一个货币集合使得至少有⌈n2⌉\left \lcei ...

  3. Deltix Round, Spring 2021 E. Crypto Lights 组合数学 + 推公式

    传送门 文章目录 题意: 思路: 题意: 给你nnn个灯,每次可以打开一个灯,当连续的kkk个灯有至少两个灯开着的时候停止,问最终期望能打开多少灯. 思路: 由于不想打latexlatexlatex, ...

  4. Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2)

    Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2) 题号 题目 知识点 A Game of Life B Lor ...

  5. CS61C Spring 2021——Project 2: CS61Classify要求及实现思路

    由于课程政策,CS61C的所有代码均不会在网上公开,以下仅记录完成project时的具体思路.   CS61Classify的最终目标是在Venus RISC-V模拟器上运行一个简单的ANN网络.此项 ...

  6. mit6.824 2022 lab2

    MIT6.824 2022 Raft Raft leader election log persistence log compaction 整体测试 后面发现的问题 参考代码 汇总博客:MIT6.8 ...

  7. MIT 6.824 Lab2A (raft) -- Leader Election

    文章目录 实验要求 Leader Election流程 及详细实现介绍 基本角色 关键超时变量 关键的两个RPC实现 RequestVote RPC AppendEntries RPC Go并发编程实 ...

  8. 线上计算机科学课程,关于加州大学伯克利分校2021年春季线上课程(计算机科学方向)申请通知...

    UC Berkeley(加州大学伯克利分校)开设2021年春季学期线上BGA(Berkeley Global Access)Remote课程-计算机科学方向(Computer Science Trac ...

  9. ML顶会论文都可复现吗?来挑战一下,还能拿500美元补贴

    月石一 发自 凹非寺 量子位 报道 | 公众号 QbitAI Paper with Code发起了第5届机器学习再现性挑战(MLRC). 这一次不仅支持的会议有所增加,挑战者还能获得500美元的资金支 ...

最新文章

  1. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
  2. 移动应用开发者应该关注的 Google I/O 两项更新
  3. 通用寄存器的专门用途
  4. 【网络安全】JAVA代码审计—— XXE外部实体注入
  5. visual studio快捷键 Qt creator快捷键
  6. w10计算机运行特别卡,电脑卡是什么问题?导致Win10正式版卡顿的原因及解决方法...
  7. 1-1、作用域深入和面向对象
  8. 认证令牌_Java应用程序的令牌认证
  9. linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)
  10. logger 参数列表过长_[源码级解析] 巧妙解决并深度分析Linux下rm命令提示参数列表过长的问题...
  11. CTF-Crypto密码学
  12. Oracle常用数据字典表
  13. PS2手柄移植-hal库
  14. 计算机基础与office应用教程,计算机基础与Office 2010实用教程
  15. 拿webshell的一些姿势
  16. 【数据结构(C语言版)严蔚敏 第一章 绪论】
  17. 美国博士后J1签证北京面签经过
  18. 计算机相关商标,计算机的商标是属于哪一类?
  19. 【FPGA学习笔记】Verilog语言的模块化设计
  20. 计算机应用基础统试题及答案,计算机应用基础统试题及答案

热门文章

  1. AI ProCon圆满落幕,五大技术专场精彩瞬间不容错过
  2. lintcode 简单篇(二)
  3. 手机上怎么压缩html文件夹,iphone手机怎么压缩文件 iphone自带文件压缩功能操作方法分享...
  4. 纳米数据专业体育数据供应商,足球篮球实时数据,实时更新比赛比分数据,体育数据接口api
  5. 网络故障和网络诊断工具(2.0)
  6. 删除列表元素中最后一个元素
  7. 重磅分享:微软面试100题2010年版全部答案完整亮相
  8. 【AI特训营】:柯西分布 Paddle API实现
  9. echarts树图图标修改成图片以及自定义图片首次加载不显示的问题的修改<js>
  10. ROS Navigation-----map_server包缺少Error: package 'map_server' not found