MIT 6.5840 Raft Implementation(2B, Log Replication)
Raft实现思路+细节(2B)
任务分解
2B中最主要的任务就是进行日志的复制。Raft是一个强领导人的系统,这意味着所有的日志添加都是由领导人发起的,与之相类似的,还有很多其他的结论(它们都是比较显然的),读者可以自行证明。

我们可以这样地分解复制日志的过程
我们首先需要完善Raft结构体的内容。

我们对新加入的内容进行解释:
commitIndex:这代表了每一个Raft中最高的已经提交的日志下标,它表示对于这个下标以内的所有日志,我们都已经和领导达成共识。可以想象,它的更新是在收到RPC的时候完成的,因为如果领导人提交了某一条指令,且某个追随者有这条指令,那么就可以认为是达成共识的了,后续可以进行应用等操作。lastApplied:这是一个紧跟commitIndex的成员,他指代的是每一个Raft中已经应用到状态机中的日志下标的最大值。我们会对每个Raft有一个轮询(至少我是这么实现的),如果lastApplied<commitIndex,那么就把这个区间内的所有指令应用到复制状态机上。nextIndex(对于领导人):这代表的是对于每个成员,下一组要发的指令的下标的最小值,可以想象它代表着领导人和每个成员在哪些日志上达成了一致,它的更新应该是在AppenEntriesRPC中实现的。matchIndex(对于领导人):这代表的是,对于每个成员,和领导人达成一致的下标的最大值(当然,你可以期待一般matchIndex=nextIndex-1)。我们通过它来决定要提交到哪一条指令(也即大部分人matchIndex的下界)。
经过上层服务器的多次尝试,我们终于在领导人这里加了一条日志:我们需要完成
Start()函数,它的参数为一条指令(一个空的interface),返回的是这条指令在领导人这边的日志编号,领导人的任期,和这个人是否是领导人。同时,在Start函数中我们也要显式地向每一个追随者发一条心跳(其实就是AppendEntriesRpc).类似于
MakeElection函数,我们需要完成launchAppendEnries()这一函数,并处理回复信息。我们需要完成
AppendEntries()函数,在里面完成RPCHandler的功能。我们需要完成上文中提到的轮询,对每一个Raft开一个Go程来检查要不要提交某一些指令,如果是的话,那就加到
applyCh内(这个applyCh也需要自己完成)。
实现细节
在
Start中,我们需要:增加log
改变
lastLogIndex, lastLogTerm开Go程来发送信息:
go rf.launchAppendEntries(peerId)
我们首先需要发送
AppendEntriesArgs,然后需要考虑AppendEntriesReply,具体来说:需要遵循Rules For All Servers,如果自己的任期变大,不需要处理;如果Reply的任期更高,变成追随者......(建议参考raft-extended)
如果回复显示成功,那么把
nextIndex, matchIndex都增加,并考察commitIndex是否也可以增加(看看是不是有一半的matchIndex)都超过了某一个值如果回复显示失败,我们就把
nextIndex[peerId]减少一,来向下匹配。(在后文中我们会看到对于这一点的明显优化)
这是2B中的核心内容,我们在这里考察论文中的图示:

这个比较简单,只要知道“信道”是啥基本就可以了。
注意事项
在上面这张图中,Reply false的意思是直接返回。
这里第三条的conflicts with的实现需要细细思考。如果接收者的日志中的每一条都是正确的,那么不需要截断(我到2C才发现这个)
对于Rules For All Server而言,如果变成Follower,不需要返回。这一点上的处理是和2A一致的。
关于评测

MIT 6.5840 Raft Implementation(2B, Log Replication)的更多相关文章
- MIT 6.824 Llab2B Raft之日志复制
书接上文Raft Part A | MIT 6.824 Lab2A Leader Election. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...
- MIT 6.824 Lab2C Raft之持久化
书接上文Raft Part B | MIT 6.824 Lab2B Log Replication. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...
- 6.824 Lab 2: Raft 2A
6.824 Lab 2: Raft Part 2A Due: Feb 23 at 11:59pm Part 2B Due: Mar 2 at 11:59pm Part 2C Due: Mar 9 at ...
- 分布式一致性协议Raft原理与实例
分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...
- Raft 一致性算法论文译文
本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...
- Raft
http://thesecretlivesofdata.com/raft/ https://github.com/coreos/etcd 1 Introduction Consensus algo ...
- Raft 一致性协议算法 《In search of an Understandable Consensus Algorithm (Extended Version)》
<In search of an Understandable Consensus Algorithm (Extended Version)> Raft是一种用于管理日志复制的一致性算 ...
- 一致性算法—Paxos、Raft、ZAB
一致性算法—Paxos.Raft.ZAB 2019年04月21日 20:35:09 bulingma 阅读数 64更多 分类专栏: 分布式概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- Raft翻译
英文原文:https://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14 In Search of an Understandable Conse ...
- 分布式系统理论进阶 - Raft、Zab
引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议——Raft和Zab.通过与Paxos对比,了解Raft和Zab的核心思想.加 ...
随机推荐
- python字符串集合面试笔试题
python字符串面试笔试题 以下代码的输出是? s = 'foo' t = 'bar' print('barf' in 2 * (s + t)) A.True B.Fasle +运算符连接字符串,而 ...
- AspNetCoreRateLimit应用于MVC项目求助
AspNetCoreRateLimit应用于MVC项目求助 前言 之前发过一篇文章: .NET Core WebApi接口ip限流实践 - 妙妙屋(zy) - 博客园 (cnblogs.com) 然后 ...
- ai问答:使用 Vue3 组合式API 和 TS 封装 echarts 折线图
使用这个组件时,只需要传入合适的chartData数组,就可以渲染一个折线图,并且响应数据变化. <template> <div ref="chart" styl ...
- 爬虫之浏览器指纹ja3_hash的更改
浏览器指纹 反爬中会遇到浏览器指纹,它是不会随着你更换 IP 或者 User-Agent 而改变的.并且他们的指纹每次请求也是固定的.只要网站发现某个拥有特定指纹的客户端持续高频率请求网站,它就可以把 ...
- 音视频八股文(8)-- h264 AnnexB
NALU(Network Abstract Layer Unit) ⾳视频编码在流媒体和⽹络领域占有重要地位:流媒体编解码流程⼤致如下图所示: H264简介 H.264从1999年开始,到2003年形 ...
- 2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件。
2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件. 答案2023-02-23: 使用 github.com/moonfdd/ffmpeg-go 库. 解 ...
- 2020-12-07:go中,slice的底层数据结构是什么?
福哥答案2020-12-07: 源码位于runtime/slice.go文件中的slice结构体. type slice struct { array unsafe.Pointer len int c ...
- 2021-11-22:给定一个正数数组arr,表示每个小朋友的得分; 任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果; 假设所有的小朋友坐
2021-11-22:给定一个正数数组arr,表示每个小朋友的得分: 任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果: 假设所有的小朋友坐 ...
- 2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案
2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案, ...
- PLSQL一些常用的知识点
1.背景 此处简单的记录一下在 oracle中如何使用plsql语法,记录一些简单的例子,防止以后忘记. 2.变量的声明 declare -- 声明变量 v_name varchar2(20); -- ...