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. java里split(" {1,}")什么意思啊?

    将字符串按照括号内的内容分割成字符数组这里括号内是正则表达式,X{m,n}代表X至少重复m次,至多重复n次这里空格至少重复1次,就是将字符串以一个或多个空格分割如"1 2 ab c" ...

  2. nginx&http 第三章 ngx http ngx_http_process_request_headers

    HTTP 请求行正确处理完成后,针对 HTTP/1.0 及以上版本紧接着要做的就是请求 HEADER 的处理与解析了 /** * 用于处理http的header数据 * 请求头: * Host: lo ...

  3. prometheus函数介绍

    一 函数介绍 gauge类型的数据  属于随机变化数值,并不像counter那样 是 持续增长 1 increase() increase 函数 在promethes中,是⽤来 针对Counter 这 ...

  4. yum安装指定版本ceph包

    安装ceph包的方式有很多,这里讲的是从官网直接通过yum源的安装方式进行安装 yum源对应的地址为 http://download.ceph.com/rpm-hammer/el6/x86_64/ 怎 ...

  5. spring cloud gateway 启动报错,Failed to bind on [0.0.0.0:xxx] bind(..) failed: 权限不够

    最近把操作系统迁移到了deepin,不得不说Linux中需要学习的还是有很多的,本地启动网关的时候就遇到一个坑,特此记录一下,报错信息. Caused by: reactor.netty.Channe ...

  6. 学会网页制作,web app开发,必须先从语法基础开始学习

    做软件开发,是从事编程开发工作,必须先从语法基础开始学习,通过语法组成产品效果.      前端开发的基础语法,由HTML+CSS+JavaScript组成,这是前端开发最基本的3个语言.       ...

  7. [原题复现+审计][BJDCTF2020]Mark loves cat($$导致的变量覆盖问题)

    简介  原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January  考察知识点:$$导致的变量覆盖问题  线上平台:https://buuoj.cn( ...

  8. zabbix的搭建及操作(3)监控 MySQL 及 HTTP 状态监控

    书接上回 -- 详情点击 Server端以配置好 mariadb(MySQL) 及 http 服务 Zabbix实现监控 mysql 数据库 server服务器端配置 vim /usr/local/z ...

  9. 思维导图iMindMap可以在哪些领域应用

    生活工作中你常常会遇到许多力所不能及的事情,感到无奈.茫然,这时候你急需一个帮手来帮你打破困境,思维导图就是这样的救世主,至于它有哪些力所能及的事情就是下面小编要跟你讲的. 你是否经常遇到过这样的情况 ...

  10. mac下让iterm2记住远程ssh连接

    brew安装sshpass brew install http://git.io/sshpass.rb 在根目录下建立passowrd目录用来管理密码,vim testserver 输入明文密码,保存 ...