分布式共识算法 —— Raft详解

2023-05-16

文章目录

  • 分布式共识算法
    • 顺序一致性
    • 线性一致性
    • 因果一致性
  • Raft 算法
    • 原理概览
    • 选举机制
      • 新节点加入
      • leader 掉线处理
      • 多个 follower 同时掉线
    • 日志复制
  • 参考文献

分布式共识算法

首先我们先明确这个问题:为什么需要分布式共识算法?

这就要从当前的分布式系统设计的缺陷来看了,假设我们的集群现在有两个客户端和三个服务端,如下图:
在这里插入图片描述
在这个分布式系统的设计中,往往要满足CAP理论,而分布式共识算法解决的就是CAP理论中的一致性问题。整个一致性问题分为三种问题:

  • 顺序一致性
  • 线性一致性
  • 因果一致性

顺序一致性

顺序一致性是1979年Lamport 在论文《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs 》中提出::假设执行结果与这些处理器以某一串行顺序执行的结果相同,同时每个处理器内部操作的执行看起来又与程序描述的顺序一致。满足该条件的多处理器系统我们就认为是顺序一致的。实际上,处理器可以看做一个进程或者一个线程,甚至是一个分布式系统。

这句话并不是很好理解,我们看一下分布式系统中顺序一致性的一个例子:
假设客户端A有两条命令:

command1:set(x,1)	//设置x为1
command2:set(x,3)

客户端B有一下两条命令:

command3:get(x)		//得到x的当前值
command4:set(x,4)

那么如果服务端那边收到的节点只要满足command2在command1后面执行并且comand4在command3后面执行我们就认为其满足顺序一致性。
在这里插入图片描述

线性一致性

线性一致性或称原子一致性或严格一致性,指的是程序在执行顺序组合中存在可线性化点P的执行模型,这意味着一个操作将在程序的调用和返回之间的某个点P生效,之后被系统中并发运行的所有其他线程所感知。线性一致性概念是1990年 Maurice Herlihy · Jeannette M Wing 在论文《Linearizability: A Correctness Condition for Concurrent Objects》中提出。

通俗来讲,线性一致性可以说是顺序一致性的升级版。其会有一个全局时钟,假设还是上面发送的命令,只不过加上了时间信息:
客户端A发送的命令如下:

[14:01]command1:set(x,1)	//设置x为1
[14:02]command2:set(x,3)

客户端B发送的命令如下:

[14:03]command3:get(x)		//得到x的当前值
[14:04]command4:set(x,4)


这里假设时延可能是几分钟级别的,所以有可能是command3在command1之前到

所以,假设初始值x = 0,而我们到达的顺序如下:

command1->command3->command2->command4
command1->command3->command4->command2
...

这个顺序确实是满足顺序一致性,但是我们get(x)获得的值可谓是千奇百怪,可能是0,1,3 。为了解决顺序一致性的不足,所以才提出的线性一致性。其要求命令满足全局时钟的时序性。所以很容易就知道,满足线性一致性的一定满足顺序一致性;相反,满足顺序一致性的不一定会满足线性一致性。
在这里插入图片描述

因果一致性

线性一致性要求所有线程的操作按照一个绝对的时钟顺序执行,这意味着线性一致性是限制并发的,否则这种顺序性就无法保证。由于在真实环境中很难保证绝对时钟同步,因此线性一致性是一种理论。实现线性一致性的代价也最高,但是实战中可以弱化部分线性一致性:只保证有因果关系的事件的顺序,没有因果关系的事件可以并发执行,其指的是假设有两个事件:A事件和B事件,如果A发生在B后面,那么就称A和B具有因果关系。

Raft 算法

Paxos和Raft这些分布式共识算法就是用来多个节点之间达成共识的,其可以解决一定的一致性问题。其中Paxos难以理解,所以这篇博客以介绍Raft算法为主。

Raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。遵从此协议的分布式集群会对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分割的情况下。

原理概览

遵循Raft算法的分布式集群中每个节点扮演以下三种角色之一:

  • leader:领导者,其负责和客户端通信,接收来自客户端的命令并将其转发给follower
  • follower:跟随者,其一丝不苟的执行来自leader的命令
  • candidate:候选者,当follower长时间没收到 leader的消息就会揭竿而起成为候选者,抢夺成为leader的资格

从上面的描述我们可以看到节点的角色不是固定的,其会在三个角色中转换。我们举个例子来说,假设我们有三个节点A、B、C,它们的基本信息如下图中。一开始所有的节点都是follower状态,并且处于时期0这个状态。
在这里插入图片描述


在Raft算法中,所有节点会被分配不同的超时时间,时间限定在150ms~300ms之间。为什么这么设置是因为如果设置相同的超时时间就会导致所有节点同时过期会导致迟迟选不出leader,看到后面就会明白。

150ms过去之后,A发现怎么leader没跟我联络联络感情,是不是leader已经寄了?王侯将相宁有种乎!于是A成为候选人给自己投了一票并开创自己的时代时期 1,并给其他还没过期的follower发送信息请求它们支持自己当leader。

在这里插入图片描述

节点B和C在收到来自A的消息之后,又没有收到其他要求称王者的信息,于是就选择支持A节点,加入A的时代并刷新自己的剩余时间。
在这里插入图片描述
之后 A 得到了超过一半的节点支持,成为leader,并定时给B和C联络联络感情(心跳信息)目的是防止有节点因为长时间收不到开始反叛成candidate。
在这里插入图片描述
之后整个分布式集群就可以和客户端开始通信了,客户端会发送消息给leader,之后leader会保证集群的一致性并且当整个集群中的一半节点都完成客户端发送的命令之后才会真正的返回给客户端,表示完成此次命令。

在这里插入图片描述
但是这只是个概况,我们还缺了亿点点细节:

  • 选举机制
  • 日志复制

选举机制

刚刚我们讲了最普通的一个选举过程,但是我们可能还会遇到一些特殊情况:

  • 新加入节点
  • leader 掉线
  • 多个follower同时超时

新节点加入

当有一个节点加入当前的分布式集群的时候,leader会检测并发现它并给他发送消息。使其加入此分布式集群。
在这里插入图片描述

leader 掉线处理

假设我们现在的服务器A掉线,由于没有leader维持心跳消息,这个时候服务器B和C会进入超时倒计时的状态。
在这里插入图片描述
200ms过去,服务器B开始超时了,这个时候它揭竿而起成为candidate,并向节点C发送消息请求其支持自己成为leader。
在这里插入图片描述
之后,在一系列判断条件之后(后面会讲),节点C会回复节点B的请求信息。插句题外话哈,在B还没收到C的回复消息之前,假设A只是刚刚网络不通畅,现在死而复生,给B发送消息了。那么B发现A的时期比自己落后了,这还等什么?!苍天已死,黄天当立,之后反手将其收为小弟。
在这里插入图片描述
之后节点B顺利成为leader。
在这里插入图片描述

多个 follower 同时掉线

现在假设有4个节点:A、B、C、D。其中A和D的超时时间是相同的。

在这里插入图片描述
150ms过后,A和D同时成为candidate,争相为了成为leader给B和C发消息。
在这里插入图片描述

这个时候有对于B和C有两个选择,一个是它们一起支持两个中的一次,也就是要么支持A要么支持D,这样这样其中一个就会成为leader,我们假设它们两个都支持A。
在这里插入图片描述
另外一种选择就是,A和D各的一票支持,它们的支持者跟进它们各自的leader的时期,然后本轮选举结束。
在这里插入图片描述

之后50ms过去之后,B的超时时间过期了,其获得candiate的资格,这个时候其会向其他follower发送消息请求支持。
在这里插入图片描述

之后A、B、D 因为当前的B也没有支持者,所以就会支持B,B顺利成为leader。
在这里插入图片描述

日志复制

当我们的集群leader 选举之后。Leader 接收所有客户端请求,然后转化为 log 复制命令,发送通知其他节点完成日志复制请求。每个日志复制请求包括状态机命令 & 任期号,同时还有前一个日志的任期号和日志索引。状态机命令表示客户端请求的数据操作指令,任期号表示 leader 的当前任期,任期也就是上图中的时期。

而当follower 收到日志复制命令会执行处理流程:

  1. follower 会使用前一个日志的任期号和日志索引来对比自己的数据:

    1. 如果相同,接收复制请求,回复 ok;
    2. 否则回拒绝复制当前日志,回复 error;
  2. leader 收到拒绝复制的回复后,继续发送节点日志复制请求,不过这次会带上更前面的一个日志任期号和索引;

  3. 如此循环往复,直到找到一个共同的任期号&日志索引。此时 follower 从这个索引值开始复制,最终和 leader 节点日志保持一致;
    在这里插入图片描述

日志复制过程中,Leader 会无限重试直到成功。如果超过半数的节点复制日志成功,就可以任务当前数据请求达成了共识,即日志可以 commite 提交了;


这里要提到的一点就是,如果follower发现canidate的日志还没有自己的新(索引号没自己大),其是不会支持其成为leader的。

参考文献

[1] 深入理解分布式共识算法 Paxos
[2] raft动画演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式共识算法 —— Raft详解 的相关文章

  • std vector传递指针使用说明

    今天用WM COPYDATA传递一个Vector的指针 xff0c 传递过来始终失败 后面找到一篇文章 xff0c 说只要传递第一个元素的地址就行 xff0c 因为vector在内存是连续的 static std vector lt UIm
  • Leetcode之运算库函数自定义

    一 Leetcode50 pow 注意点 1 n的值可以为正 xff0c 负 xff0c 0 2 O n 会TLE xff0c 使用递归时 xff0c 一定要将中间步保存 3 有博文中提到 xff0c 若n lt 0 xff0c 可以令n
  • 树莓派无键盘安装步骤

    树莓派无键盘安装 下载系统烧录系统配置无线网络开机并连接树莓派更新源和系统安装xrdp xff08 远程访问 xff09 Windows连接远程桌面 下载系统 应该只有官方的Raspbian系统支持无键盘安装 xff0c 官网下载系统 xf
  • iic实现采集温湿度传感器值

    iic h ifndef IIC H define IIC H include 34 stm32mp1xx gpio h 34 include 34 stm32mp1xx rcc h 34 通过程序模拟实现I2C总线的时序和协议 GPIOF
  • Matlab在线运行网站

    桌面版的Matlab不仅安装包很大 xff0c 而且也很吃性能 xff0c 不如就用网页版 xff0c 来玩啊 xff01 https www tutorialspoint com execute matlab online php 点击c
  • An Introduction on Deep Learning for the Physical Layer

    An Introduction on Deep Learning for the Physical Layer 代码实现 xff1a https github com shengjian3476077 DLforPhy 一 文章的主要工作
  • motion planning 一起学习

    shenlan 学院 motion planning 一起学习 打算买深蓝的motion planning for Mobile robots xff0c 主要是讲规划算法的 xff0c 有无一起学习的小伙伴 xff1f 一起学习 xff0
  • 【java面试之Linux】Linux启动过程、

    一 Linux启动过程 启动第一步 xff0d xff0d 加载BIOS 启动第二步 xff0d xff0d 读取MBR 主引导记录 启动第三步 xff0d xff0d Boot Loader 启动第四步 xff0d xff0d 加载内核
  • Linux SPI 驱动示例

    一 Linux 下 SPI 驱动框架 SPI 驱动框架分为主机控制器驱动和设备驱动 xff0c 主机控制器也就是 SOC 的 SPI 控制器接口 1 1 SPI 主机驱动 SPI 主机驱动就是 SOC 的 SPI 控制器驱动 xff0c L
  • 使用 FFmpeg 推流,使用 VLC 软件进行拉流

    1 移植Nginx到开发板 xff0c 使用 Nginx 来搭建 RTMP 流媒体服务器 2 执行如下命令进行推流 xff1a ffmpeg re i run media mmcblk1p1 testVideo mp4 c av copy
  • MPC与LQR的详细对比分析

    从以下几个方面进行阐述 xff1a 一 xff0c 研究对象 xff1a 是否线性 二 xff0c 状态方程 xff1a 离散化 三 xff0c 目标函数 xff1a 误差和控制量的极小值 四 xff0c 工作时域 xff1a 预测时域 x
  • 类类型成员引用的问题

    一个类中的成员变量是另一个类的类类型 xff0c 赋值问题分为引用 xff0c 不引用两类 如先定义TESTB类 class TESTB public TESTB b 61 3 7 TESTB void change b 61 9 0 fl
  • FutureTask的用法及两种经常使用的使用场景

    FutureTask可用于异步获取执行结果或取消执行任务的场景 经过传入Runnable或者Callable的任务给FutureTask xff0c 直接调用其run方法或者放入线程池执行 xff0c 以后能够在外部经过FutureTask
  • 二维线性插值方法

    前几天在进行数据仿真的时候 对于将表格离散数据转化成连续数据一直是一件十分棘手的事情 xff0c 在网站上找了许多资源最后才找到可以利用二维线性插值的方法将数据进行转化 1 原理 是要将 m n m times n m n 的二维数据如下图
  • 【转载】Matlab中LMI(线性矩阵不等式)工具箱使用教程

    64 TOC 转载 原文地址 xff1a https www cnblogs com Hand Head articles 5412511 html 这一段被老板逼着论文开题 xff0c 自己找方向比较着急 xff0c 最后选择了供应链控制
  • Python各类常用库整理

    一 20个必不可少的Python库也是基本的第三方库 Requests Kenneth Reitz写的最富盛名的http库 每个Python程序员都应该有它 Scrapy 如果你从事爬虫相关的工作 xff0c 那么这个库也是必不可少的 用过
  • Matlab中LMI(线性矩阵不等式)工具箱使用例子

    我搜出来的都是一些简单的算例 xff0c 并且机会没有中文教程 xff0c 我在这里就斗胆把自己的体会写出来 xff0c 试着给大家提供一点参考 LMI xff1a Linear Matrix Inequality xff0c 就是线性矩阵
  • 转--ICEM CFD中合并多个网格

    原址 xff1a http www jishulink com content post 359975
  • 【转】无人机故障数据集ALFA: A Dataset for UAV Fault and Anomaly Detection

    这里写自定义目录标题 无人机故障数据集资源地址 xff1a https kilthub cmu edu articles dataset ALFA A Dataset for UAV Fault and Anomaly Detection
  • 【转】无人机小课堂:无人机的副翼、俯仰、偏航、油门代表什么?

    刚刚接触无人机的小伙伴 xff0c 经常会听到很多英文缩写 xff0c 如AIL ELE RUD THR等 xff0c 一不小心就会傻傻分不清 但它们却经常出现在各种遥控器 飞控 调参软件中 xff0c 因为它们是无人机 航模中最基础的四个

随机推荐

  • 多弹多约束协同制导问题

    参考文献 xff1a 张达 刘克新 李国飞 多约束条件下的协同制导研究进展 J 南京信息工程大学学报 自然科学版 2020 12 05 530 539 DOI 10 13878 j cnki jnuist 2020 05 002 多导弹协同
  • 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别

    一 驱动的作用 任何一个计算机系统的运行都是系统中软硬件协作的结果 xff0c 没有硬件的软件是空中楼阁 xff0c 而没有软件的硬件则只是一堆废铁 硬件是底层基础 xff0c 是所有软件得以运行的平台 xff0c 代码最终会落实为硬件上的
  • 【转】多智能体系统一致性问题概述

  • 【转】从自然基金面上项目只许列10篇代表作说起

    作者 xff1a 喻海良 xff0c 字之亮 xff0c 2018年2月13日于北京沙河 关于建设 双一流大学 过程中 xff0c 我们作为大学教师该如何看待学术论文的讨论已经有很多了 个人觉得论文数量是基础 xff0c 一个大学教授的课题
  • 盘点 | 单目视觉3-D目标检测经典论文(附解读)

    2020年以来出现的一些单目视觉3 D目标检测的论文 本文针对部分典型的论文要点进行要点解读 xff0c 仅供参考 Towards Generalization Across Depth for Monocular 3D Object De
  • IBM的云平台Bluemix使用初体验-创建第一个容器

    概述 第一次使用IBM的云平台Bluemix xff0c 写一个blog记录一下 我注册Bluemix挺早的 xff0c 但是在工作中一直没有机会使用IBM的云平台 现在辞职创业 xff0c 做自己喜欢的互联网 xff0c 终于有机会用上了
  • 在Source Insight中添加对.cc的支持

    Options gt Document Options Document Type gt 下拉选择 xff1a C 43 43 Source File 在File Filter 中加入 cc
  • Android HFP流程记录

    DP 完成后 xff0c btif dm c文件中 xff0c btif dm search services evt函数 xff0c bond state changed BT STATUS SUCCESS amp bd addr BT
  • OPP文件传输

    在RFCOMM连接后 xff0c 进行Command Type Parameter Negotiation时 xff0c 会协商Credits初始值 建立OBEX连接时 xff0c 会将poll bit设置 xff0c 用于Given Cr
  • 算法——欧几里得算法

    目录 欧几里得算法算法原理欧几里得算法的代码表示 参考文献 欧几里得算法 欧几里得算法是用来求两个正整数最大公约数的算法 古希腊数学家欧几里得在其著作中 The Elements 中最早描述了这种算法 xff0c 所以叫欧几里得算法 a s
  • 算法——100瓶水,一瓶有毒,有一种试纸...

    问题描述 100瓶水 xff0c 一瓶有毒 xff0c 有一种试纸 xff0c 不过需要一个小时才能出结果 xff0c 问最少需要几片试纸才能在一小时内找到有毒的那一瓶 答案 span class token number 7 span 算
  • 基于muduo网络库的集群聊天系统(C++实现)

    文章目录 项目概述业务流程 数据模块表的设计数据库模块设计 通信格式网络和业务模块网络模块网络模块和业务模块解耦合业务模块注册业务登录业务加好友业务一对一聊天业务创建群业务加入群业务群聊业务注销业务 服务器集群跨服务器通信集群聊天服务器的思
  • linux设备驱动原理与本质

    任何计算机系统都是软件和硬件的结合体 xff0c 如果只有硬件而没有软件 xff0c 则硬件是没有灵魂的躯壳 xff1b 如果只有软件没有硬件 xff0c 则软件就是一堆无用的字符 在底层硬件的基础上 xff0c 操作系统覆盖一层驱动 xf
  • pycharm配置可视化界面流程简介

    一 安装QT Designer 在pycharm的终端里面输入如下命令 span class token comment 安装pyqt5 span pip install PyQt5 span class token comment 安装p
  • 内存——CPU、内存以及磁盘是如何交互的

    文章目录 内存的存储SRAMDRAMDRAM内部以及与内存控制模块的交互 xff08 重点 xff09 DRAM与内存存储CPU和内存的交互 xff08 重点 xff09 磁盘磁盘和CPU 内存的交互 局部性参考文献 之前在介绍linux
  • libco —— 安装与使用

    文章目录 libco的安装libco库的简单使用参考文献 libco的安装 可以直接从 Tencent 的 GitHub 仓库中拉取源码 xff1a ubuntu 64 VM 0 2 ubuntu libco span class toke
  • 为什么我的云服务器不能绑定公网 ip ?

    文章目录 云服务器的部署 xff1a 数据中心NAT协议开头问题的答案参考文献 写在前面 昨天呢 xff0c 在校招群里的小伙伴问了我们一个问题 xff0c 让我们帮给看看 xff1a 一开始呢 xff0c 博主按照经验呢跟他说是端口号被占
  • 汇编 —— 算术和逻辑操作

    文章目录 加载有效地址leaq 练习题练习题答案 一元操作符 amp 二元操作符一元 amp 二元 练习题练习题答案 移位操作移位练习题练习题答案 特殊的算数操作符练习题练习题答案 参考文献 写在前面 xff1a 从腾讯实习回来之后 xff
  • clang-format安装配置与vscode支持

    文章目录 calng format安装centos下clang format安装ubuntu下clang format的安装vscode支持clang format clang format使用参考文献 calng format安装 cen
  • 分布式共识算法 —— Raft详解

    文章目录 分布式共识算法顺序一致性线性一致性因果一致性 Raft 算法原理概览选举机制新节点加入leader 掉线处理多个 follower 同时掉线 日志复制 参考文献 分布式共识算法 首先我们先明确这个问题 xff1a 为什么需要分布式