过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。

  来自Stanford的新的分布式协议研究称为Raft,它是一个为真实世界应用建立的协议,主要注重协议的落地性和可理解性。

  在了解Raft之前,我们先了解Consensus一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意 外可能,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态。这样就需要一种Consensus协议,一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程。

  为了以容错方式达成一致,我们不可能要求所有服务器100%都达成一致状态,只要超过半数的大多数服务器达成一致就可以了,假设有N台服务器,N/2 +1 就超过半数,代表大多数了。

  Paxos和Raft都是为了实现Consensus一致性这个目标,这个过程如同选举一样,参选者需要说服大多数选民(服务器)投票给他,一旦选定后就跟随其操作。Paxos和Raft的区别在于选举的具体过程不同。

  在Raft中,任何时候一个服务器可以扮演下面角色之一:

  1. Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader.
  2. Follower: 类似选民,完全被动
  3. Candidate候选人: 类似Proposer律师,可以被选为一个新的领导人。

Raft阶段分为两个,首先是选举过程,然后在选举出来的领导人带领进行正常操作,比如日志复制等。下面用图示展示这个过程:

1. 任何一个服务器都可以成为一个候选者Candidate,它向其他服务器Follower发出要求选举自己的请求:

2. 其他服务器同意了,发出OK。

注意如果在这个过程中,有一个Follower当机,没有收到请求选举的要求,因此候选者可以自己选自己,只要达到N/2 + 1 的大多数票,候选人还是可以成为Leader的。

3. 这样这个候选者就成为了Leader领导人,它可以向选民也就是Follower们发出指令,比如进行日志复制。

4. 以后通过心跳进行日志复制的通知

5. 如果一旦这个Leader当机崩溃了,那么Follower中有一个成为候选者,发出邀票选举。

6. Follower同意后,其成为Leader,继续承担日志复制等指导工作:

值得注意的是,整个选举过程是有一个时间限制的,如下图:

  Splite Vote是因为如果同时有两个候选人向大家邀票,这时通过类似加时赛来解决,两个候选者在一段timeout比如300ms互相不服气的等待以后,因为双 方得到的票数是一样的,一半对一半,那么在300ms以后,再由这两个候选者发出邀票,这时同时的概率大大降低,那么首先发出邀票的的候选者得到了大多数 同意,成为领导者Leader,而另外一个候选者后来发出邀票时,那些Follower选民已经投票给第一个候选者,不能再投票给它,它就成为落选者了, 最后这个落选者也成为普通Follower一员了。

日志复制

  下面以日志复制为例子说明Raft算法,假设Leader领导人已经选出,这时客户端发出增加一个日志的要求,比如日志是"sally":

2. Leader要求Followe遵从他的指令,都将这个新的日志内容追加到他们各自日志中:

3.大多数follower服务器将日志写入磁盘文件后,确认追加成功,发出Commited Ok:

4. 在下一个心跳heartbeat中,Leader会通知所有Follwer更新commited 项目。

对于每个新的日志记录,重复上述过程。

如果在这一过程中,发生了网络分区或者网络通信故障,使得Leader不能访问大多数Follwers了,那么Leader只能正常更新它能访 问的那些Follower服务器,而大多数的服务器Follower因为没有了Leader,他们重新选举一个候选者作为Leader,然后这个 Leader作为代表于外界打交道,如果外界要求其添加新的日志,这个新的Leader就按上述步骤通知大多数Followers,如果这时网络故障修复 了,那么原先的Leader就变成Follower,在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的 更新。

总结:目前几乎所有语言都已经有支持Raft算法的库包,具体可参考:raftconsensus.github.io

英文动画演示Raft

CAP定理

分布式Paxos算法

ZooKeeper在服务发现中应用

转自:http://www.jdon.com/artichect/raft.html

转载于:https://www.cnblogs.com/bonelee/p/6408247.html

分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!...相关推荐

  1. 分布式系统的Raft算法

    2019独角兽企业重金招聘Python工程师标准>>> 分布式系统的Raft算法 过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁 ...

  2. 分布式系统之Raft算法

    介绍 Raft是一种为了管理日志复制的分布式一致性算法.Raft 出现之前,Paxos 一直是分布式一致性算法的标准.Paxos 难以理解,更难以实现.Raft 的设计目标是简化 Paxos,使得算法 ...

  3. 分布式一致性算法——Paxos 和 Raft 算法

    写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定大数据理 ...

  4. Raft 算法 详细版介绍

    1. Raft 算法简介 1.1 Raft 背景 在分布式系统中,一致性算法至关重要.在所有一致性算法中,Paxos 最负盛名,它由莱斯利·兰伯特(Leslie Lamport)于 1990 年提出, ...

  5. Raft 算法(详细版)

    1. Raft 算法简介 1.1 Raft 背景 在分布式系统中,一致性算法至关重要.在所有一致性算法中,Paxos 最负盛名,它由莱斯利·兰伯特(Leslie Lamport)于 1990 年提出, ...

  6. 【面试】Raft算法详解

    文章目录 前言 一.Raft算法概述 二.Leader选举 三.日志同步 四.安全性 五.日志压缩 六.成员变更 七.Raft与Multi-Paxos的异同 八.Raft算法总结 参考 前言 Paxo ...

  7. 自己动手实现RAFT算法

    自己动手实现RAFT算法 前段时间学习了一下分布式系统的raft算法,相比较Paxos协议,理解起来确实容易多了,于是就产生了自己动手实现一套基于raft一致性协议的分布式缓存的想法,经过大约两个月的 ...

  8. Raft 算法详解(一)领导者选举

    Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简 化和限制,比如增加了日志必须是连续的,只支持领导者.跟随者和候选人三种状态,在理 解和 ...

  9. 过家家巧说raft算法

    目录 一 一致性 二 Raft算法 1 leader选举 2 日志复制 3 leader切换时如何保证日志完整性 三 参考文献 一 一致性 一致性是指分布式系统中的多个服务节点,给定一系列操作,在特定 ...

最新文章

  1. linux基于此语言的密码,一次有趣的Linux下.Net Core与C语言的合作开发体验:生成Linux标准的用户密码串...
  2. java提高篇(三十)-----Iterator
  3. Android应用开发—RecyclerView绘制蒙层
  4. Python对IP地址列表排序、对列表进行去重、IP地址与MAC地址组合的多个元组的列表排序
  5. Bootstrap CSS编码规范之代码组织规范
  6. Java案例:词频统计
  7. 视频教程-带你入门matlab小波分析-Matlab
  8. fiddler抓包记录
  9. java--String类常用方法大全
  10. android 跳转京东app,打开并跳转到京东app指定页面
  11. 微信公众号答题功能搭建
  12. 钉钉大肆抢夺TO B数字化办公市场 企业微信、金蝶、石墨文档、脉脉等危矣?...
  13. 【Slurm】Slurm使用故障workaround记录
  14. android 各别控件缩放,[翻译]Android单手指缩放-第二部分(Android one finger zoom tutorial – Part 2)...
  15. Android 多点触控与图片缩放
  16. Windows无法连接到System Event Notification Service服务问题解决
  17. UltraEdit文字编辑器集成脚本引擎教程
  18. linux mysql5.6 单向 同步 配置 2014_MySql 5.6 数据单向同步详细步骤(亲测成功同步)...
  19. 2021年电力电缆考试题库及电力电缆报名考试
  20. 蜘蛛纸牌 java代码_java实现蜘蛛纸牌游戏

热门文章

  1. python坐标轴刻度为经纬度_python各类经纬度转换
  2. mysql sysdate() 慢_mysql笔记
  3. 我们用最详细的方式解析Android消息机制的源码,经典好文
  4. 【深度学习】医学图像分割的集成与后处理
  5. Tensorflow【实战Google深度学习框架】使用 HDF5 处理大型数据集with TFLearn
  6. Tensorflow【实战Google深度学习框架】—TensorFlow 高级训练模型
  7. delphi oracle新建用户,Delphi 中如何用另外一个用户的身份来运行一人程序
  8. eix安装_Windwos U盘PE制作与系统安装
  9. 构造函数未定义_构造函数(constructor)和观察者模式,谁略胜一筹呢?
  10. mapper注解的主要作用_Mybatis中mapper的xml解析详解