当前位置: 首页 > news >正文

算法学习之:Raft-分布式一致性/共识算法

基础介绍

Raft是什么?

Raft is a consensus algorithm that is designed to be easy to understand. It's equivalent to Paxos in fault-tolerance and performance. The difference is that it's decomposed into relatively independent subproblems, and it cleanly addresses all major pieces needed for practical systems. We hope Raft will make consensus available to a wider audience, and that this wider audience will be able to develop a variety of higher quality consensus-based systems than are available today.

 Raft 是一种易于理解的共识算法(Consensus Algorithm)。它在容错性和性能方面与 Paxos 相当。所不同的是,它被分解成了相对独立的子问题,并简洁地解决了实际系统所需的所有主要问题。我们希望 Raft 能让更多人了解共识(Consensus),也希望更多的人能够开发出比现在更高质量的基于共识的系统。

Consensus又是什么?

Consensus is a fundamental problem in fault-tolerant distributed systems. Consensus involves multiple servers agreeing on values. Once they reach a decision on a value, that decision is final. Typical consensus algorithms make progress when any majority of their servers is available; for example, a cluster of 5 servers can continue to operate even if 2 servers fail. If more servers fail, they stop making progress (but will never return an incorrect result).

Consensus typically arises in the context of replicated state machines, a general approach to building fault-tolerant systems. Each server has a state machine and a log. The state machine is the component that we want to make fault-tolerant, such as a hash table. It will appear to clients that they are interacting with a single, reliable state machine, even if a minority of the servers in the cluster fail. Each state machine takes as input commands from its log. In our hash table example, the log would include commands like set x to 3. A consensus algorithm is used to agree on the commands in the servers' logs. The consensus algorithm must ensure that if any state machine applies set x to 3 as the nth command, no other state machine will ever apply a different nth command. As a result, each state machine processes the same series of commands and thus produces the same series of results and arrives at the same series of states.

 Consensus(共识)是容错分布式系统中的一个基本问题。Consensus(共识)涉及多个服务器就某个值达成一致。一旦它们就某个值达成一致,该决定就是最终决定。典型的共识算法会在大多数服务器可用时取得进展;例如,一个由 5 台服务器组成的集群,即使有 2 台服务器出现故障,也能继续运行。如果有更多的服务器出现故障,它们就会停止工作(但绝不会返回错误的结果)。

共识通常出现在复制状态机(state machine)中,这是构建容错系统的一种通用方法。每个服务器都有一个状态机和一个日志。状态机是我们希望实现容错的组件,例如哈希表。在客户端看来,即使集群中的少数服务器出现故障,他们也是在与一个单一、可靠的状态机(leader)进行交互。每个状态机都从日志中获取指令作为输入。在我们的哈希表示例中,日志将包括 set x to 3 这样的命令。共识算法必须确保,如果任何一台状态机将 set x to 3 作为第 n 条命令,其他状态机都不会使用不同的第 n 条命令。因此,每台状态机都会处理相同系列的命令,从而产生相同系列的结果,到达相同系列的状态。

总结:Raft算法是一种共识算法,旨在替代Paxos。它提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点都同意一系列相同的状态转换。

详细介绍

实现原理:

Raft算法的实现原理主要围绕三个关键部分:领导者选举(Leader Election)、日志复制(Log Replication)和安全性(Safety)。

以下是Raft算法实现原理的详细介绍:

领导者选举(Leader Election)

  • 服务器状态:Raft中的服务器有三种状态:领导者(Leader)、追随者(Follower)和候选者(Candidate)。在初始状态下,所有节点都是追随者(Follower)。
  • 选举触发:当服务器启动时,它默认是追随者(Follower)状态。如果追随者在一段时间内没有收到来自领导者的心跳消息(通常是随机的超时时间),它将转变为候选者(Candidate)状态并发起领导者(Leader)选举。
  • 投票过程:候选者会向集群中的其他服务器请求投票。每个服务器在一个任期内只能投出一票,并且只会投给日志条目不落后于自己的候选者。如果候选者获得了集群中超过半数的投票,它将成为新的领导者。
  • 任期(Term):Raft通过递增的任期号来管理时间,每个成功的领导者选举都会开始一个新的任期。

日志复制(Log Replication)

  • 日志条目:在Raft中,所有的更新都是通过提交日志条目来实现的。客户端的请求会被作为新的日志条目附加到领导者的日志中。
  • 日志同步:领导者会将新的日志条目通过AppendEntries RPC同步给所有的追随者。只有当大多数的追随者都复制了日志条目后,这个条目才会被认为是已提交的,并且可以被应用到状态机中以更新系统状态。
  • 日志一致性:如果追随者的日志与领导者的日志不一致(即出现了“空洞”),追随者会丢弃自己日志中空洞之后的所有条目,并从领导者那里复制缺失的条目以重新同步。

安全性(Safety)

  • 选举限制Raft通过限制只有拥有最新日志的服务器才能成为领导者来确保安全性。这保证了已经被提交的日志条目不会被覆盖或删除。
  • 提交规则一个日志条目只有在被大多数服务器复制后才能被认为是已提交的。这确保了即使领导者崩溃,新的领导者也能从大多数服务器中恢复并提交这些条目。
  • 日志压缩为了限制日志的无限增长,Raft允许领导者和追随者截断旧的已提交的日志条目。但是,在截断之前,领导者必须确保新的领导者也包含了所有已提交的日志条目。

通过这些机制,Raft算法能够在分布式系统中提供强一致性和容错性。同时,它的设计相对简单易懂,使得在实际应用中更容易实现和维护。

注意:在实际实现Raft算法时,需要考虑一些关键细节,以确保算法的正确性和性能。

  1. 超时机制:跟随者在一段时间内未收到领导者的消息时,将触发超时机制并转换为候选者,发起领导者选举。这种机制有助于快速响应领导者故障,保证系统的可用性。
  2. 日志压缩:随着时间的推移,日志会不断增长,可能导致存储空间的浪费和性能下降。Raft算法通过日志压缩(Snapshot)技术来定期删除旧的日志条目,释放存储空间并保持系统的高效运行。
  3. 网络分区处理:在分布式系统中,网络分区是一种常见的故障模式。Raft算法通过领导者选举和日志复制机制来处理网络分区,确保在分区恢复后系统能够迅速恢复一致性。

优缺点:

Raft算法的优缺点主要体现在以下几个方面:

优点:

  1. 简单易懂:Raft算法相较于其他共识算法,如Paxos,设计更加直观和易于理解。这使得开发人员能够更容易地实现和调试分布式系统。
  2. 高可用性:Raft通过领导者选举和日志复制等机制确保了数据的一致性和可靠性。当领导者失效时,Raft能够快速进行新的领导者选举,从而保证系统的高可用性。
  3. 安全性:Raft算法在领导者选举和日志复制等过程中,通过一系列规则和机制保证了系统的安全性,避免了数据丢失或不一致等问题。
  4. 易于实现和维护:Raft算法详细描述了算法的实现细节,使得开发人员能够按照算法内容,按部就班地实现一个可用的分布式系统。同时,由于其简单易懂的特点,也使得系统维护变得更加容易。

缺点:

  1. 性能开销:Raft算法对于每个写操作都需要进行日志复制,这会带来一定的性能开销。相比于其他共识算法如Paxos,Raft算法的性能可能会稍差一些。
  2. 领导者单点故障:在Raft算法中,领导者是负责处理客户端请求和日志复制的节点。如果领导者失效,整个系统的性能和可用性都会受到影响。虽然Raft能够快速进行新的领导者选举,但在选举过程中,系统可能无法处理新的写请求。
  3. 数据一致性延迟:当领导者发生变更时,新的领导者需要等待日志复制完成才能处理客户端请求。这可能会导致一定的数据一致性延迟,即新的写请求可能需要在一段时间内才能被所有的节点所接受并应用。

总的来说,Raft算法以其简单易懂、高可用性和安全性等优点在分布式系统中得到了广泛的应用。然而,其性能开销、领导者单点故障和数据一致性延迟等缺点也需要在实际应用中加以考虑和解决。

同类算法比较

与Raft算法最为相似且经常被拿来比较的是Paxos算法。Paxos算法是一种经典的分布式一致性算法,具有广泛的应用场景。然而,Paxos算法的设计相对复杂,难以理解和实现。相比之下,Raft算法在保持Paxos算法的一致性和容错性的基础上,通过简化设计和降低复杂性,使得开发人员更容易实现和调试分布式系统。此外,Raft算法还通过增加强领导性和优化领导选举过程等特性,进一步提高了系统的性能和可用性。

容错设计:

Raft算法的容错设计是其核心特性之一,它确保了分布式系统在出现节点故障或网络分区等异常情况时,仍能保持系统的一致性和可用性。以下是关于Raft算法容错设计的更详细解释:

1. 领导者选举

在Raft中,领导者是处理客户端请求、管理日志复制和确保一致性的关键角色。如果领导者失效,系统会通过领导者选举来选出一个新的领导者。选举过程遵循以下规则:

  • 超时机制:每个服务器节点都有一个超时时间,如果在一定时间内没有收到领导者的心跳信息,节点就会认为领导者可能已经失效,并开始竞选成为新的领导者。
  • 投票机制:候选者会向集群中的其他节点发送请求投票的消息。节点在收到请求后,会检查请求者的日志是否比自己更新或至少和自己一样新。如果是,节点就会投票给请求者。当候选者收到超过半数的投票时,就会成为新的领导者。

这种选举机制确保了即使领导者失效,系统也能快速恢复到一个新的稳定状态,继续提供服务。

2. 日志复制

Raft通过日志复制机制来确保集群中所有节点上的日志保持一致,从而保证了数据的一致性和容错性。

  • 领导者发送日志:领导者会将客户端的请求作为新的日志条目追加到自己的日志中,并将这些条目发送给集群中的其他节点(即跟随者)。
  • 跟随者接收日志:跟随者在接收到领导者发送的日志条目后,会将其追加到自己的日志中,并回复领导者一个确认消息。
  • 领导者确认提交:当领导者确认大多数跟随者已经复制了某个日志条目时,就会将该条目标记为已提交。已提交的日志条目会被应用到状态机中以更新系统状态。

这种日志复制机制确保了即使某个节点失效,只要大多数节点仍然正常工作,系统就能够继续运行并保持一致性。因为已提交的日志条目已经被大多数节点所复制,所以即使某个节点失效,也不会影响整个系统的状态。

3. 安全性保证

Raft算法通过一系列规则来确保数据的安全性和一致性:

  • 领导者唯一性:在任何时候,集群中最多只有一个领导者。这避免了多个领导者同时处理请求导致的数据不一致问题。
  • 日志一致性:领导者在提交日志条目之前必须确保大多数跟随者已经复制了该条目。这确保了即使领导者失效,新的领导者也能从大多数跟随者那里获取到最新的日志数据。
  • 安全性限制:在选举过程中,只有拥有最新日志的节点才能成为领导者。这保证了新领导者在接管后能够继续之前的操作,不会丢失数据。

4. 处理网络分区

在网络分区的情况下,Raft能够确保在大多数节点所在的分区中选举出一个新的领导者,继续处理客户端的请求。当网络恢复后,被隔离的节点会自动与新领导者进行同步,确保数据的最终一致性。这种设计避免了在网络分区时出现多个领导者同时处理请求的情况,从而保证了数据的一致性和可靠性。

总的来说,Raft算法的容错设计通过领导者选举、日志复制、安全性保证以及处理网络分区等机制来确保分布式系统在面对各种异常情况时能够保持其一致性和可用性。这使得Raft算法成为构建高可用性和容错性分布式系统的理想选择。

参考地址:

Raft Consensus Algorithm

Paper: https://raft.github.io/raft.pdf

相关文章:

算法学习之:Raft-分布式一致性/共识算法

基础介绍 Raft是什么? Raft is a consensus algorithm that is designed to be easy to understand. Its equivalent to Paxos in fault-tolerance and performance. The difference is that its decomposed into relatively independent subproblems, and it clea…...

彩色进度条(C语言版本)

.h文件 #include<stdio.h> #include<windows.h>#define NUM 101 #define LOAD_UP 50 #define LOAD_DOWN 60 #define SLEEP_SLOW 300 #define SLEEP_FAST 70 版本1&#xff1a;&#xff08;初始版&#xff09; //v1 #include "progress.h" int main() …...

C#和C++有什么区别?

C#和C都是广泛使用的编程语言&#xff0c;但它们在设计理念、应用场景和语法上有许多显著的区别。以下是一些关键区别的详细介绍&#xff1a; 1. 设计理念和目的 C&#xff1a; 设计目的&#xff1a;C是一种面向系统编程和应用程序开发的语言&#xff0c;具有高效性和灵活性…...

微信小程序报错:notifyBLECharacteristicValueChange:fail:nodescriptor的解决办法

文章目录 一、发现问题二、分析问题二、解决问题 一、发现问题 微信小程序报错&#xff1a;notifyBLECharacteristicValueChange:fail:nodescriptor 二、分析问题 这个提示有点问题&#xff0c;应该是该Characteristic的Descriptor有问题&#xff0c;而不能说nodescriptor。 …...

富格林:可信攻略阻止遭遇欺诈

富格林悉知&#xff0c;在投资市场中&#xff0c;如何阻止遭遇欺诈情况应该是每位投资者都想要了解的一个知识点。事实上&#xff0c;现货黄金市场相对来说会其他市场复杂多变&#xff0c;因此要想盈利出金还是得要先学会阻止遭遇欺诈情况。据富格林所知&#xff0c;目前市面上…...

搭建淘宝扭蛋机小程序:技术选型与最佳实践

随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级应用&#xff0c;以其无需安装、即用即走的特点&#xff0c;受到了广大用户的喜爱。在电商领域&#xff0c;淘宝作为国内最大的电商平台之一&#xff0c;也积极拥抱小程序技术&#xff0c;为用户提供更加便捷、个性化…...

【线性回归】梯度下降

文章目录 [toc]数据数据集实际值估计值 梯度下降算法估计误差代价函数学习率参数更新 Python实现导包数据预处理迭代过程结果可视化完整代码 结果可视化线性拟合结果代价变化 数据 数据集 ( x ( i ) , y ( i ) ) , i 1 , 2 , ⋯ , m \left(x^{(i)} , y^{(i)}\right) , i 1 ,…...

GMSL图像采集卡,适用于无人车、自动驾驶、自主机器、数据采集等场景,支持定制

基于各种 系列二代 G MS L 图像采集卡&#xff08;以下简称 二代图像采集卡&#xff09;是一款自主研发的一款基于 F P G A 的高速图像产品&#xff0c;二代图像采集卡相比一代卡&#xff0c;由于采用PCIe G en 3 技术&#xff0c;速度和带宽都相应的有了成 倍的提高。该图像…...

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…...

K8s Service 背后是怎么工作的?

kube-proxy 是 Kubernetes 集群中负责服务发现和负载均衡的组件之一。它是一个网络代理&#xff0c;运行在每个节点上, 用于 service 资源的负载均衡。它有两种模式&#xff1a;iptables 和 ipvs。 iptables iptables 是 Linux 系统中的一个用户空间实用程序&#xff0c;用于…...

ClickHouse配置与使用

静态IP配置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.128 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…...

将某一个 DIV 块全屏展示

文章目录 需求分析 需求 上节我们研究了如何将页面中的指定 div 下载为图片&#xff1a;跳转查看 本节演技一下如何将 DIV 全屏展示 全屏展示某一个 DIV 分析 其实就是模拟键盘动作 F11 var element document.getElementById(pic) var requestMethod element.requestFullS…...

K8S集群再搭建

前述&#xff1a;总体是非常简单的&#xff0c;就是过程繁琐&#xff0c;不过都是些重复的操作 master成员: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成员: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 数…...

工具-博客搭建

以下相关讲解均基于hexo github pages方案&#xff0c;请注意&#xff01;&#xff01;&#xff01;博客搭建方案选择 参考文章1 搭建教程 参考文章1 hexo github pages搭建过程中遇到的问题 删除categories、tags 1、删除含有需要删除categories、tags的文章 2、hexo …...

贪心算法:合并区间

参考资料&#xff1a;代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 做过用最少数量的箭引爆气球和无重叠区间这两道题目后&#xff0c;题意和题解都不难理解。唯一的一点儿难点是对于api的运用。 class Solution {public int[][] merge(int[][…...

DFA 算法

为什么要学习这个算法 前一段时间遇到了瓶颈&#xff0c;因为词库太多了导致会有一些速度过慢&#xff0c;而且一个正则表达式已经放不下了&#xff0c;需要进行拆分正则才可以。 正好我以前看过有关 dfa 的介绍&#xff0c;但是并没有深入的进行研究&#xff0c;所以就趁着周…...

Web(数字媒体)期末作业

一.前言 1.本资源为类似于打飞机的网页游戏 2.链接如下&#xff1a;【免费】前端web或者数字媒体的期末作业&#xff08;类似于打飞机的2D网页小游戏&#xff09;资源-CSDN文库 二.介绍文档...

展现金融科技前沿力量,ATFX于哥伦比亚金融博览会绽放光彩

不到半个月的时间里&#xff0c;高光时刻再度降临ATFX。而这一次&#xff0c;是ATFX不曾拥有的桂冠—“全球最佳在线经纪商”(Best Global Online Broker)。2024年5月15日至16日&#xff0c;拉丁美洲首屈一指的金融盛会—2024年哥伦比亚金融博览会(Money Expo Colombia 2024) 于…...

html 根字号 以及 设置根元素font-size:calc(100vw/18.75)、元素rem实现自适应

rem 单位介绍&#xff1a;rem 是相对文档根元素(html)字体大小的尺寸单位&#xff0c;当元素的尺寸或文字字号等使用 rem 单位时&#xff0c;会随着根元素的 font-size变化而变化。 得出结论&#xff1a;在不同分辨率的设备下动态设置根元素的字体大小就可以实现页面自适应。 …...

size_t无符号数相关知识点

size_t无符号数相关知识点 在代码编译的时候&#xff0c;报错一个warning&#xff1a; comparison between signed and unsigned interger expression [-wsign-compare] 找到代码&#xff0c;告警这一段代码 size_t count timeProtocol.m_intersectionArray.size(); for (u…...

深度学习之基于Tensorflow+Flask框架Web手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是深度学习领域中的一个经典问题&#xff0c;也是计算机视觉领域的重要应用之一。…...

2024电工杯B题食谱评价与优化模型思路代码论文分析

2024年电工杯数学建模竞赛B题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型…...

blender安装cats-blender-plugin-0-19-0插件,导入pmx三维模型

UE5系列文章目录 文章目录 UE5系列文章目录前言一、Blender安装二、cats-blender-plugin-0-19-0插件下载三、下载bmp文件四、在blender2.93中安装cats-blender-plugin-0-19-0插件 前言 blender本身不支持pmx三维模型&#xff0c;需要用到cats-blender-plugin-0-19-0插件。 一…...

[源码+搭建教程]西游伏妖篇手游_GM_单机+和朋友玩

为了学习和研究软件内含的设计思想和原理&#xff0c;本人花心血和汗水带来了搭建教程&#xff01;&#xff01;&#xff01; 教程不适于服架设&#xff0c;严禁服架设&#xff01;&#xff01;&#xff01;请牢记&#xff01;&#xff01;&#xff01; 教程仅限学习使用&…...

windows、mac、linux中node版本的切换(nvm管理工具),解决项目兼容问题 node版本管理、国内npm源镜像切换

文章目录 在工作中&#xff0c;我们可能同时在进行2个或者多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;进而不同项目必须依赖不同版本的NodeJS运行环境&#xff0c;这种情况下&#xff0c;对于维护多个版本的node将会是一件非常麻烦的事情&#xff0c;nvm就是…...

【MySQL精通之路】全文搜索-布尔型全文搜索

1.使用方法 MySQL可以使用IN BOOLEAN MODE修饰符执行布尔全文搜索。 使用此修饰符&#xff0c;某些字符在搜索字符串中单词的开头或结尾具有特殊含义。 在下面的查询中&#xff0c;和-运算符分别表示单词必须存在或不存在&#xff0c;才能进行匹配。 因此&#xff0c;查询检…...

【学习笔记】C++每日一记[20240520]

简述几种内存泄漏的预防机制 用智能指针代替普通指针&#xff0c;由于智能指针自带引用计数功能&#xff0c;能够记录动态分配空间的引用数量&#xff0c;在引用计数为零时&#xff0c;自动调用析构函数释放空间。 借助一些内存泄漏检测工具&#xff0c;例如Valgrind、Memche…...

【热门话题】一文带你读懂公司是如何知道张三在脉脉上发了“一句话”的

按理说呢&#xff0c;A公司和脉脉属于不同的平台&#xff0c;而且脉脉上大家可以匿名发言&#xff0c;所以&#xff0c;即便我坐在你边上&#xff0c;我发了一句话上去&#xff0c;你也不知道是谁发的。但通过一些技术&#xff0c;我们却可以分析出&#xff0c;公司是如何知道张…...

linux命令日常使用思考

linux命令日常使用思考 复制的相关问题scp和cp的区别root192.168.5.229-r的理解 更新版本的相关问题svn info 根目录和家目录的区别根目录家目录 复制的相关问题 scp和cp的区别 安全性&#xff1a;SCP 是基于 SSH 的加密传输协议&#xff0c;可以保证数据在传输过程中的安全性…...

同余定理与哈希函数

目录 同余定理哈希函数加密算法 余数有很多的应⽤场景&#xff0c;⽐如散列函数、加密算法&#xff0c;循环冗余校验等等。生活中也有很多与余数有关的例子。 比如&#xff0c;你要将1147条数据分页写入&#xff0c;每页10条&#xff0c;计算总页数。就可以用1147除以10&#x…...