raft为什么是更易理解的分布式一致性算法——leader在时,由leader向follower同步日志leader挂掉了,选一个新leader,leader选举算法。

将者,智、信、仁、勇、严也。 将者,智、信、仁、勇、严也。     2022-08-22     709

关键词:

Raft 协议的易理解性描述

虽然 Raft 的论文比 Paxos 简单版论文还容易读了,但论文依然发散的比较多,相对冗长。读完后掩卷沉思觉得还是整理一下才会更牢靠,变成真正属于自己的。这里我就借助前面黑白棋落子里第一种极简思维来描述和概念验证下 Raft 协议的工作方式。

在一个由 Raft 协议组织的集群中有三类角色:

  1. Leader(领袖)
  2. Follower(群众)
  3. Candidate(候选人)

就像一个民主社会,领袖由民众投票选出。刚开始没有领袖,所有集群中的参与者都是群众,那么首先开启一轮大选,在大选期间所有群众都能参与竞选,这 时所有群众的角色就变成了候选人,民主投票选出领袖后就开始了这届领袖的任期,然后选举结束,所有除领袖的候选人又变回群众角色服从领袖领导。这里提到一 个概念「任期」,用术语 Term 表达。关于 Raft 协议的核心概念和术语就这么多而且和现实民主制度非常匹配,所以很容易理解。三类角色的变迁图如下,结合后面的选举过程来看很容易理解。

Leader 选举过程

在极简的思维下,一个最小的 Raft 民主集群需要三个参与者(如下图:A、B、C),这样才可能投出多数票。初始状态 ABC 都是 Follower,然后发起选举这时有三种可能情形发生。下图中前二种都能选出 Leader,第三种则表明本轮投票无效(Split Votes),每方都投给了自己,结果没有任何一方获得多数票。之后每个参与方随机休息一阵(Election Timeout)重新发起投票直到一方获得多数票。这里的关键就是随机 timeout,最先从 timeout 中恢复发起投票的一方向还在 timeout 中的另外两方请求投票,这时它们就只能投给对方了,很快达成一致。

选出 Leader 后,Leader 通过定期向所有 Follower 发送心跳信息维持其统治。若 Follower 一段时间未收到 Leader 的心跳则认为 Leader 可能已经挂了再次发起选主过程。

Leader 节点对一致性的影响

Raft 协议强依赖 Leader 节点的可用性来确保集群数据的一致性。数据的流向只能从 Leader 节点向 Follower 节点转移。当 Client 向集群 Leader 节点提交数据后,Leader 节点接收到的数据处于未提交状态(Uncommitted),接着 Leader 节点会并发向所有 Follower 节点复制数据并等待接收响应,确保至少集群中超过半数节点已接收到数据后再向 Client 确认数据已接收。一旦向 Client 发出数据接收 Ack 响应后,表明此时数据状态进入已提交(Committed),Leader 节点再向 Follower 节点发通知告知该数据状态已提交。

在这个过程中,主节点可能在任意阶段挂掉,看下 Raft 协议如何针对不同阶段保障数据一致性的。

1. 数据到达 Leader 节点前

这个阶段 Leader 挂掉不影响一致性,不多说。

2. 数据到达 Leader 节点,但未复制到 Follower 节点

这个阶段 Leader 挂掉,数据属于未提交状态,Client 不会收到 Ack 会认为超时失败可安全发起重试。Follower 节点上没有该数据,重新选主后 Client 重试重新提交可成功。原来的 Leader 节点恢复后作为 Follower 加入集群重新从当前任期的新 Leader 处同步数据,强制保持和 Leader 数据一致。

3. 数据到达 Leader 节点,成功复制到 Follower 所有节点,但还未向 Leader 响应接收

这个阶段 Leader 挂掉,虽然数据在 Follower 节点处于未提交状态(Uncommitted)但保持一致,重新选出 Leader 后可完成数据提交,此时 Client 由于不知到底提交成功没有,可重试提交。针对这种情况 Raft 要求 RPC 请求实现幂等性,也就是要实现内部去重机制。

4. 数据到达 Leader 节点,成功复制到 Follower 部分节点,但还未向 Leader 响应接收

这个阶段 Leader 挂掉,数据在 Follower 节点处于未提交状态(Uncommitted)且不一致,Raft 协议要求投票只能投给拥有最新数据的节点。所以拥有最新数据的节点会被选为 Leader 再强制同步数据到 Follower,数据不会丢失并最终一致。

5. 数据到达 Leader 节点,成功复制到 Follower 所有或多数节点,数据在 Leader 处于已提交状态,但在 Follower 处于未提交状态

这个阶段 Leader 挂掉,重新选出新 Leader 后的处理流程和阶段 3 一样。

6. 数据到达 Leader 节点,成功复制到 Follower 所有或多数节点,数据在所有节点都处于已提交状态,但还未响应 Client

这个阶段 Leader 挂掉,Cluster 内部数据其实已经是一致的,Client 重复重试基于幂等策略对一致性无影响。

7. 网络分区导致的脑裂情况,出现双 Leader

网络分区将原先的 Leader 节点和 Follower 节点分隔开,Follower 收不到 Leader 的心跳将发起选举产生新的 Leader。这时就产生了双 Leader,原先的 Leader 独自在一个区,向它提交数据不可能复制到多数节点所以永远提交不成功。向新的 Leader 提交数据可以提交成功,网络恢复后旧的 Leader 发现集群中有更新任期(Term)的新 Leader 则自动降级为 Follower 并从新 Leader 处同步数据达成集群数据一致。

综上穷举分析了最小集群(3 节点)面临的所有情况,可以看出 Raft 协议都能很好的应对一致性问题,并且很容易理解。

总结

算法以正确性、高效性、简洁性作为主要设计目标。
虽然这些都是很有价值的目标,但这些目标都不会达成直到开发者写出一个可用的实现。
所以我们相信可理解性同样重要。

深以为然,想想 Paxos 算法是 Leslie Lamport 在 1990 年就公开发表在了自己的网站上,想想我们是什么时候才听说的?什么时候才有一个可用的实现?而 Raft 算法是 2013 年发表的,大家在参考[5]上面可以看到有多少个不同语言开源的实现库了,这就是可理解性的重要性。

参考

[1]. LESLIE LAMPORT, ROBERT SHOSTAK, MARSHALL PEASE. The Byzantine General Problem. 1982
[2]. Leslie Lamport. The Part-Time Parliament. 1998
[3]. Leslie Lamport. Paxos Made Simple. 2001
[4]. Diego Ongaro and John Ousterhout. Raft Paper. 2013
[5]. Raft Website. The Raft Consensus Algorithm
[6]. Raft Demo. Raft Animate Demo

raft为什么是更易理解的分布式一致性算法——leader在时,由leader向follower同步日志leader挂掉了,选一个新leader,leader选举算法。

Raft协议的易理解性描述虽然Raft的论文比Paxos简单版论文还容易读了,但论文依然发散的比较多,相对冗长。读完后掩卷沉思觉得还是整理一下才会更牢靠,变成真正属于自己的。这里我就借助前面黑白棋落子里第一种极简思维... 查看详情

分布式一致性算法raft

Paxos自1990年提出以后,相当长时间内几乎已成为分布式一致性算法的代名词。但因其难以理解和实现,目前知名实现仅有Chubby、Zookeeper、libpaxos几种,其中Zookeeper使用的ZAB对Paxos做了大量改进。为此,2013年斯坦福的DiegoOngaro、JohnO... 查看详情

raft共识算法

...Paxos算法在实际应用实现的时候也是比较困难的。这也是为什么会有后来Raft算法的提出。2.概念Raft是实现分布式共识的一种算法,主要用来管理日志复制的一致性。它和Paxos的功能是一样,但是相比于Paxos,Raft算法更容易理解、... 查看详情

分布式一致性算法:raft算法

Raft算法是可以用来替代Paxos算法的分布式一致性算法,而且raft算法比Paxos算法更易懂且更容易实现。本文对raft论文进行翻译,希望能有助于读者更方便地理解raft的思想。如果对Paxos算法感兴趣,可以看我的另一篇文章:分布式... 查看详情

分布式共识算法——raft算法(图解)(代码片段)

...的完整性选民日志的一致性Raft算法Raft算法概念Raft是一种分布式一致性算法。Raft出现之前,Paxos一直是分布式一致性算法的标准。Paxos难以理解,更难以实现 查看详情

分布式共识算法——raft算法(图解)(代码片段)

...的完整性选民日志的一致性Raft算法Raft算法概念Raft是一种分布式一致性算法。Raft出现之前,Paxos一直是分布式一致性算法的标准。Paxos难以理解,更难以实现 查看详情

分布式一致性算法:raft算法(raft论文翻译)

...主Jeffbond,读了好几遍,翻译的质量比较高,原文链接:分布式一致性算法:Raft算法(Raft论文翻译),版权一切归原译者。同时,第6部分的集群成员变更读起来还不是很流畅,需要了解这一部分的童鞋可以找下其他的文章看一... 查看详情

分布式一致性算法raft

什么是分布式一致性?我们先来看一个例子:我们有一个单节点node,这个节点可以是数据库,也可以是一台服务器,当client向node发送data时,X节点收到data,记录下来由此可见对于单个节点,一致性是很容易实现的。然而对于多... 查看详情

raft算法

...在一些机器宕掉的情况下也可以继续运行。复制状态机在分布式系统中被用于解决很多容错的问题。Raft是一种为了管理复制日志的一致性算法。Raft一致性 查看详情

优化调度基于matlab一致性算法求解电力系统分布式经济调度优化问题含matlab源码770期(代码片段)

一、一致性算法简介1概述分布式中的一致性可以被描述为在协作解决问题的一组操作之间达成一致的行为。随着开源分布式计算和存储平台的兴起,一致性算法已成为复制的基本工具。其中Paxos和Raft是最受欢迎的一致性算法... 查看详情

day431.raft算法实现分布式系统一致性-谷粒商城(代码片段)

Raft算法实现分布式系统一致性下面的内容是描述演示动画,详细地址为:http://thesecretlivesofdata.com/raft/跳转一、简介我们来看一下Raft算法,它帮我们来理解我们这个分布式系统Consunsus,这个就是一致性。首先我们... 查看详情

分布式一致性协议raft

分布式领域,CP模型下数据一致性协议至关重要,不然两边数据不一致容易出现数据读混乱问题。像EtcdConsul zookeeperEureka,Redis集群方案这些中间件都有一致性算法来保证数据一致性像Redis集群数据同步采用gossip[可以查看本博客... 查看详情

分布式一致性算法--raft

   前面一篇文章讲了Paxos协议,这篇文章讲它的姊妹篇Raft协议,相对于Paxos协议,Raft协议更为简单,也更容易工程实现。有关Raft协议和工程实现可以参考这个链接https://raft.github.io/,里面包含了大量的论文,视屏已经... 查看详情

分布式_理论_06_一致性算法raft

一、前言    五、参考资料1.分布式理论(六)——Raft算法2.分布式理论(六)-一致性协议Raft  查看详情

分布式系统一致性算法raft学习

  在学习MongoDB的过程中,有博客中写道其搭建复制集时使用了raft算法,经过简单地的搜索资料后,发现了一个特别好的网站资料。这个网站用动画的形式,非常清楚和详尽的解释了整个raft算法的精要和过程,只看了一篇就大... 查看详情

raft

...这是第一篇:《解读Raft(一算法基础)》 什么是RAFT分布式系统除了提升整个体统的性能外还有一个重要特征就是提高系统的可靠性。提供可靠性可以理解为系统中一台或多台的机器故障不会使系统不可用(或者丢失数据)... 查看详情

一致性算法raft简易入门

...点共识的问题的,当存在多个不同服务节点时,才会引入分布式一致性的问题。Raft是一种实现分布式共识的协议。所谓共识,就是多个节点对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分割的情况下。... 查看详情

一文理解raft分布式一致性算法

一、Raf算法背景在学术理论界,分布式一致性算法的代表还是Paxos。但是少数理解的人觉得很简单,尚未理解的觉得很难,大多数人还是一知半解。Paxos的可理解性和工程落地性的门槛很高。斯坦福学者也花了很多时... 查看详情