分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!...
过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。
来自Stanford的新的分布式协议研究称为Raft,它是一个为真实世界应用建立的协议,主要注重协议的落地性和可理解性。
在了解Raft之前,我们先了解Consensus一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意 外可能,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态。这样就需要一种Consensus协议,一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程。
为了以容错方式达成一致,我们不可能要求所有服务器100%都达成一致状态,只要超过半数的大多数服务器达成一致就可以了,假设有N台服务器,N/2 +1 就超过半数,代表大多数了。
Paxos和Raft都是为了实现Consensus一致性这个目标,这个过程如同选举一样,参选者需要说服大多数选民(服务器)投票给他,一旦选定后就跟随其操作。Paxos和Raft的区别在于选举的具体过程不同。
在Raft中,任何时候一个服务器可以扮演下面角色之一:
- Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader.
- Follower: 类似选民,完全被动
- 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的新的更新 意味着还是可能丢数据!!!...相关推荐
- 分布式系统的Raft算法
2019独角兽企业重金招聘Python工程师标准>>> 分布式系统的Raft算法 过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁 ...
- 分布式系统之Raft算法
介绍 Raft是一种为了管理日志复制的分布式一致性算法.Raft 出现之前,Paxos 一直是分布式一致性算法的标准.Paxos 难以理解,更难以实现.Raft 的设计目标是简化 Paxos,使得算法 ...
- 分布式一致性算法——Paxos 和 Raft 算法
写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定大数据理 ...
- Raft 算法 详细版介绍
1. Raft 算法简介 1.1 Raft 背景 在分布式系统中,一致性算法至关重要.在所有一致性算法中,Paxos 最负盛名,它由莱斯利·兰伯特(Leslie Lamport)于 1990 年提出, ...
- Raft 算法(详细版)
1. Raft 算法简介 1.1 Raft 背景 在分布式系统中,一致性算法至关重要.在所有一致性算法中,Paxos 最负盛名,它由莱斯利·兰伯特(Leslie Lamport)于 1990 年提出, ...
- 【面试】Raft算法详解
文章目录 前言 一.Raft算法概述 二.Leader选举 三.日志同步 四.安全性 五.日志压缩 六.成员变更 七.Raft与Multi-Paxos的异同 八.Raft算法总结 参考 前言 Paxo ...
- 自己动手实现RAFT算法
自己动手实现RAFT算法 前段时间学习了一下分布式系统的raft算法,相比较Paxos协议,理解起来确实容易多了,于是就产生了自己动手实现一套基于raft一致性协议的分布式缓存的想法,经过大约两个月的 ...
- Raft 算法详解(一)领导者选举
Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简 化和限制,比如增加了日志必须是连续的,只支持领导者.跟随者和候选人三种状态,在理 解和 ...
- 过家家巧说raft算法
目录 一 一致性 二 Raft算法 1 leader选举 2 日志复制 3 leader切换时如何保证日志完整性 三 参考文献 一 一致性 一致性是指分布式系统中的多个服务节点,给定一系列操作,在特定 ...
最新文章
- linux基于此语言的密码,一次有趣的Linux下.Net Core与C语言的合作开发体验:生成Linux标准的用户密码串...
- java提高篇(三十)-----Iterator
- Android应用开发—RecyclerView绘制蒙层
- Python对IP地址列表排序、对列表进行去重、IP地址与MAC地址组合的多个元组的列表排序
- Bootstrap CSS编码规范之代码组织规范
- Java案例:词频统计
- 视频教程-带你入门matlab小波分析-Matlab
- fiddler抓包记录
- java--String类常用方法大全
- android 跳转京东app,打开并跳转到京东app指定页面
- 微信公众号答题功能搭建
- 钉钉大肆抢夺TO B数字化办公市场 企业微信、金蝶、石墨文档、脉脉等危矣?...
- 【Slurm】Slurm使用故障workaround记录
- android 各别控件缩放,[翻译]Android单手指缩放-第二部分(Android one finger zoom tutorial – Part 2)...
- Android 多点触控与图片缩放
- Windows无法连接到System Event Notification Service服务问题解决
- UltraEdit文字编辑器集成脚本引擎教程
- linux mysql5.6 单向 同步 配置 2014_MySql 5.6 数据单向同步详细步骤(亲测成功同步)...
- 2021年电力电缆考试题库及电力电缆报名考试
- 蜘蛛纸牌 java代码_java实现蜘蛛纸牌游戏
热门文章
- python坐标轴刻度为经纬度_python各类经纬度转换
- mysql sysdate() 慢_mysql笔记
- 我们用最详细的方式解析Android消息机制的源码,经典好文
- 【深度学习】医学图像分割的集成与后处理
- Tensorflow【实战Google深度学习框架】使用 HDF5 处理大型数据集with TFLearn
- Tensorflow【实战Google深度学习框架】—TensorFlow 高级训练模型
- delphi oracle新建用户,Delphi 中如何用另外一个用户的身份来运行一人程序
- eix安装_Windwos U盘PE制作与系统安装
- 构造函数未定义_构造函数(constructor)和观察者模式,谁略胜一筹呢?
- mapper注解的主要作用_Mybatis中mapper的xml解析详解