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高可靠算法详解
背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...
随机推荐
- nginx&http 第三章 ngx http 框架处理流程
1. nginx 连接结构 ngx_connection_t 这个连接表示是客户端主动发起的.Nginx服务器被动接受的TCP连接,我们可以简单称其为被动连接.同时,在有些请求的处理过程中,Nginx ...
- Microsoft Visual C++ 2005 SP1无法安装
安装时出现需要Microsoft Visual C++ 2005 Redistributble对话框, 里面说Command line option syntax error . Type Comma ...
- WPF控件库总结
前言 在使用WPF项目的时候, 一般首要的就是对UI部分的选型, 而WPF相关的UI控件和样式库在Githu也是非常多. 关于UI的部分,可以分为二种: 对控件本身没有很大的需求, 只需要在原有的基础 ...
- 认识socketserver
1.服务端 # 如果socket起一个tcp服务,在同一个时间只能和一个客户端通信 # 如果socketserver起一个服务,在同一个时间就可以和多个客户端通信了 # socketserver # ...
- JavaScript监听页面可见性(焦点)同时改变title的三种方法
JavaScript监听页面可见性(焦点)同时改变title的三种方法 本文参考了https://developer.mozilla.org/zh-CN/docs/Web/API/Page_Visib ...
- git操作之三:git reset
在上篇文章中介绍了git restore命令,该命令的可以看作是撤销命令,文件在不同的状态下,使用git restore <file> 命令,会撤销对文件的修改,是文件回到修改前的状态也就 ...
- MySQL数据库 | MySQL调优|MySQL底层原理|MySQL零基础新手教程
MySQL数据库安装 一.Windows 环境下安装 A.下载 MySQL Select Operating System: Microsoft Windows 快捷下载:mysql-8.0.22-w ...
- powershell过杀软工具-xencrypt
在红队攻击中,绕杀软是一个比较常见的技术.对于绕过杀软的方法,有基于黑白名单的,有基于shellloader的,也有基于加密与混淆的.最近在发现了这样一款过杀软的工具,推荐给有缘人,嘻嘻 ...
- Appium上下文和H5测试(一)
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.混合应用-H5 1.混合应用是什么? 2.怎么样分辨一个 App 页面究竟是原生的还是 We ...
- C# Random类的正确应用
Random类介绍 Random类一个用于产生伪随机数字的类.这里的伪随机表示有随机性但是可以基于算法模拟出随机规律. Random类的构造方式有两种. Random r= new Random(). ...