理解Raft协议
1.Paxos算法存在的问题
Paxos算法是莱斯利·兰伯特(英语:Leslie Lamport,LaTeX中的「La」)于年提出的一种基于消息传递且具有高度容错特性的一致性算法。
难以理解
“The dirty little secret of the NSDI community is that at most five people really, truly understand every part of Paxos :-)” — NSDI reviewer
NSDI:关于网络系统设计的著名会议
NSDI社区的一个肮脏的小秘密是,至多有五个人真正地了解Paxos的每一个部分。
Paxos算法是如何工作的?
Paxos算法每个阶段的意图是什么?
很难产生直观的感受。
难以实现并应用于现实中的系统
“There are significant gaps between the description of the Paxos algorithm and the needs of a realworld system ... the final system will be based on an unproven protocol” — Chubby authors
Chubby:Google分布式锁服务
Paxos算法的描述与现实世界系统的需求之间存在明显的差距。最终开发完成的系统将构建在未经验证的协议之上。
人们在实现Paxos算法时,发现很多实现上的难题,最终开发出和Paxos算法不一样的结构。
2.Raft算法
Raft协议由Diego Ongaro和John Ousterhout(斯坦福大学)共同于年设计。
2.1 复制状态机
每一个服务器存储着一个日志序列。每一个服务器按照顺序应用每条日志(或称之为执行指令),并应用到状态机中。
保证了日志序列相同,那么,在应用每条日志(或称之为执行每个指令)时,每台服务器的状态机状态都是一致的。
保证日志序列相同就是一致性算法的工作。
2.2. Raft算法
Raft选举出一个Leader,通过Leader管理日志复制来实现一致性。
Leader从客户端接收日志条目,将日志条目复制到其他服务器上。当确保安全性的时候,告诉其他的服务器应用日志条目到他们的状态机上。
为了可理解性,Raft对通过问题分解,将算法分为了几个独立的部分
Leader选举
日志复制
安全性问题
2.2.1 安全性问题
特性 |
解释 |
---|---|
选举安全原则 |
对于一个给定的任期号,最多只会有一个领导人被选举出来 |
领导人只附加原则 |
领导人绝对不会删除或者覆盖自己的日志,只会增加 |
日志匹配原则 |
如果两个日志在相同的索引位置的日志条目的任期号相同,那么我们就认为这个日志从头到这个索引位置之间全部完全相同 |
领导人完全原则 |
如果某个日志条目在某个任期号中已经被提交,那么这个条目必然出现在更大任期号的所有领导人中 |
状态机安全原则 |
如果一个领导人已经在给定的索引值位置的日志条目应用到状态机中,那么其他任何的服务器在这个索引位置不会提交一个不同的日志 |
2.2.2 Leader选举
一个Raft集群包含若干个服务器节点,通常是5个,允许整个系统容忍2个节点的失效。
在任何时刻,每一个服务期节点都处于以下3种状态之一:
Leader:处理所有的客户端请求(如果客户端将请求发给了Follower,Follower会把请求重定向给Leader)
Follower:不会发送任何请求,只会简单地响应来自Leader或Candidate的请求
Candidate:用于选举产生新的领导人
Term——任期
1)每个任期最多只能有一个领导人Leader
2)有时候任期内可能没有领导人(因选举失败)
3)每台机器上维持着当前的任期号。
会在每次RPC通信时会将自己的任期号进行传递(可用于识别过时的信息)
如果RPC收到任期号大的值,变为follower。
如果RPC收到过期的任期号,返回错误信息。
选举安全原则:对于一个给定的任期号,最多只会有一个领导人被选举出来
1)每个机器只能投一次票(含投给自己)
2)获得多数选票的成为leader
问题:
如果选举过程中,一直没有一个Candidate获得大多数选票,将一直进行重复选举。
如何保证会有一个Candidate会获取到大多数选票成为Leader?
Raft的解决方法:随机超时时间,保证只有一个follewer超时,变成Candidate,并(在其他follower超时前)发送投票请求,得到大多数的选票,从而成为leader。
2.2.3日志复制
领导人只附加原则:领导人绝对不会删除或者覆盖自己的日志,只会增加
日志匹配原则:如果两个日志在相同的索引位置的日志条目的任期号相同,那么我们就认为这个日志从头到这个索引位置之间全部完全相同
客户端发送命令给Leader。
Leader把日志条目加到自己的日志里。
Leader发送AppendEntries RPC请求给所有的follower。
日志一致性检查
AppendEntries RPC里包含着prevLogIndex,prevLogTerm。
Follower接收到后,会检查相应的日志条目是否匹配上
1)如果匹配上了(Example#1),将收到的日志条目添加到自己的日志里。
(根据【日志匹配原则】,表示follower和leader的prevLogIndex以前的所有日志条目是安全相同的)
2)如果没有匹配上(Example#2),follower将拒绝此次请求,Leader将index调小,不断进行重试,直到匹配上。
(Example#3)follower会将后面的日志条目全部删除,再将leader的日志条目添加上。
日志提交
(日志提交:指将日志条目应用到状态机中)
一旦新的日志条目变成【已经复制到大多数follower机器上】的了。
(PS:关于上面所讲的“大多数follower机器”个数?
问题:可以这么理解吗?
满足【“大多数follower机器”个数 + leader > 集群中机器个数的一半】就可以。
比如,集群中机器个数为5,“大多数follower机器”个数为2就可以了。
答案:
不可以,因为如果leader宕机不重启,无法保证仍旧为大多数。
)
Leader在状态机里提交自己日志条目,然后返回结果给客户端
Leader下次发送AppendEntries RPC时,告知follower已经提交的日志条目信息(lastIndex)
foller收到RPC后,提交到自己的状态机里
在Raft运行过程中,可能的各个机器日志条目状态如下。
问题:
领导人S1宕机了,重新进行选举,是每台机器都可以被选举成为新leader吗?
如果S4被选举成term 4的leader,会发生什么问题?
答案:
当S4发送AppendEntries RPC请求给所有的follower时,
在进行日志一致性检查时,会将follower已经提交到状态机中的日志条目给删除掉!!从而违反了状态机安全原则。
状态机安全原则:如果一个领导人已经在给定的索引值位置的日志条目应用到状态机中,那么其他任何的服务器在这个索引位置不会提交一个不同的日志
领导人完全原则:如果某个日志条目在某个任期号中已经被提交,那么这个条目必然出现在更大任期号的所有领导人中
如何保证选举出的新leader包含所有已提交的日志条目?
选举规则的限制:Candidate发送的RequestVote RPC中含有lastIndex,lastTerm。
当机器收到后,如果Candidate的日志不如自己的新,将拒绝投票给它。
日志的新旧的比较:通过比较两份日志中最后一条日志条目的索引值和任期号定义谁的日志比较新。
如果两份日志最后的条目的任期号不同,那么任期号大的日志更加新。
如果两份日志最后的条目任期号相同,那么日志比较长的那个就更加新。
S1:选票(S1,S2,S3,S4,S5)可获得多数选票
S2:选票(S2,S4)
S3:选票(S1,S2,S3,S4,S5)可获得多数选票
S4:选票(S4)
S5:选票(S2,S4,S5)可获得多数选票
因此,S1, S3, S5可被选举为新的leader,S2,S4则不行。
思考:为何通过这种方式可以保证新选举的leader一定拥有已commit的日志条目?
答案:
leader在当日志条目【已经复制到大多数follower机器上】时,才会提交日志条目。
假设已经含有已提交日志条目的机器(可能含上一次的leader)组成的集合为Set。
根据以上选举规则的限制,可知新leader一定在Set中。
参考资料
[1] https://raft.github.io/raft.pdf Raft论文原文
[2] https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md Raft论文翻译
[4] https://raft.github.io/ Raft官网
[5] http://thesecretlivesofdata.com/raft/ Raft算法可视化
[6] https://raft.github.io/slides/uiuc2016.pdf
https://www.youtube.com/watch?v=vYp4LYbnnW8&feature=youtu.be
Raft论文作者PPT讲稿及视频
理解Raft协议的更多相关文章
- [搜狐科技]由浅入深理解Raft协议
由浅入深理解Raft协议 2017-10-16 12:12操作系统/设计 0 - Raft协议和Paxos的因缘 读过Raft论文<In Search of an Understandable ...
- 理解分布式一致性:Raft协议
理解分布式一致性:Raft协议 什么是分布式一致性 Leader选举 日志复制流程 term选举周期 timeout 选举和选举timeout 选举分裂 日志复制和心跳timeout 在分布式系统中, ...
- Raft协议理解
raft协议最关键的部分是领导选举和日志复制 日志复制 日志匹配原则:如果两个日志在相同索引位置的entry的任期号相同,那么这两个日志从头到这个索引位置之前完全相同. 日志匹配原则可以解释为如下两条 ...
- Raft协议实战之Redis Sentinel的选举Leader源码解析
这可能是我看过的写的最详细的关于redis 选举的文章了, 原文链接 Raft协议是用来解决分布式系统一致性问题的协议,在很长一段时间,Paxos被认为是解决分布式系统一致性的代名词.但是Paxos难 ...
- MIT-6.824 Raft协议
摘要 raft是一种比paxos容易理解的一致性算法,实现起来比paxos简单许多.本文前部分描述算法的细节,后部分尝试探讨下该算法的原理. 算法描述 raft算法之所以简单的原因之一是它将问题分解成 ...
- Raft协议学习笔记
目录 目录 1 1. 前言 1 2. 名词 1 3. 什么是分布式一致性? 3 4. Raft选举 3 4.1. 什么是Leader选举? 3 4.2. 选举的实现 4 4.3. Term和Lease ...
- Paxos算法与Zookeeper分析,zab (zk)raft协议(etcd) 8. 与Galera及MySQL Group replication的比较
mit 分布式论文集 https://github.com/feixiao/Distributed-Systems wiki上描述的几种都明白了就出师了 raft 和 zab 是类似的,都是1.先选举 ...
- 从JRaft来看Raft协议实现细节
分布式系统和一致性问题 一致性问题(consensus problem)是分布式系统需要解决的一个核心问题.分布式系统一般是由多个地位相等的节点组成,各个节点之间的交互就好比几个人聚在一起讨论问题.让 ...
- Raft 协议
Paxos 存在的问题 Paxos 算法的描述偏学术化,缺失了很多细节,无法直接应用于工程领域.实际工程应用中的分布式算法大多是 Paxos 的变种,验证这些算法的正确性也成为了一个难题. 举个例子: ...
随机推荐
- Matplotlib绘图库入门(七):高效使用
原文地址: !()[http://www.bugingcode.com/blog/Matplotlib_7_Effectively_Using.html] 这是一篇关于如何高效的使用Matplotli ...
- 4K手机能拯救索尼手机吗?
智能手机屏幕分辨率究竟达到多少才是极限,一直是业内争论不休的问题.从低分辨率一路走来,直到iPhone 4搭载视网膜屏,业内才有了一个较为统一的认知:屏幕起码要在合适距离下看不到文字.图像虚影,才称得 ...
- nginx 502排错
线上一台机器(该论坛所在机器)近期频繁出现502,每100次访问就会出现10次,这频率也太高了.于是开始了我的502排查之旅 ps aux |grep -c php 结果为200 netstat -a ...
- SetTimeout()多次运行函数后越来越快的问题
问题原因很简单,但是由于代码逻辑问题,一直没有考虑到: 网上有个帖子说的很明白:原帖入口 假如你在0时刻点击了一下按钮,那么500ms时数字会跳一下,1000ms会再跳一下,依次类推,1500,200 ...
- 在linux中下载安装FTP服务
一.环境及需求 阿里云服务器的Centos6.9版本,当时需要用到上传服务,所以我想着先搭建一个ftp,比较方便快捷,但是我参考了网上好多的博客,简单安装是没问题,但是时不时还会遇到好多坑,与其说是博 ...
- 常见WAF绕过思路
WAF分类 0x01 云waf 在配置云waf时(通常是CDN包含的waf),DNS需要解析到CDN的ip上去,在请求uri时,数据包就会先经过云waf进行检测,如果通过再将数据包流给主机. 0x02 ...
- 7-30 jmu-python-凯撒密码加密算法 (10 分)
编写一个凯撒密码加密程序,接收用户输入的文本和密钥k,对明文中的字母a-z和字母A-Z替换为其后第k个字母. 输入格式: 接收两行输入,第一行为待加密的明文,第二行为密钥k. 输出格式: 输出加密后的 ...
- 20170809-从URL输入到页面展现
从URL输入到页面展现 1.输入URL URL:统一资源定位符,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示. URL包含以下几部分:协议.服务器名称(或IP地址).路径.参数和查询. ...
- PhaserJS 3 屏幕适配时的小坑 -- JavaScript Html5 游戏开发
巨坑:在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设 ...
- 前端每日实战:113# 视频演示如何用纯 CSS 创作一个赛车 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/mGdXGJ 可交互视频 此视频是可 ...