Raft

1. 概述

Raft是一种一致性(共识)算法,相比Paxos,Raft更容易理解和实现,它将分布式一致性问题分解成多个子问题,Leader选举(Leader election)、日志复制(Log replication)、安全性(Safety)、日志压缩(Log compaction)等。

1.1 角色

Raft中的角色分为:

  • Leader接受客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后告诉Follower提交日志。
  • Follower:接受并持久化Leader同步的日志,在Leader告之日志可以提交之后,提交日志。
  • Candidate:Leader选举过程中的临时角色,即候选人。

Raft要求系统在任意时刻最多只有一个Leader,正常工作期间只有Leader和Followers。Raft算法将时间分为一个个的任期(term),每一个term的开始都是Leader选举。在成功选举Leader之后,Leader会在整个term内管理整个集群。如果Leader选举失败,该term就会因为没有Leader而结束。

1.2 任期

Raft算法将时间分为任意不同长度的任期(Term),用连续递增的数字来表示。每个任期都开始于选举(election),一个或者多个Candidate(候选人)会试图成为领导者。如果一个候选人在该轮选举获得了大多数投票(N/2 + 1),则将成为该任期的领导者。在某些情况下,选票可能会被瓜分,则该轮可能没选出领导者,那么将会开始另一个任期,并进行下一次选举。Raft算法保证在任意一个任期内,最多只有一个领导者

1.3 RPC

Raft算法中每个服务器使用RPC(远程过程调用)进行通信,分为以下三种。

  • RequestVote RPC:候选人在选举期间发起。
  • AppendEntries RPC:领导人发起的一种心跳机制,复制日志也在该命令中完成。
  • InstallSnapshot RPC: 领导者使用该RPC来发送快照给太落后的追随者。

2. 选举

2.1 概述

当服务启动时,每个角色初始化为follower,如果follower没有接收到来自leader的heartbeat(心跳),则将成为候选者。候选人向其他节点发送投票请求,其他节点则进行答复。当候选人获得大多数投票时,将成为领导者。这个过程就叫做Leader Election。


请求投票

得到大多数投票,成为leader。

每一个follower都有一个时钟,是一个随机的值表示的是follower等待成为candidate的时间,谁的时钟先跑完,则发起leader选举。

Follower将其当前term加一然后转换为Candidate。它首先给自己投票并且给集群中的其他服务器发送 RequestVote RPC。结果有以下三种情况:

  • 赢得了多数的选票,成功选举为Leader;
  • 收到了Leader的消息,表示有其它服务器已经抢先当选了Leader;
  • 没有服务器赢得多数的选票,Leader选举失败,等待选举时间超时后发起下一次选举。

2.2 超时时间

Raft算法中有两个超时时间,分别为选举超时(election timeout)和心跳超时(heartbeat timeout)。

选举超时为follower一直等待直到变为candidate的总时间,此时间是随机的,150ms~300ms,当时间走完,则follower变为candidate,进行新一轮term的选举。

首先给自己投票并且给集群中的其他服务器发送 RequestVote RPC。如果接收到请求的node在本任期内还没投票,则该node将给候选人投上一票,同时该node重置自己的election timeout。当候选人得到大多数投票时,他将成为领导者。leader将开始发送Append Entry给follower,这些消息按心跳超时指定的时间间隔发送。

follower会对这些信息进行response,即follower每接收到一条Append Entry,会进行一次response,如此循环。当任意一个follower停止接收到心跳并成为候选人时,该任期结束。

2.3 Splite Vote

两个node在同一个任期内发起选举,且获得同数量的投票,此时无法选举出新的leader,那么node将重新等待新一轮的选举到来,由于选举超时是随机的,所以两个node再次同时发起选举的几率就比较低,只有一个node成为新的leader。

3. 日志复制

客户端与leader进行通信,客户端得请求到达leader后,leader生成日志记录(log entry),但此时log还未提交,故值未更改。

leader则尝试发起AppendEntries rpc请求给follower,让他们复制这条日志,则leader将一直等待,直到大部分follower复制了这条日志。这时候,这条日志被提交,值被更改。然后leader再通知follower,这条日志已经被提交,现在整个集群得状态是一致的。

3.1如何处理网络分区

如果发生了网络分区,此时系统会有两个leader,分别为任期1的Node B和任期3的Node E。此时如果有两个客户端,分别连上两个leader。node E能提交,因为能达到大多数请求的回复。由于B无法达到大多数请求的回复,故客户端的SET 3命令是未提交的。

然后网络恢复,则node A和B将回滚未提交的日志,与新的leader进行匹配。最终系统将一致。

Raft概述的更多相关文章

  1. 一致性算法RAFT详解

    原帖地址:http://www.solinx.co/archives/415?utm_source=tuicool&utm_medium=referral一致性算法Raft详解背景 熟悉或了解 ...

  2. 分布式一致性协议之:Raft算法

    一致性算法Raft详解 背景 熟悉或了解分布性系统的开发者都知道一致性算法的重要性,Paxos一致性算法从90年提出到现在已经有二十几年了,而Paxos流程太过于繁杂实现起来也比较复杂,可能也是以为过 ...

  3. Raft算法详解

    一致性算法Raft详解 背景 熟悉或了解分布性系统的开发者都知道一致性算法的重要性,Paxos一致性算法从90年提出到现在已经有二十几年了,而Paxos流程太过于繁杂实现起来也比较复杂,可能也是以为过 ...

  4. 用动图讲解分布式 Raft

    一.Raft 概述 Raft 算法是分布式系统开发首选的共识算法.比如现在流行 Etcd.Consul. 如果掌握了这个算法,就可以较容易地处理绝大部分场景的容错和一致性需求.比如分布式配置系统.分布 ...

  5. 谈谈Raft

    本文主要参考 极客时间-etcd 实战课 GitChat-分布式锁的最佳实践之:基于 Etcd 的分布式锁 谈到分布式协调组件,我们第一个想到的应该是大名鼎鼎的Zookeeper,像我们常用的Kafk ...

  6. SQL Server 外键约束的例子

    外键约束的测试表与测试数据 -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id INT, value ), PRIMARY KEY(id) ); -- 创建测 ...

  7. Raft论文概述

    介绍 Raft是一种为了管理复制日志的一致性算法.为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如领导人选举.日志复制和安全性.同时它通过实施一个更强的一致性来减少需要考虑的状态的数 ...

  8. Raft算法,从学习到忘记

    Raft算法,从学习到忘记 --Raft算法阅读笔记. --Github 概述 说到分布式一致性算法,可能大多数人的第一反应是paxos算法.但是paxos算法一直以来都被认为是难以理解,难以实现.S ...

  9. 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解

    背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...

随机推荐

  1. JXLS2.4导出Excel

    1.添加依赖:http://mvnrepository.com/artifact/org.jxls <dependency>     <groupId>org.jxls< ...

  2. vue 常见记录

    # vuex在组件中如何获取vuex的state对象中的属性 https://blog.csdn.net/gavincz/article/details/81049461 # vuex全局变量使用 h ...

  3. DocView 现在支持自定义 Markdown 模版了!

    前言 有小伙伴反馈说希望可以自定义 Markdown 模版,这样就可以导出自己想要的样式了!这个功能可以有,毕竟大家不可能都生成一模一样的文档.现在来一起看看如何实现自定义模版吧! 设置模版 Sett ...

  4. 苹果电脑不安装flash的话怎么看直播

    直播这种娱乐方式的兴起,让很多游戏玩家.脱口秀演员.歌手等拥有了一个更加宽广的舞台,可以更好地展现自己的才能.大部分的直播都是采取视频影像的方式直播,只有少部分才会采用纯音频的方式. 由于很多直播网站 ...

  5. MindManager导出Word文档功能介绍

    Mindmanager思维导图软件作为一款能与Microsoft office软件无缝集成的思维导图软件,支持Word文档的快速导入与导出,并支持Word文档的目录生成.模板套用等,极大地方便了用户完 ...

  6. CleanMyMac X“断网激活”真的能激活软件吗?

    CleanMyMac X帮助Mac系统进行垃圾清理,清除多余的缓存.应用程序等,在提高工作效率上起了很大的作用.但是随着对软件的需求不断增加,很多人开始研究通过捷径破解正版软件,但是是否能成功呢?今天 ...

  7. mongodb查询前10条

    mongo可以通过时间或者通过id来判断上一条记录或者下一条记录,我是通过id 前10条 db.数据库名称.find({ '_id': { '$lt': ids } }).sort({_id: -1} ...

  8. 工作中用到的redis操作

    del exists 1.字符串 set,get 2.列表 lRange lRem lPush rPush 3.有序列表 zadd zrem zscore 4.hash hset hget hdel

  9. 从递归到memo到动态规划

    //memo,记忆化搜索 class Solution {    int[][] memo;    public boolean wordBreak(String s, List<String& ...

  10. PHP 获取本周、今日、本月的起始时间戳

    当前周的开始时间(周一)$begintime = mktime(0, 0, 0, date('m'), (date('d') - (date('w')>0 ? date('w') : 7) + ...