算法学习之: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算法时,需要考虑一些关键细节,以确保算法的正确性和性能。
- 超时机制:跟随者在一段时间内未收到领导者的消息时,将触发超时机制并转换为候选者,发起领导者选举。这种机制有助于快速响应领导者故障,保证系统的可用性。
- 日志压缩:随着时间的推移,日志会不断增长,可能导致存储空间的浪费和性能下降。Raft算法通过日志压缩(Snapshot)技术来定期删除旧的日志条目,释放存储空间并保持系统的高效运行。
- 网络分区处理:在分布式系统中,网络分区是一种常见的故障模式。Raft算法通过领导者选举和日志复制机制来处理网络分区,确保在分区恢复后系统能够迅速恢复一致性。
优缺点:
Raft算法的优缺点主要体现在以下几个方面:
优点:
- 简单易懂:Raft算法相较于其他共识算法,如Paxos,设计更加直观和易于理解。这使得开发人员能够更容易地实现和调试分布式系统。
- 高可用性:Raft通过领导者选举和日志复制等机制确保了数据的一致性和可靠性。当领导者失效时,Raft能够快速进行新的领导者选举,从而保证系统的高可用性。
- 安全性:Raft算法在领导者选举和日志复制等过程中,通过一系列规则和机制保证了系统的安全性,避免了数据丢失或不一致等问题。
- 易于实现和维护:Raft算法详细描述了算法的实现细节,使得开发人员能够按照算法内容,按部就班地实现一个可用的分布式系统。同时,由于其简单易懂的特点,也使得系统维护变得更加容易。
缺点:
- 性能开销:Raft算法对于每个写操作都需要进行日志复制,这会带来一定的性能开销。相比于其他共识算法如Paxos,Raft算法的性能可能会稍差一些。
- 领导者单点故障:在Raft算法中,领导者是负责处理客户端请求和日志复制的节点。如果领导者失效,整个系统的性能和可用性都会受到影响。虽然Raft能够快速进行新的领导者选举,但在选举过程中,系统可能无法处理新的写请求。
- 数据一致性延迟:当领导者发生变更时,新的领导者需要等待日志复制完成才能处理客户端请求。这可能会导致一定的数据一致性延迟,即新的写请求可能需要在一段时间内才能被所有的节点所接受并应用。
总的来说,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:(初始版) //v1 #include "progress.h" int main() …...
C#和C++有什么区别?
C#和C都是广泛使用的编程语言,但它们在设计理念、应用场景和语法上有许多显著的区别。以下是一些关键区别的详细介绍: 1. 设计理念和目的 C: 设计目的:C是一种面向系统编程和应用程序开发的语言,具有高效性和灵活性…...

微信小程序报错:notifyBLECharacteristicValueChange:fail:nodescriptor的解决办法
文章目录 一、发现问题二、分析问题二、解决问题 一、发现问题 微信小程序报错:notifyBLECharacteristicValueChange:fail:nodescriptor 二、分析问题 这个提示有点问题,应该是该Characteristic的Descriptor有问题,而不能说nodescriptor。 …...
富格林:可信攻略阻止遭遇欺诈
富格林悉知,在投资市场中,如何阻止遭遇欺诈情况应该是每位投资者都想要了解的一个知识点。事实上,现货黄金市场相对来说会其他市场复杂多变,因此要想盈利出金还是得要先学会阻止遭遇欺诈情况。据富格林所知,目前市面上…...

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

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

GMSL图像采集卡,适用于无人车、自动驾驶、自主机器、数据采集等场景,支持定制
基于各种 系列二代 G MS L 图像采集卡(以下简称 二代图像采集卡)是一款自主研发的一款基于 F P G A 的高速图像产品,二代图像采集卡相比一代卡,由于采用PCIe G en 3 技术,速度和带宽都相应的有了成 倍的提高。该图像…...

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

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

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 下载为图片:跳转查看 本节演技一下如何将 DIV 全屏展示 全屏展示某一个 DIV 分析 其实就是模拟键盘动作 F11 var element document.getElementById(pic) var requestMethod element.requestFullS…...

K8S集群再搭建
前述:总体是非常简单的,就是过程繁琐,不过都是些重复的操作 master成员: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成员: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 数…...
工具-博客搭建
以下相关讲解均基于hexo github pages方案,请注意!!!博客搭建方案选择 参考文章1 搭建教程 参考文章1 hexo github pages搭建过程中遇到的问题 删除categories、tags 1、删除含有需要删除categories、tags的文章 2、hexo …...
贪心算法:合并区间
参考资料:代码随想录 题目链接:. - 力扣(LeetCode) 做过用最少数量的箭引爆气球和无重叠区间这两道题目后,题意和题解都不难理解。唯一的一点儿难点是对于api的运用。 class Solution {public int[][] merge(int[][…...

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

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

展现金融科技前沿力量,ATFX于哥伦比亚金融博览会绽放光彩
不到半个月的时间里,高光时刻再度降临ATFX。而这一次,是ATFX不曾拥有的桂冠—“全球最佳在线经纪商”(Best Global Online Broker)。2024年5月15日至16日,拉丁美洲首屈一指的金融盛会—2024年哥伦比亚金融博览会(Money Expo Colombia 2024) 于…...
html 根字号 以及 设置根元素font-size:calc(100vw/18.75)、元素rem实现自适应
rem 单位介绍:rem 是相对文档根元素(html)字体大小的尺寸单位,当元素的尺寸或文字字号等使用 rem 单位时,会随着根元素的 font-size变化而变化。 得出结论:在不同分辨率的设备下动态设置根元素的字体大小就可以实现页面自适应。 …...
size_t无符号数相关知识点
size_t无符号数相关知识点 在代码编译的时候,报错一个warning: comparison between signed and unsigned interger expression [-wsign-compare] 找到代码,告警这一段代码 size_t count timeProtocol.m_intersectionArray.size(); for (u…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...