分布式共识协议 Raft 是如何工作的?

news2024/10/3 6:29:58

Raft 解决的问题

提供一种共识算法(分布式一致性算法)。 Paxos是早先的一个分布式共识算法,Paxos 逻辑复杂而难以理解和实现。相比早先的 Paxos, Raft 提供一个容易理解和实现的共识算法,在很多的系统比如 etcd, ozone,tikv,RethinkDB 等项目中大量使用。

分布式共识协议, 源于我们对系统可用性,容错性的追求。分布式系统中,我们把数据复制到多个节点,为了解决多份数据的一致性问题, 常常将其简化为多份状态机的一致性问题。

对于客户端发来的指令, 只要能确保指令以唯一确定的顺序发送给所有结点, 那么只要各个状态机的初始状态相同, 执行完所有指令后,  也会到达相同的一致状态。 在多状态机一致性问题中, 共识算法( Consensus Algorithm) 的作用就是确保多份 log 中包含顺序和内容完全一致的指令,Raft 算法也即为了达到这个目的。

什么是共识? distributed consensus

共识是多个服务器在某一个值上达成一致。 这个值可以是商品的库存,可以是最大的Id值,可以是代表集群中主节点(Master 节点)的id,可以是账号里的余额数据,可以是任何的需要共识的数据,比如一份合同,钱包属于谁的,等等。

分布式共识的不同算法

Paxos (1990) –  可以工作,但少有人能够理解,难以正确实现

Raft (2014)  –  “In Search of an Understandable Consensus Algorithm” , Diego Ongaro and John Ousterhout – USENIX ATC’14, https://raft.github.io


Raft 算法的工作过程

多结点数据一致性的问题可以被抽象简化为多状态机副本一致性问题。

共识算法(一致性算法)是从复制状态机的背景下提出的。在这种方法中,一组服务器上的状态机产生相同状态的副本,并且在一些机器宕掉的情况下也可以继续运行。复制状态机在分布式系统中被用于解决很多容错的问题。例如,大规模的系统中通常都有一个集群领导人,像 GFS、HDFS 和 RAMCloud,典型应用就是一个独立的复制状态机去管理领导选举和存储配置信息并且在领导人宕机的情况下也要存活下来。比如 Chubby 和 ZooKeeper。

让整个集群拥有一个主结点, 客户端只向集群中的主结点发送指令, 如果客户端将指令发送给了集群中的非主结点, 非主结点都会直接返回主结点的地址, 让客户端与主结点建立连接,由主结点进行所有指令的接收和分发, 这样非常简单地就可以确保集群中的每个状态机都收到一份相同的指令,每一条指令即是一条日志。如果主节点出现故障,其他节点发起选举选出新的节点。

日志复制结构(图)

 

Raft 通过选举一个主节点,然后给予他全部的管理复制日志的责任来实现一致性。主节点从客户端接收日志条目(log entries),把日志条目复制到其他服务器上,并告诉其他的服务器什么时候可以安全地将日志条目应用到他们的状态机中。拥有一个主节点大大简化了对复制日志的管理。

Raft 将整个复杂的问题分解为三个相对独立的子问题逐个解决。

1.主结点选举问题

如何在一个主结点宕机后, 重新为集群选举出新的主结点。

2.指令集分发(日志分发)问题

主结点必须能够接收客户端发来的指令,并将指令 log 分发复制给集群中的其他结点, 并强迫其他状态机所持有且执行的指令 log 与自己的指令 log 达成一致。

3.安全性问题

Raft 算法对于安全性的定义有多条始终成立的性质共同构成

Raft 算法中的几个主要概念

概念英文概念定义
主节点LeaderRaft 集群中的一台主服务器,负责接收、处理、响应所有来自客户端的请求
跟随节点Follower跟随节点自己不会发送任何请求, 只会响应来自 leader 和 candidate 的请求, 不会响应其他 follower 发来的请求, 如果 follower 收到了来自客户端的请求, follower 会将主节点的信息返回客户端, 让客户端去联系
候选人节点Candidatecandidate 是选举过程中的候选节点角色, 当 leader 失效后, 会有follower 转变为 candidate ,  下一个 leader 从candidate 中产生
任期Term

在 Raft 协议中,时间被划分成一个个的任期,每个任期始于一次选举。在选举成功后,主节点会管理整个集群直到任期结束。有时候选举会失败,那么这个任期就会没有主节点而结束。任期之间的切换可以在不同的时间不同的服务器上观察到。

一个任期内最多只有一个主节点(也可能没有主节点);

任期 term 初始值为0,经过初次选举后变成1,单调递增;

日志Log日志包含了用于状态机的命令,以及 Leader接收到该条目时的任期(任期从1开始)
日志索引Log Index每一条日志条目都有一个整数索引值来表明它在日志中的位置
已提交日志Committed LogRaft 算法保证所有已提交的日志条目都是持久化的并且最终会被所有可用的状态机执行。在领导人将创建的日志条目复制到大多数的服务器上的时候,日志条目就会被提交,提交之后变成已提交        
最后应用的日志索引lastApplied Index已经被应用到状态机的最大的日志条目的索引(初始值为0,单调递增)

任期 (图)

 

一个任期中可能有操作,也可能没有操作,一个任期中最多有一个 leader,也可能没有 leader。 图中有4个任期,t1, t2, t3, t4。

日志序列/日志索引(图)

 

图中日志的索引从1到8,每条日志里面有一个任期,以及一条赋值指令(如 x <- 3)。图中 leader 节点经历了3个任期,1, 2, 3。

几个主要问题是如何解决的?

1.如何选举出主节点

Raft 使用一种心跳机制来触发领导人选举。当服务器程序启动时,他们都是跟随者身份(Follower)。服务器节点只要从领导人或者候选人处接收到有效的 RPCs,就继续保持着跟随者状态。 Leader 节点周期性的向所有跟随者发送心跳包(即不包含日志项内容的附加条目(AppendEntries)的 RPCs)来维持自己的权威。

如果一个跟随者在一段时间里没有接收到任何消息,也就是选举超时,那么他就会认为系统中没有可用的领导人,此时跟随者变成候选人,并且发起选举以选出新的领导人。

开始一次选举的过程:跟随者先要增加自己的当前任期号并且转换到候选人状态。然后他会并行地向集群中的其他服务器节点发送请求投票的 RPCs 来给自己投票。候选人会继续保持着当前状态直到以下三件事情之一发生:

(a) 他自己赢得了这次的选举,

(b) 其他的服务器成为领导人,

(c) 一段时间之后没有任何一个获胜的人。

当一个候选人从整个集群的大多数服务器节点获得了针对同一个任期号的选票,那么他就赢得了这次选举并成为领导人。每一个服务器最多会对一个任期号投出一张选票,按照先来先服务的原则。要求大多数选票的规则确保了最多只会有一个候选人赢得此次选举。

一旦候选人赢得选举,他就立即成为领导人。

然后他会向其他的服务器发送心跳消息来建立自己的权威并且阻止发起新的选举。

在等待投票的时候,候选人可能会从其他的服务器接收到声明它是领导人的附加条目(AppendEntries)RPC。

如果这个领导人的任期号(包含在此次的 RPC中)不小于候选人当前的任期号,那么候选人会承认领导人合法并回到跟随者状态。 如果此次 RPC 中的任期号比自己小,那么候选人就会拒绝这次的 RPC 并且继续保持候选人状态。

第三种可能的结果是候选人既没有赢得选举也没有输:如果有多个跟随者同时成为候选人,那么选票可能会被瓜分以至于没有候选人可以赢得大多数人的支持。当这种情况发生的时候,每一个候选人都会超时,然后通过增加当前任期号来开始一轮新的选举。

Raft 算法使用随机选举超时时间的方法来确保很少会发生选票瓜分的情况,就算发生也能很快的解决。为了阻止选票起初就被瓜分,选举超时时间是从一个固定的区间(例如 150-300 毫秒)随机选择。这样可以把服务器都分散开以至于在大多数情况下只有一个服务器会选举超时;然后他赢得选举并在其他服务器超时之前发送心跳包。同样的机制被用在选票瓜分的情况下。每一个候选人在开始一次选举的时候会重置一个随机的选举超时时间,然后在超时时间内等待投票的结果;这样减少了在新的选举中另外的选票瓜分的可能性。

其他更多逻辑参考如下参考文章。

Raft 的教程,视频课程,以及不同语言中的实现

Raft Consensus Algorithm

参考文章

https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf

https://www.usenix.org/system/files/hotcloud19-paper-ahn.pdf

Apache Kudu - Introducing Apache Kudu

https://home.apache.org/~szetszwo/presentations/20171115brown_bag.pdf

https://arxiv.org/pdf/1711.06964.pdf

GitHub - maemual/raft-zh_cn: Raft一致性算法论文的中文翻译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣hot100——第3天:11盛最多水的容器、21合并两个有序链表、22括号生成

文章目录1.11盛最多水的容器1.1.题目1.2.解答1.2.1.题解1.2.2.自己对参考题解的进一步解释2.21合并两个有序链表2.1.题目2.2.题解3.22括号生成3.1.题目3.2.题解1.11盛最多水的容器 参考&#xff1a;力扣题目链接&#xff1b;题解 1.1.题目 1.2.解答 1.2.1.题解 这道题目可以…

GIS工具maptalks开发手册(一)——hello world初始化

GIS工具maptalks开发手册(一)——hello world初始化 为何使用maptalks&#xff1f; ​ Maptalks项目是一个HTML5的地图引擎, 基于原生ES6、Javascript开发的二三维一体化地图。 通过二维地图的旋转、倾斜增加三维视角&#xff0c;通过插件化设计, 能与其他图形库echarts、d3.…

微信小程序实战十四:小程序及APP端实现客服功能

文章目录 1.效果预览2.小程序后台添加客服3.小程序代码中集成客服4.APP中添加客服5.企业微信登陆6.获取企业ID值7.设置多客服说明:项目用uni开发的,有小程序版本和APP版本,最开始项目中集成了第三方美洽的客服,2个客服一年收3600,老哥咨询我是否有稍微优惠点的方案,老哥带…

QuEra将研发可重构中性原子量子计算机

&#xff08;图片来源&#xff1a;网络&#xff09; 上个月&#xff0c;借助Amazon Braket&#xff0c;QuEra Computing开始提供对其中性原子量子系统Aquila的访问, Aquila具有256个量子比特。如今&#xff0c;量子公司的数量与日俱增&#xff0c;QuEra是其中之一&#xff0c;它…

java httpclient的digest验证(可恨,找遍全网没有靠谱的,不是少包就是少文件。含泪整理o(╥﹏╥)o~~~~)

背景&#xff1a;调用第三方接口&#xff0c;使用的是digest auth鉴权方式&#xff0c; basic auth和digest auth比较&#xff1a; basic认证是把用户和密码通过base64加密后发送给服务器进行验证。 Basic认证过程简单&#xff0c;每次请求都有发送密码。安全性较低。 为了解决…

[附源码]JAVA毕业设计衡师社团管理系统(系统+LW)

[附源码]JAVA毕业设计衡师社团管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

【allegro 17.4软件操作保姆级教程八】布线操作基础之三

目录 1.1扇出操作 1.2差分对过孔间距调整 1.3差分线换层自动添加回流过孔 1.4多人协同操作 1.5导入pin delay 1.6走线导圆弧 1.1扇出操作 关于信号扇出有如下一些需要注意的点&#xff1a; 1、过孔扇出要考虑其间距&#xff0c;要求2个过孔之间保证能过一根信号线&#x…

java+jsp基于ssm的校园OTO超市系统-计算机毕业设计

项目介绍 本网站主要是针对高校学生以超市购物为重点开发的网站。系统从用户上分为三种&#xff1a;卖家、买家和游客。系统从模块分为买家模块和卖家模块&#xff0c;买家模块包括用户注册登录、商品浏览、商品详情、商品加入购物车、购物车中商品删除、购物车商品数量变更、…

vue 微信登录

文章目录前言一、第一步用户授权获取code1、PC扫码方式一方式二&#xff1a;踩坑记录2、移动端微信内置浏览器授权获取code二、第二步 通过code获取access_token三、获取用户个人信息前言 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信…

没想到吧,Spring中还有一招集合注入的写法

Spring作为项目中不可缺少的底层框架&#xff0c;提供的最基础的功能就是bean的管理了。bean的注入相信大家都比较熟悉了&#xff0c;但是有几种不太常用到的集合注入方式&#xff0c;可能有的同学会不太了解&#xff0c;今天我们就通过实例看看它的使用。 首先&#xff0c;声…

[附源码]JAVA毕业设计衡水特产展销系统(系统+LW)

[附源码]JAVA毕业设计衡水特产展销系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

正则匹配删除指令

// 删除以 SameSeed 开头的整行 ^SameSeed.*$执行前&#xff1a; 执行后&#xff1a; 这样我们就可以在代码发布时删除代码中所有的调试信息&#xff0c;使代码中不包含任何 DEADCODE&#xff0c;但这样会导致一个问题&#xff0c;就是会出现一个空行&#xff0c;同时代码中…

生命在于学习——docker逃逸

注意&#xff1a;本篇文章仅用于学习记录&#xff0c;不得用于其他用途。 一、docker逃逸 docker逃逸就是从当前docker容器权限中逃逸出来&#xff0c;获得宿主机的权限。 二、常见的逃逸方法 1、配置不当引起的逃逸 &#xff08;1&#xff09;Docker Remote API未授权访问…

jsp汽车租赁管理系统Myeclipse开发sqlserver数据库web结构java编程计算机网页项目

一、源码特点 jsp汽车租赁管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库sqlserver2008&#xff…

应用现代化方案实践,重塑企业应用价值—工业篇

应用现代化是指通过更现代和新兴的IT技术来改造或部署传统应用&#xff0c;从而使应用更适合企业发展的一种优化方式。在企业上云背景下&#xff0c;应用现代化改造是将遗留的传统应用改造升级到云计算环境&#xff0c;从而兼容更现代和新兴的计算技术的过程。这种改造升级的同…

软件测试分类

1、是否关注源代码 黑盒测试 - 不关注代码逻辑&#xff0c;只关注输入输出 白盒测试 - 看代码的具体实现逻辑 灰盒测试 - 既关注输入输出&#xff0c;也关注代码 2、基于测试的不同阶段 单元测试 - 在底层进行的测试&#xff0c;又称模块测试&#xff08;module testing&a…

python数组处理方法

一、数组对象的属性 数组的大小&#xff08;元素个数&#xff09; array.size数组的维度 array.ndim数组元素的数据类型 array.dtype数组的形状 array.shape数组中每个元素占用的内存空间 array.itemsize数组所有元素占用的内存空间&#xff08;字节&#xff09; array.nbytes…

实验7 Spark初级编程实践

一、实验目的 掌握使用 Spark 访问本地文件和 HDFS 文件的方法掌握 Spark 应用程序的编写、编译和运行方法 二、实验平台 操作系统&#xff1a;Ubuntu18.04&#xff08;或 Ubuntu16.04&#xff09;Spark 版本&#xff1a;2.4.0Hadoop 版本&#xff1a;3.1.3 三、实验内容和…

举个栗子~Alteryx 技巧(3):离线激活 Alteryx Designer

之前我们分享了 如何下载并安装 Alteryx Designer。然而&#xff0c;对于内网环境的用户来说&#xff0c;就无法使用上述方法来激活软件了&#xff01;那么&#xff0c;不能连接外网的电脑该如何离线激活 Alteryx Designer 呢&#xff1f; 本期《举个栗子&#xff01;Alteryx …

opencv c++ 边缘提取

1、边缘 1.1 边缘定义 以图像像素值突变最大的方向作为边缘法线&#xff0c;与边缘法线垂直的就是边缘。 边缘强度&#xff1a;局部图像上的像素值突变程度&#xff08;图像局部一阶梯度和二阶梯度值&#xff09;。 1.2 边缘类别 跃迁类型 …