`
san_yun
  • 浏览: 2654354 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Raft

    博客分类:
  • java
 
阅读更多

前言

上篇文章说解决问题要分而治之,先把分片的问题解决了再考虑多个副本的一致性问题。那么什么是一致性问题?

因为同一数据存在多个副本,在并发的众多客户端读/写请求下,如何维护数据一致性视图非常重要,即在存储系统外部使用者看起来即使是多个副本数据,其表现也和单份数据一样。

简单来说,要使多个副本的数据一致,需要通过某种一致性协议来对副本进行更新。如果不按照某种一致性协议进行更新,数据就可能会出现不一致的情况。

比方说,两个副本A,B,有两个客户端分别对A,B进行不同的更新,这样两个副本的数据显然就不一致了。假如有某一种协议,多个客户端对副本的更新,只能在一个副本上更新,然后这个副本把更新操作同步到其它副本,成功之后再返回给客户端,这样就有可能实现多个副本的一致性。今天要学习的Raft协议就是类似这样的一种一致性协议。

当然,数据的一致性也可以分为强一致性和弱一致性,Raft协议是一种强一致性协议。

Raft协议概述

Raft 是一种实现了分布式一致性的协议。假设我们有三个副本节点,来看一下Raft 协议如何工作:

节点状态

Raft 协议中的节点有三种状态:

  • Follower
  • Candidate
  • Leader

在下面的图形用,分别用无边框,虚线边框,实线边框表示这三种状态。

领导选举

在开始阶段,所有节点都处于Follower 状态,如下图所示:

初始阶段初始阶段

如果Follower 没有收到Leader 发过来的信息,则可变成Candidate:

成为Candidate成为Candidate

然后Candidate 向其它节点发送投票自己为Leader 的请求,如果得到了大多数节点的投票响应,则成为Leader:

成为Leader成为Leader

这个过程称为领导选举,选出Leader 之后,系统的所有变更操作都需要通过Leader 节点。

日志复制

假设某个客户端(绿色圈圈)对某个数据进行更新:

数据更新数据更新

所有的变更请求先发送到Leader 节点,每个变更操作都会作为一条日志记录保存在Leader 节点上。

目前日志记录处于未提交状态,所以节点的数据目前还没有更新。

要提交日记记录,首先得先把日志记录复制到其它Follower 节点:

日志复制日志复制

Leader 节点等待大多数节点已经完成日志复制的响应,然后才会把日志记录提交,Leader 节点的数据才会更新:

Leader 更新Leader 更新

然后Leader 节点通知Follower 节点日志记录已经提交,Follower 节点也进行提交,数据达到一致性状态。

Follower 更新Follower 更新

这个过程就称为日志复制。

领导选举

Raft 协议中有两个超时设置用于领导选举:

  • 选举超时:每个Follower 都会等待一个超时时间,然后就可以成为 Candidate,这个超时时间就称为选举超时。选举超时时间一般随即分配为150ms到300ms之间。

选举超时选举超时

如上图所示,节点C 将会先到达超时时间,成为Candidate 然后开始一个新的选举任期(election term) :

选举超时成为Candidate选举超时成为Candidate

如上图所示,成为Candidate 的节点会将自己的term 加1,然后给自己投票,再发送请求投票信息到其他节点:

发送投票请求发送投票请求

接收请求的节点在这个term 内如果还没有投票,则会将选票投给这个Candidate,然后重置自身的超时时间:

投票投票

一旦Candidate 收到了大多数的投票,那么它将成为Leader 。

成为Leader成为Leader

然后Leader 会发送Append Entries 消息给Follower,发送这个消息的时间间隔就是心跳超时(heartbeat timeout)。

  • 心跳超时: Leader 发送Append Entries信息的时间间隔。

发送Append Entries 消息发送Append Entries 消息

Followers 将会响应每一条Append Entries 消息,然后重置自身的超时时间:

响应Append Entries 消息响应Append Entries 消息

这个选举任期将会持续到一个Follower没有收到Leader 的心跳信息,然后成为Candidate。也就是说,Leader 会在任期期间不断发送心跳信息来重置其他的Follower的超时时间,让他们没有机会成为Candidate。只有当Leader 挂掉了,其他Follower 才有机会成为Candidate 进行新的选举。所以Raft 协议正是用选举超时心跳超时

我们来看一下Leader 挂了,然后开始一个新的选举:

Leader 挂了Leader 挂了

上图中,当Leader 挂掉之后,剩余的两个Follower 将会等待超时然后成为Candidate。由上面的超时时间可以看出,A 节点将会先超时,然后成为Candidate 将自己的term 加1,然后给自己投票,再发送请求投票信息到其他节点。当收到节点B 的投票请求之后成为新的Leader :

新的Leader新的Leader

需要得到大多数节点的投票才能成为Leader 保证了每个任期只有一个节点能成为Leader 。如果两个节点同时成为Candidate ,那么他们可能会得到一样多的投票,这种情况下将继续等待下一个超时,然后重新发起投票,直到选出一个Leader 为止。

日志复制

当选举出了新的Leader 之后,需要将系统中的所有变化复制到其他节点。这跟发送心跳信息的方式一样,也是通过发送Append Entries消息来完成这一动作,只是心跳信息中没有日志信息。我们来看一下这个过程:

首先,客户端发送更新操作到Leader 节点:

变更操作变更操作

变更会先被追加到Leader 节点的日志,然后在发送下一个心跳信息的时候将变更信息发送到Follower :

发送变更信息发送变更信息

当大多数Follower 确认这个信息,那么该变更日志将会被提交,然后Leader 将会响应给客户端:

确认变更提交确认变更提交

然后Leader 节点会在下一个心跳信息时通知Follower 节点日志记录已经提交,Follower 节点也进行提交,数据达到一致性状态。

网络分区

Raft 在面对网络分区的时候也能保持一致性。

初始状态初始状态

假设A,B节点与C,D,E 节点形成了网络分区。C,D,E节点由于收不到原Leader B的心跳信息,那么他们之间将会选举出一个新的Leader ,但是这个Leader 的term 跟原来Leader B 的 term不一样,这时就会存在两个不同term 的Leader:

两个Leader两个Leader

现在,假设有两个客户端同时更新不同的Leader,客户端1将更新请求发送到Leader B 将某个值设置为3,Leader B 不能复制到大多数的节点(因为只有1个Follower节点),所以这个更新日志是处于未提交状态。

客户端1更新客户端1更新

客户端2将某个值设置为8,因为它将会得到大多数节点的响应,所以这个更新操作能够成功:

客户端2更新客户端2更新

现在,假设网络分区问题已经修复,这时节点B 会收到比他更高任期(term) 的信息,然后就会变成Follower:

网络分区修复网络分区修复

节点A和B 未提交的日志记录将会被回滚然后匹配新Leader 的日志:

回滚匹配回滚匹配

现在,日志在集群中达成一致性。

总结

本文只是介绍了Raft 协议的大致流程,并没有关注很多细节问题。主要从领导选举和日志复制两个方面分析了Raft 协议的工作过程,领导选举重点是要了解两个超时时间,日志复制是Master-Slave模式,后续的日志一致性维护由领导者来完成。

分享到:
评论

相关推荐

    raft算法,英文原版论文

    raft算法,原版论文,英文版 摘要 Raft 是一种用来管理日志复制的一致性算法。它和 Paxos 的性能和功能是一样的,但是它和 Paxos 的结构不一样;这使得 Raft 更容易理解并且更易于建立实际的系统。为了提高理解性,...

    repo:princeton-vl/RAFT demos文件

    【标题】"princeton-vl/RAFT demos文件" 涉及的是一个开源项目,该项目主要关注计算机视觉领域中的光流估计技术。光流是图像序列中像素在时间和空间上的运动轨迹,它在视频处理、自动驾驶、虚拟现实等多个领域有着...

    Raft论文解析中文版

    "Raft论文解析中文版" 下面是Raft论文的详细解析: Raft共识算法 Raft是一种新的共识算法,旨在解决分布式一致性问题。它的设计目标是易于理解和正确实现的。Raft的核心思想是选举出一台机器作为Leader,然后让...

    Raft是一种共识算法,java 程序例子

    《深入理解Raft共识算法:基于Java实现的实例解析》 在分布式系统中,一致性是至关重要的,而Raft共识算法就是为了解决这一问题而诞生的。Raft是一种易于理解且可证明安全的分布式一致性算法,它由Ousterhout等人在...

    Raft - 基于共识的分布式数据库协同算法及其在 Neo4j 集群中的实现.pdf

    Raft分布式数据库协同算法在Neo4j集群中的实现 Raft是一种基于共识的分布式数据库协同算法,用于解决分布式系统中的Leader选举、日志复制、故障恢复等问题。Raft算法在Neo4j集群中的实现,使得Neo4j能够提供高可用...

    Raft一致性协义手写Demo

    ** Raft一致性协议详解 ** Raft 是一种分布式系统中用于保持集群节点间状态一致性的算法,由 Stanford University 的 Diego Ongaro 和 John Ousterhout 在 2013 年提出。它旨在简化 Paxos 算法,使其更易理解、实现...

    Raft 一致性算法论文译文

    ### Raft 一致性算法知识点详解 #### 一、引言 一致性算法是分布式计算领域中的关键技术之一,旨在确保分布式系统中的多个节点能够达成一致的状态,即使在某些节点出现故障的情况下亦能正常运行。传统的Paxos算法...

    Raft论文中文翻译版

    Paxos和Raft都是这样的共识算法,但它们的设计理念和实现方式有所不同。本文主要关注的是Raft算法,一个相对较新的共识协议,旨在解决Paxos的可理解性问题并提供额外的安全性与特性。 ### 1. Paxos简介 Paxos是由...

    Raft implementation for Java.zip

    《深入解析Java实现的Raft一致性算法》 在分布式系统领域,一致性算法是核心话题之一,其中Raft算法因其简洁性和易理解性受到广泛关注。本文将深入探讨Java环境下实现Raft算法的关键点,并通过分析"raft-java-...

    raft一致性算法英文原版论文

    Raft 是用来管理复制日志(replicated log)的一致性协议。它跟 multi-Paxos 作用相同,效率也相当,但是它的组织结构跟 Paxos 不同。这使得 Raft 比 Paxos 更容易理解并且更容易在工程实践中实现。为了使 Raft 协议...

    分布式系统的Raft算法.docx

    ### 分布式系统的Raft算法详解 #### 一、引言 在分布式系统领域,确保节点之间能够就某个状态达成一致是一项极其重要的任务。传统的Paxos算法虽然理论上完善,但在实际应用中却存在理解难度高、实现复杂等问题。...

    raft算法简单实现-java

    RAFT算法是一种分布式一致性协议,主要用于在集群中复制日志,确保数据的一致性。与PAXOS算法相比,RAFT算法以其简洁性和可理解性而受到欢迎。在JAVA中实现RAFT算法,可以为分布式系统提供可靠的领导者选举和状态机...

    基于Raft分布式一致性协议实现的局限及其对数据库的风险.docx

    《基于Raft分布式一致性协议实现的局限及其对数据库的风险》 分布式一致性协议在现代互联网行业中扮演着至关重要的角色,它们保证了在服务器集群中数据的一致性和高可用性。Raft协议,由Diego Ongaro在其博士论文中...

    苯乙烯的RAFT乳液聚合

    苯乙烯的RAFT乳液聚合技术是一种先进的聚合技术,具有以下几个关键知识点: 1. RAFT乳液聚合的定义与原理:RAFT(Reversible Addition-Fragmentation Chain Transfer,可逆加成-断裂链转移)聚合是一种活性自由基...

    raft分布式共识算法的Rust实现_rust_代码_下载

    **raft分布式共识算法** Raft 是一种为分布式系统设计的简单而可理解的共识算法,由 Ongaro 和 Ousterhout 在 2014 年提出的。它旨在成为 Paxos 算法的替代品,通过提供更清晰的设计和更易理解的逻辑,使得开发人员...

    图解分布式系统raft协议-完整版

    Raft协议是一种用于管理分布式系统中复制日志的共识算法,它设计上易于理解,且在实践中也非常可靠。Raft协议主要包含以下几个关键部分:Leader选举(Leader Election)、日志复制(Log Replication)、网络分区处理...

    Raft专用Mod启动器《RMLLauncher》

    用于加载steam游戏raft木筏求生mod启动器。 本启动器包含mod下载网站! 启动器官网在国外,正常下载会很缓慢,需要的自取。

    raft一致性算法中文版

    但是,从这些乱码中可以推断出,这些内容来自关于Raft一致性算法的文档。因此,尽管无法提供具体段落的内容解读,但可以提供Raft一致性算法的相关知识点。 Raft算法是一种用于实现分布式系统中各副本节点之间数据...

    raft一致性协议论文中文版

    Raft一致性协议是分布式系统设计领域的一项重要成果,它由Diego Ongaro和John Ousterhout提出,并且在设计时特别强调了易理解和实现的特性。Raft算法的目的在于提供一种比现有的Paxos算法更易于学习和实现的一致性...

    基于Raft协议的两节点主备系统调度算法.docx

    《基于Raft协议的两节点主备系统调度算法》 在现代工业系统,特别是城市轨道交通列车指挥调度系统中,为了保证服务的连续性和可靠性,通常会在指挥调度中心之外的各个运营现场设置服务节点。然而,为了降低成本,...

Global site tag (gtag.js) - Google Analytics