Raft概述
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概述的更多相关文章
- 一致性算法RAFT详解
原帖地址:http://www.solinx.co/archives/415?utm_source=tuicool&utm_medium=referral一致性算法Raft详解背景 熟悉或了解 ...
- 分布式一致性协议之:Raft算法
一致性算法Raft详解 背景 熟悉或了解分布性系统的开发者都知道一致性算法的重要性,Paxos一致性算法从90年提出到现在已经有二十几年了,而Paxos流程太过于繁杂实现起来也比较复杂,可能也是以为过 ...
- Raft算法详解
一致性算法Raft详解 背景 熟悉或了解分布性系统的开发者都知道一致性算法的重要性,Paxos一致性算法从90年提出到现在已经有二十几年了,而Paxos流程太过于繁杂实现起来也比较复杂,可能也是以为过 ...
- 用动图讲解分布式 Raft
一.Raft 概述 Raft 算法是分布式系统开发首选的共识算法.比如现在流行 Etcd.Consul. 如果掌握了这个算法,就可以较容易地处理绝大部分场景的容错和一致性需求.比如分布式配置系统.分布 ...
- 谈谈Raft
本文主要参考 极客时间-etcd 实战课 GitChat-分布式锁的最佳实践之:基于 Etcd 的分布式锁 谈到分布式协调组件,我们第一个想到的应该是大名鼎鼎的Zookeeper,像我们常用的Kafk ...
- SQL Server 外键约束的例子
外键约束的测试表与测试数据 -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id INT, value ), PRIMARY KEY(id) ); -- 创建测 ...
- Raft论文概述
介绍 Raft是一种为了管理复制日志的一致性算法.为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如领导人选举.日志复制和安全性.同时它通过实施一个更强的一致性来减少需要考虑的状态的数 ...
- Raft算法,从学习到忘记
Raft算法,从学习到忘记 --Raft算法阅读笔记. --Github 概述 说到分布式一致性算法,可能大多数人的第一反应是paxos算法.但是paxos算法一直以来都被认为是难以理解,难以实现.S ...
- 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解
背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...
随机推荐
- [MIT6.006] 12. Square Roots, Newton's Method 平方根,牛顿法
首先让我们回顾下上节课讲的,用牛顿法计算√2的内容: 简单来说,牛顿法从x0=1不断向后计算逼近√2的值,而刚开始计算的精度是1,随着牛顿法的逼近(共log2d个循环),就能使得√2逼近值的精度达到d ...
- CSP-S 2020 Travels
CSP-S 2020 Travels DAY 0 I hit the board in the morning before departure The rest of the time is dec ...
- c++11-17 模板核心知识(五)—— 理解模板参数推导规则
Case 1 : ParamType是一个指针或者引用,但不是universal reference T& const T& T* Case 2 : ParamType是Univers ...
- SQL SERVER数据库内 FOR XML PATH 函数用法
把自己点点滴滴的学习记录下来!!!! 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(TBJTXXCE)用来存放就诊患者信息,表结构 ...
- 有关String的那点事
(1)String str1 = "abc"; System.out.println(str1 == "abc"); 步骤: 1) 栈中开辟一块空间存放引用st ...
- Android10_原理机制系列_Binder机制
前言 Binder 从java到c++到kernel,涉及的内容很多,很难在一篇文章中说清楚.这篇主要是自我记录,方便后续查询并拆分总结的. 因为涉及的的确非常多,不能面面俱到,所以可能一些地方感觉比 ...
- 企业级工作流解决方案(十五)--集成Abp和ng-alain--Abp其他改造
配置功能增强 Abp定义了各种配置接口,但是没有定义这些配置数据从哪里来,但是管理配置数据对于一个应用程序来说,是必不可少的一件事情. .net的配置数据管理,一般放在Web.config文件或者Ap ...
- 回收站都找不到的文件,EasyRecovery帮你找
"有人相爱,有人看海,有人深夜两点还在找文件."没错,有人正是不才本人. 细数下来,这已经是本人第五六七八次丢文件了,每次丢的原因很奇怪:删错了.保存完找不到了.或者没有原因就那样 ...
- 用OCR文字识别工具来审阅和处理PDF内容
"工作的时候要同时打开好几个软件真的是太不方便了."很多公司白领都有这样的困扰.他们抱怨着进行文字识别过后又要打开文档编辑器来进行编辑.PDF是办公文档常用的格式, ABBYY F ...
- jmeter接口测试多数据组合登陆场景
一.安装好Java运行环境 百度下载JDK并且配置JAVA环境的教程一搜一大把,这里我就不详说了 二.运行JMETER 打开安装目录的bin文件中的jmeter.bat文件 三.添加程序 1.添加线程 ...