目录
1.Paxos算法存在的问题
2.Raft算法
    2.1 复制状态机
    2.2. Raft算法
    2.2.1 安全性问题
    2.2.2 Leader选举
    2.2.3日志复制
        日志一致性检查
        日志提交
参考资料

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协议的更多相关文章

  1. [搜狐科技]由浅入深理解Raft协议

    由浅入深理解Raft协议 2017-10-16 12:12操作系统/设计 0 - Raft协议和Paxos的因缘 读过Raft论文<In Search of an Understandable ...

  2. 理解分布式一致性:Raft协议

    理解分布式一致性:Raft协议 什么是分布式一致性 Leader选举 日志复制流程 term选举周期 timeout 选举和选举timeout 选举分裂 日志复制和心跳timeout 在分布式系统中, ...

  3. Raft协议理解

    raft协议最关键的部分是领导选举和日志复制 日志复制 日志匹配原则:如果两个日志在相同索引位置的entry的任期号相同,那么这两个日志从头到这个索引位置之前完全相同. 日志匹配原则可以解释为如下两条 ...

  4. Raft协议实战之Redis Sentinel的选举Leader源码解析

    这可能是我看过的写的最详细的关于redis 选举的文章了, 原文链接 Raft协议是用来解决分布式系统一致性问题的协议,在很长一段时间,Paxos被认为是解决分布式系统一致性的代名词.但是Paxos难 ...

  5. MIT-6.824 Raft协议

    摘要 raft是一种比paxos容易理解的一致性算法,实现起来比paxos简单许多.本文前部分描述算法的细节,后部分尝试探讨下该算法的原理. 算法描述 raft算法之所以简单的原因之一是它将问题分解成 ...

  6. Raft协议学习笔记

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

  7. Paxos算法与Zookeeper分析,zab (zk)raft协议(etcd) 8. 与Galera及MySQL Group replication的比较

    mit 分布式论文集 https://github.com/feixiao/Distributed-Systems wiki上描述的几种都明白了就出师了 raft 和 zab 是类似的,都是1.先选举 ...

  8. 从JRaft来看Raft协议实现细节

    分布式系统和一致性问题 一致性问题(consensus problem)是分布式系统需要解决的一个核心问题.分布式系统一般是由多个地位相等的节点组成,各个节点之间的交互就好比几个人聚在一起讨论问题.让 ...

  9. Raft 协议

    Paxos 存在的问题 Paxos 算法的描述偏学术化,缺失了很多细节,无法直接应用于工程领域.实际工程应用中的分布式算法大多是 Paxos 的变种,验证这些算法的正确性也成为了一个难题. 举个例子: ...

随机推荐

  1. javascript中的function命名空間與模擬getter、setter

    function的命名空間 在javascript中,function也可以擁有自己的命名空間例如以下這段程式碼: 12345678 function () { return 'I am A';} A ...

  2. 码海拾遗:strstr()、strcmp()和strcpy()实现

    1.strstr()实现 原型:char * strstr(const char * str1, const char * str2) 说明:判断str2是否为str1的子串,如果是则返回str2第一 ...

  3. Android(四)-JVM与DVM区别

    JVM与DVM区别 1.由来 Android是基于java的既然java已经有了java虚拟机,为什么android还要弄一个DVM了?最重要的就是版权问题,一开始就是用的 JVM,没过多久就被SUN ...

  4. Implementing 5G NR Features in FPGA

    目录 论文来源 论文简介 基本原理 论文创新点 借鉴之处 论文来源 2018 European Conference on Networks and Communications (EuCNC),Ja ...

  5. SpringBoot入门系列(一)如何快速创建SpringBoot项目

    这段时间也没什么事情,所以就重新学习整理了Spring Boot的相关内容.今天开始整理更新Spring Boot学习笔记,感兴趣的朋友可以关注我的博客:https://www.cnblogs.com ...

  6. NumPy——统计函数

    引入模块import numpy as np 1.numpy.sum(a, axis=None)/a.sum(axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组,不指定 ...

  7. MySQL占用CPU超过百分之100解决过程

    本文转载自: https://www.93bok.com 访问网页504 Gateway Time-out,登陆服务器查看,内存正常,CPU使用率达到了400%,因为是4核,所以到了400%,几乎全部 ...

  8. preload & prefetch

    原文地址在 我的笔记里,觉得还行就给个 star 吧:) 关于 preload 和 prefetch 早有耳闻,知道它们可以优化页面加载速度,然具体情况却了解不多.搜索了相关的资料后对其有了些认识,在 ...

  9. 一些大厂的css reset 代码

    不同的浏览器对标签的默认值不同,为了避免页面出现浏览器差异,所以要初始化样式表属性.使用通配符*并不可取,因为会遍历到每一个标签,大型网页会加载过慢,影响性能. 雅虎工程师提供的CSS初始化示例代码: ...

  10. .NET微服务从0到1:服务注册与发现(Consul)

    目录 Consul搭建 基于Docker搭建Consul 基于Windows搭建Consul ServiceA集成Consul做服务注册 Ocelot集成Consul做服务发现 更多参考 Consul ...