先附上论文链接  https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf

最近在自学MIT的6.824分布式课程,找到两个比较好的github:MIT课程《Distributed Systems 》学习和翻译 和 https://github.com/chaozh/MIT-6.824-2017

6.824的Lab 2 就是实现Raft算法。Raft是一种分布式一致性算法,提供了和paxos相同的功能和性能,但比paxos要容易理解很多。

一:Raft的一些概念

为了提升可理解性,Raft 将一致性算法分解成了几个部分:、

1)Leader选举:当之前的Leader宕机的时候,要选出新的Leader

2)日志复制:Leader从客户端接收日志然后复制到集群中的其它节点,并且要使其它节点的日志保持和自己相同

3)安全性:如果有任何的服务器节点已经commit一个日志条目到它的状态机中,那么其它服务器节点不能在同一个日志索引位置commit一个不同的指令。

Raft将系统中的角色分为领导者(Leader)、跟随者(Follower)和候选人(Candidate):

Leader:通常情况下系统中只有一个Leader,其它服务器节点都是Follower。Leader负责接受客户端的请求并把日志同步到Follower。Raft 中日志条目都遵循着从Leader发送给其它节点这一个方向,这也是Raft追求简单易懂的体现,像Viewstamped Replication和Zookeeper日志条目的流动都是双向的,导致机制比较复杂。

Follower:接受并持久化Leader同步的日志,在Leader告之日志可以提交之后,提交日志。

Candidate:Leader选举过程中的临时角色。

这三种角色的转换如下图:

Follower只响应来自其他服务器的请求。如果Follower接收不到消息,那么它就会变成Candidate并发起一次选举。获得集群中大多数选票的Candidate将成为Leader。Leader在宕机之前一直都会是Leader。

Raft算法将时间分为一个个的任期(term),每一个term的开始都是Leader选举。在成功选举Leader之后,Leader会在整个term内管理整个集群。如果Leader选举失败,该term就会因为没有Leader而结束,在下一个term继续选Leader。

 二:Leader选举

  Raft 使用一种心跳机制来触发领导人选举。在初始状态,服务器节点都是Follower,如果Follower在一段时间(election timeout)内没有接收到Leader的心跳,则认为Leader挂了。此时Follower会将term加1,并转换为Candidate状态。然后Follower会向集群中其它服务器节点发送RequestVote消息请求其它节点投票给自己。一个节点收到RequestVote 消息后通过比较两份日志中最后一条日志条目的索引值和term得出谁的日志比较新。如果本节点的日志比较新,则会拒绝掉该投票请求,否则赞成。当Candidate得到大多数节点的赞成后,则此Candidate会成为Leader,并不断发送心跳给其它节点,以维持其Leader地位。
  这种选举方法保证了Leader有着最新的日志,这样就能保证日志条目都遵循着从Leader发送给其它节点这一个方向,使Raft更容易理解。

  如果选票被瓜分,会导致所有Candidate都无法得到大多数节点的赞成票,会导致选举失败。在下一轮选举中,同样也会出现这种选票瓜分的情况。为了避免出现这种问题,raft将选举超时时间随机化,这样就不会出现多个Candidate同时选举超时,再同时发起选举的情况。这样在第一个选举超时的Candidate会有最大的term,发送RequestVote从而成为Leader。

三、日志复制

  Leader被选举出来后,就可以接受客户端的请求了。客户端的每个请求都包含一条被Replicated State Matchine执行的指令。Leader把客户端发过来的指令作为一条新的日志条目加到日志中区,随后发起AppendEntries RPC请求将指令发送给其它节点。当日志条目被安全地复制(大多数节点已经将该日志条目写入日志当中)后,则Leader将这个日志条目应用到它的状态机中,然后把执行结果返回给客户端。

  那么Follower 是怎么接受来自Leader 的AppendEntries 的呢?先说一下一致性检查的过程。由于Follower可能落后Leader一些日志(比如之前挂了后来恢复了),或者比Leader多一些日志(比如这个结点是上一个term的Leader,有一些日志还没Commited就挂了),而raft要求Follower要完整复制Leader的日志,因需要进行一致性检查。在发送AppendEntries  RPC时,Leader会包含最新日志的前一个条目的索引和任期号。如果Follower在日志中找不到包含相同索引号和任期号的条目,那么它将会拒接接受新的日志条目。

  Leadre针对每个Follower维护了一个nextIndex,表示下一个要发送给Follower的日志条目的索引。当一个Leader刚被选举出时,将nextIndex初始化为自己最新日志的index+1。如果AppendEntries 请求被拒绝,Leader会减小nextIndex进行重试,直到在某个位置Leader和Follower的日志一致,则AppendEntries  RPC成功,Follower上冲突的日志条目会全部删除并加上Leader的日志。这时,Follower的日志就会和Leader保持一致。

之前任期日志条目的处理

  本轮任期的Leader不能提交一个之前任期内的日志条目,否则可能会出现下述情况

  1. 在阶段a,term为2,S1是Leader,且S1写入日志(term, index)为(2, 2),并且日志被同步写入了S2;
  2. 在阶段b,S1离线,触发一次新的选主,此时S5被选为新的Leader,此时系统term为3,且写入了日志(term, index)为(3, 2);
  3. S5尚未将日志推送到Followers变离线了,进而触发了一次新的选主,而之前离线的S1经过重新上线后被选中变成Leader,此时系统term为4,此时S1会将自己的日志同步到Followers,按照上图就是将日志(2, 2)同步到了S3,而此时由于该日志已经被同步到了多数节点(S1, S2, S3),因此,此时日志(2,2)可以被commit了(即更新到状态机);
  4. 在阶段d,S1又很不幸地下线了,系统触发一次选主,而S5有可能被选为新的Leader(这是因为S5可以满足作为主的一切条件:1. term = 5 > 4,2. 最新的日志为(3,2),比大多数节点(如S2/S3/S4的日志都新),然后S5会将自己的日志更新到Followers,于是S2、S3中已经被提交的日志(2,2)被截断了,这是致命性的错误,因为一致性协议中不允许出现已经应用到状态机中的日志被截断。

为了避免这种错误,Raft要求只有Leader当前term里的日志可以被提交。当然,由于日志匹配特性,之前的日志条目也会被提交。

参考链接:https://zhuanlan.zhihu.com/p/27207160

Raft论文学习笔记的更多相关文章

  1. 论文学习笔记 - 高光谱 和 LiDAR 融合分类合集

    A³CLNN: Spatial, Spectral and Multiscale Attention ConvLSTM Neural Network for Multisource Remote Se ...

  2. Apache Calcite 论文学习笔记

    特别声明:本文来源于掘金,"预留"发表的[Apache Calcite 论文学习笔记](https://juejin.im/post/5d2ed6a96fb9a07eea32a6f ...

  3. Lasso估计论文学习笔记(一)

    最近课程作业让阅读了这篇经典的论文,写篇学习笔记. 主要是对论文前半部分Lasso思想的理解,后面实验以及参数估计部分没有怎么写,中间有错误希望能提醒一下,新手原谅一下. 1.整体思路 作者提出了一种 ...

  4. 分布式系统的Raft算法学习笔记

    摘取自:  http://mp.weixin.qq.com/s?__biz=MzIyMTQ1NDE0MQ==&mid=2247483979&idx=1&sn=12864382e ...

  5. 论文学习笔记--无缺陷样本产品表面缺陷检测 A Surface Defect Detection Method Based on Positive Samples

    文章下载地址:A Surface Defect Detection Method Based on Positive Samples 第一部分  论文中文翻译 摘要:基于机器视觉的表面缺陷检测和分类可 ...

  6. Raft协议学习笔记

    目录 目录 1 1. 前言 1 2. 名词 1 3. 什么是分布式一致性? 3 4. Raft选举 3 4.1. 什么是Leader选举? 3 4.2. 选举的实现 4 4.3. Term和Lease ...

  7. 论文学习笔记 - Classifification of Hyperspectral and LiDAR Data Using Coupled CNNs

    Classifification of Hyperspectral and LiDAR Data Using Coupled CNNs 来源:IEEE TGRS 2020 下载:https://arx ...

  8. QA问答系统,QA匹配论文学习笔记

    论文题目: WIKIQA: A Challenge Dataset for Open-Domain Question Answering 论文代码运行: 首先按照readme中的提示安装需要的部分 遇 ...

  9. 深度学习笔记(七)SSD 论文阅读笔记简化

    一. 算法概述 本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法.与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度.针 ...

随机推荐

  1. java里程碑之泛型--深入理解泛型

    所谓泛型,就是允许在定义类,接口,方法时使用类型形参,这个类型形参将在声明变量,创建对象,调用方法的时候动态的指定.JAVA5之后修改了集合中所有的接口和类,为这些接口和类都提供了泛型的支持. 关于泛 ...

  2. JVM的内存分区

    JVM的内存分区 这篇文章尝试讨论清楚JVM的内存分区情况. 1.       JVM的内存和系统内存的关系 下图是对系统内存及JVM内存的大致描绘 对大多数操作系统,内存可以分为物理内存RAM及Sw ...

  3. VS下WPF自定义控件的基本步骤和基本代码实现

    一.自定义控件的基本步骤: (本示例项目名称为:W:添加的自定义控件名称为) 1.  在"解决方案资源管理器"窗口的项目名上: 右击à添加à新建项(Ctrl+Shift+A) 2. ...

  4. python各种运算优先级一览表

    ##python各种运算的优先级 运算符 描述 lambda Lambda表达式 or 布尔"或" and 布尔"与" not x 布尔"非" ...

  5. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  6. 夏令营提高班上午上机测试 Day 2 解题报告

    那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧……   是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...

  7. BZOJ 3991: [SDOI2015]寻宝游戏 [虚树 树链的并 set]

    传送门 题意: $n$个点的树,$m$次变动使得某个点有宝物或没宝物,询问每次变动后集齐所有宝物并返回原点的最小距离 转化成有根树,求树链的并... 两两树链求并就可以,但我们按照$dfs$序来两两求 ...

  8. VS2010+opencv2.4.10+gsl_1.8配置实现RobHess的SIFT程序

    最近在做sift方面的毕业设计,弄了一天终于把RobHess的SIFT程序调通了.虽然网上有很多相关博文,但是我还是想把我的调试的过程跟大家分享一下.由于工程没法在博文上传,所以有需要的可以在下方留言 ...

  9. ES6 学习笔记之二 块作用域与闭包

    "闭包是函数和声明该函数的词法环境的组合." 这是MDN上对闭包的定义. <JavaScript高级程序设计>中则是这样定义的:闭包是指有权访问另一个函数作用域中的变量 ...

  10. .NET Core使用swagger进行API接口文档管理

    一.问题背景 随着技术的发展,现在的开发模式已经更多的转向了前后端分离的模式,在前后端开发的过程中,联系的方式也变成了API接口,但是目前项目中对于API的管理很多时候还是通过手工编写文档,每次的需求 ...