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. 快速增加osdmap的epoch

    最近因为一个实验需要用到一个功能,需要快速的增加 ceph 的 osdmap 的 epoch 编号 查询osd的epoch编号 root@lab8107:~# ceph osd stat osdmap ...

  2. MySQL_where和having的区别

    1. where和having都可以使用的场景 select goods_price,goods_name from sw_goods where goods_price > 100 selec ...

  3. 推荐一个学习SQL Server基本语法及其他编程的网站

    菜鸟们的练习场 1.领先的 Web 技术教程 在 w3school,你可以找到你所需要的所有的网站建设教程. 从基础的 HTML 到 CSS,乃至进阶的XML.SQL.JS.PHP 和 ASP.NET ...

  4. python sklearn库实现逻辑回归的实例代码

    Sklearn简介 Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression).降维(Dimensionality Red ...

  5. 顺序结构(C语言基本结构)

    顺序结构 1.基本概念 语句执行的顺序与顺序程序书写的顺序一致 特点 a.程序执行的顺序和语句书写的顺序一致 b.有一个数据入口,一个数据出口 顺序结构与四则运算 顺序结构是C语言的基本结构 程序由上 ...

  6. 五. Webpack详解

    1. 什么是Webpack 1.1 引入 什么是webpack?这个webpack还真不是一两句话可以说清楚的. 我们先看看官方的解释:At its core, webpack is a static ...

  7. chrome浏览器查看当前页面cookie

    方法一:点进去设置--高级--网站设置--权限cookie--查找所有cookie和网站数据,就可以看到所有的cookie信息了,举例: 方法二:键盘F12,找到network--点击Doc(如果没有 ...

  8. bootstrap 按钮颜色属性

    bootstrap 按钮颜色属性有几种

  9. Beta冲刺随笔——Day_Eight

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...

  10. Beta冲刺随笔——Day_Four

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...