6.824 Spring 2021 -- Lab 2A
实验说明:6.824 Lab 2: Raft
可视化:Raft
实现目标
根据论文Figure 2和5.2实现Raft系统的选主和心跳
整体流程
新节点启动时,大致的流程如下:
- 初始化自己的属性信息,主要有votedFor=-1,currentTerm=0;设置选举超时(论文的election timeout)的时间范围为1000ms-2000ms,心跳间隔为150ms;设置自己的状态为Follower,开启electionTimeout计时器。
- 如果接收到来自其他节点的投票请求,(me表示自己,request表示请求者)
- 如果me.currentTerm >request.Term,或者me.currentTerm ==request.Term而且自己已经把票投给出去了(不是投给request),此时就直接拒绝这个请求,并把自己的currentTerm放回给request
- 经过第一点的过滤后,如果判断出日志不是up-to-date的,也同样拒绝这个请求; 如果日志是up-to-date的,而且me.currentTerm <request.Term,就更新自己的currentTerm,同时设置votedFor=request.ID,并把自己的状态转为Follower,重置自己的electionTimeout计时器;
- 如果接收到来自其他节点的心跳请求(me表示自己,request表示请求者)
- 判断me.currentTerm > request.Term,就否定这个心跳请求,并返回自己的currentTerm给请求者
- 如果me.currentTerm > request.Term,就更新自己的me.currentTerm=request.Term, me.votedFor=-1;转为自己为Follower,重置自己的electionTimeout计时器;
- 如果自己的electionTimeout计时器触发了
- me.currentTerm 自增1
- 投票给自己(me.votedFor=me.ID)
- 重置自己的electionTimeout计时器
- 发送投票请求给其他节点
- 如果收到半数节点的投票,就转为Leader,并开启自己的心跳计时器,周期性给其他节点发送心跳请求
- 如果收到一个节点的否定响应,同时对端节点的currentTerm比自己的大,就设置自己的currentTerm等于对端节点的currentTerm,votedFor=-1,并转化为Follower
- 如果一直没有得到半数节点的投票,也没有收到currentTerm比自己大的否定影响,就等待electionTimeout计时器再次触发
- 作为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相关推荐
- 6.824 raft lab 2A 2B实验分析
一.背景 为突破单机的容量和性能瓶颈,现在都采用分布式存储系统,而分布式存储系统就是采用分片扩大容量.多副本提供容错和性能的能力,可以简单.自动地横向扩展. 1 一致性算法介绍 raft就是非常著名的 ...
- Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)
传送门 文章目录 题意: 思路: 题意: 给你nnn个朋友,一共有mmm种货币,一个朋友最多喜欢ppp种,用二进制给出111代表喜欢,让你选出最多的一个货币集合使得至少有⌈n2⌉\left \lcei ...
- Deltix Round, Spring 2021 E. Crypto Lights 组合数学 + 推公式
传送门 文章目录 题意: 思路: 题意: 给你nnn个灯,每次可以打开一个灯,当连续的kkk个灯有至少两个灯开着的时候停止,问最终期望能打开多少灯. 思路: 由于不想打latexlatexlatex, ...
- 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 ...
- CS61C Spring 2021——Project 2: CS61Classify要求及实现思路
由于课程政策,CS61C的所有代码均不会在网上公开,以下仅记录完成project时的具体思路. CS61Classify的最终目标是在Venus RISC-V模拟器上运行一个简单的ANN网络.此项 ...
- mit6.824 2022 lab2
MIT6.824 2022 Raft Raft leader election log persistence log compaction 整体测试 后面发现的问题 参考代码 汇总博客:MIT6.8 ...
- MIT 6.824 Lab2A (raft) -- Leader Election
文章目录 实验要求 Leader Election流程 及详细实现介绍 基本角色 关键超时变量 关键的两个RPC实现 RequestVote RPC AppendEntries RPC Go并发编程实 ...
- 线上计算机科学课程,关于加州大学伯克利分校2021年春季线上课程(计算机科学方向)申请通知...
UC Berkeley(加州大学伯克利分校)开设2021年春季学期线上BGA(Berkeley Global Access)Remote课程-计算机科学方向(Computer Science Trac ...
- ML顶会论文都可复现吗?来挑战一下,还能拿500美元补贴
月石一 发自 凹非寺 量子位 报道 | 公众号 QbitAI Paper with Code发起了第5届机器学习再现性挑战(MLRC). 这一次不仅支持的会议有所增加,挑战者还能获得500美元的资金支 ...
最新文章
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
- 移动应用开发者应该关注的 Google I/O 两项更新
- 通用寄存器的专门用途
- 【网络安全】JAVA代码审计—— XXE外部实体注入
- visual studio快捷键 Qt creator快捷键
- w10计算机运行特别卡,电脑卡是什么问题?导致Win10正式版卡顿的原因及解决方法...
- 1-1、作用域深入和面向对象
- 认证令牌_Java应用程序的令牌认证
- linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)
- logger 参数列表过长_[源码级解析] 巧妙解决并深度分析Linux下rm命令提示参数列表过长的问题...
- CTF-Crypto密码学
- Oracle常用数据字典表
- PS2手柄移植-hal库
- 计算机基础与office应用教程,计算机基础与Office 2010实用教程
- 拿webshell的一些姿势
- 【数据结构(C语言版)严蔚敏 第一章 绪论】
- 美国博士后J1签证北京面签经过
- 计算机相关商标,计算机的商标是属于哪一类?
- 【FPGA学习笔记】Verilog语言的模块化设计
- 计算机应用基础统试题及答案,计算机应用基础统试题及答案
热门文章
- AI ProCon圆满落幕,五大技术专场精彩瞬间不容错过
- lintcode 简单篇(二)
- 手机上怎么压缩html文件夹,iphone手机怎么压缩文件 iphone自带文件压缩功能操作方法分享...
- 纳米数据专业体育数据供应商,足球篮球实时数据,实时更新比赛比分数据,体育数据接口api
- 网络故障和网络诊断工具(2.0)
- 删除列表元素中最后一个元素
- 重磅分享:微软面试100题2010年版全部答案完整亮相
- 【AI特训营】:柯西分布 Paddle API实现
- echarts树图图标修改成图片以及自定义图片首次加载不显示的问题的修改<js>
- ROS Navigation-----map_server包缺少Error: package 'map_server' not found