强一致性算法:Raft

目录

什么是 Raft 算法?

Leader的选举

投票分裂后的选举过程

Raft算法日志复制过程

修复不一样的日志 

数据安全性的保证


什么是 Raft 算法?

Raft 算法是一种是一种用于管理复制日志的强一致性算法,用于保证分布式系统中节点数据的一致性。

Raft 算法中节点有三个角色:

  • 领导者(Leader):负责接收客户端的请求,向其他节点发送日志条目,并协调日志的复制和提交。在一个 Raft 集群中,同一时刻只会有一个领导者。
  • 跟随者(Follower):被动地接收来自领导者的日志条目和心跳消息。如果在一定时间内没有收到领导者的心跳,跟随者可能会转变为候选人,发起选举。
  • 候选人(Candidate):由跟随者在选举期间转变而来,会向其他节点发送投票请求,试图成为领导者。

Leader的选举

现在有五个节点均处于未启动状态,如下图:

每个节点初始时都是Follower并且维护维护一个定时器与任期号,在定时器到期前如果没有收到 Leader 节点的心跳消息就会发起选举,过程如下:

  • 增加任期号:候选人将自己的任期号加 1。任期号是 Raft 算法中用于区分不同选举轮次和标识数据新旧的重要概念,每次选举都会产生一个新的、更大的任期号。
  • 投票给自己:候选人给自己投一票。每个节点在每一轮任期内只能投出一票,且按照先到先得的原则,谁先发送投票请求就投给谁。
  • 发送请求投票 RPC:候选人向集群中的其他节点发送请求投票的 RPC(远程过程调用)消息。该消息包含候选人的任期号、自身 ID 等信息。
  • 其他节点处理投票请求:跟随者节点在收到请求投票的 RPC 消息后,会进行一系列检查,如检查候选人的任期号是否大于自己当前的任期号等。如果候选人的任期号大于跟随者当前的任期号,且跟随者在当前任期内还没有投过票,并且候选人的日志至少和跟随者的日志一样新,那么跟随者就会投赞成票,并更新自己的任期号为候选人的任期号。如果候选人的任期号小于跟随者当前的任期号,或者候选人的日志没有跟随者的日志新等不满足投票条件的情况,跟随者会投反对票。
  • 判断选举结果:候选人在发送投票请求后,会等待接收其他节点的投票响应。如果候选人在一段时间内收到了集群中大多数节点(超过半数)的赞成票,那么它就赢得了选举,成为领导者。如果没有候选人获得多数票,或者出现多个候选人获得相同票数的情况,那么就会进入新的一轮选举。在新的选举中,候选人会再次增加任期号,重复上述选举过程,直到有候选人成功当选领导者为止。

我们启动节点,直观的感受一下这个过程:

raft算法选举

如果候选人的任期号小于跟随者当前的任期号,跟随者会投反对票。

Raft选举过程

投票分裂后的选举过程

如果在一轮选举中,有多个候选人,获得了相同的票数,那么就会进入新的一轮选举:

投票分裂下的raft选举

Raft算法日志复制过程

Raft 中的日志由一系列的日志条目组成,每个条目包含一个任期号(term)、一个条目索引(index)和一个操作指令。任期号用于标识日志条目的所属任期,索引用于唯一标识每个日志条目中的位置。日志复制流程如下:

  • 客户端请求:客户端向 Leader 节点发送写请求,请求中包含要执行的操作指令,例如创建、更新或删除数据等。
  • Leader 记录日志:Leader 接收到客户端请求后,为该操作分配一个唯一的日志索引,并在本地日志中追加一个新的日志条目,包含当前任期号、日志索引和操作指令。然后,Leader 将该日志条目标记为未提交状态。
  • 复制日志到 Follower:Leader 将新的日志条目发送给所有 Follower 节点。信息包含了日志条目的任期号、索引以及之前条目的任期号和索引等信息,以便 Follower 进行验证和匹配。
  • Follower 处理日志:Follower 节点接收到信息后,会进行一系列的检查。首先检查消息中的任期号,如果发现任期号小于自己当前的任期号,则认为该消息过期,直接拒绝并向 Leader 发送包含自己当前任期号的响应。如果任期号匹配,Follower 会检查日志条目的索引和之前条目的信息是否与自己的日志匹配。如果匹配,Follower 将日志条目追加到自己的日志中,并向 Leader 发送确认响应,表示日志已成功接收。
  • 日志提交:Leader 在收到大多数 Follower 对某个日志条目的确认响应后,认为该日志条目可以提交。Leader 将该日志条目标记为已提交状态,并应用该日志条目中的操作到本地状态机,更新本地数据。然后,Leader 会向 Follower 发送 AppendEntries RPC,通知 Follower 该日志条目已提交,Follower 收到后也将相应的日志条目标记为已提交,并应用到本地状态机。
  • 响应客户端:一旦 Leader 将日志条目应用到本地后,就可以向客户端发送响应,告知客户端操作已成功完成。

raft日志同步过程

修复不一样的日志 

在系统中,节点可能因硬件故障、软件错误或网络问题等原因而崩溃,在重新启动后可能会导致日志与其他节点不一致。为了保证数据的一致性,Leader节点需要对日志进行修复。

如何检测日志一致性?

Raft 算法通过日志的索引和任期号来进行日志匹配。Leader 在发送消息时,会携带前一个日志条目的索引和任期号。Follower节点会检查自己的日志中是否存在与 Leader 发送的前一个日志条目相匹配的条目。

如果匹配,则认为 Leader  的日志是最新的,并尝试将自己的日志与 Leader 的日志进行对齐。如果发现自己的日志与 Leader 的日志存在冲突,它会根据日志条目的任期号和索引来进行冲突解决。

如果追随者的日志条目任期号小于领导者的日志条目任期号,则追随者会删除自己的日志条目,并接受领导者的日志条目。如果任期号相同但索引不同,则追随者会根据日志条目的内容来判断哪个日志条目是正确的,并进行相应的处理。

同时领导者会定期向Follower发送消息,检测日志一致性。当领导者发现某个 Follower 的日志与自己不一致时,它会强制Follower删除不匹配的日志条目,并将自己的日志条目发送给Follower,让Follower进行追加。
 

raft算法日志修复

数据安全性的保证

在日志修复时,我们知道 Leader 节点会将自己的日志同步到所有节点,那么如果有一个节点失去与主节点的连接在超时后,竞选Leader节点同时连接恢复竞选并成功,然后同步日志,由于新的 Leader 节点没有断连时期的数据,断连时期的数据就会被覆盖。

Raft 为了避免这种情况,在竞选时不仅依靠任期号,候选人的日志至少要跟随者的日志一样新,跟随者才会投赞成票。

raft算法数据安全性

动画来源:Raft Consensus Algorithm

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[MyabtisPlus]PG的TIMESTAMPTZ不支持转换为LocalDateTime

背景 数据库用的是PG,且created_time字段用的是带时区的timestamptz类型: 用MyabtisPlus(MP)的的代码生成,默认生成的是JDK8的LocalDateTime类型: 结果,在查询时候,无法做到实体类的类型自动转换&#xff0…

cliproxy代理服务使用指南

Cliproxy代理服务使用指南 一、引言 Cliproxy,作为一款高效稳定的代理服务工具,广泛应用于跨境电商、数据分析、网络爬虫、远程办公等领域。本指南旨在帮助用户快速上手Cliproxy,充分利用其代理服务,提升工作效率与数据安全。 二、…

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透?怎么解决?2. 你能介绍一下布隆过滤器吗?3. 什么是缓存击穿?怎么解决?4. 什么是缓存雪崩?怎么解决?5. redis做为缓存,mysql的数据如何与redis进行同步呢&…

防火墙术语大全( Firewalld Glossary of Terms)

防火墙术语大全 防火墙作为网络安全中不可或缺的设备,在各种网络架构中扮演着至关重要的角色。无论是企业级防火墙、云防火墙还是家用路由器内置的防火墙,它们的工作原理和配置策略都离不开一系列专业术语的支撑。对于网络工程师来说,掌握这…

【蓝耘元生代智算云平台】一键部署 DeepSeek人工智能模型

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创&#x1…

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js ,内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定: 使用 表示src文件所在路径: path.resolve(__dirname,src)…

力扣hot100刷题第一天

哈希 1. 两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意…

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS(Cross-Origin Resource Sharing):2. Nginx代理3. Vue CLI配置代理:4 .uni-app在manifest.json中配置代理来解决:5. 使用WebSocket通讯…

以下是基于巨控GRM241Q-4I4D4QHE模块的液位远程控制系统技术方案:

以下是基于巨控GRM241Q-4I4D4QHE模块的液位远程控制系统技术方案: 一、系统概述 本系统采用双巨控GRM241Q模块构建4G无线物联网络,实现山上液位数据实时传输至山下水泵站,通过预设逻辑自动控制水泵启停,同时支持APP远程监控及人工…

百度高德地图坐标转换

百度地图和高德地图的侧重点不太一样。同样一个地名,在百度地图网站上搜索到的地点可能是商业网点,在高德地图网站上搜索到的地点可能是自然行政地点。 高德地图api 在高德地图中,搜索地名,如“乱石头川”,该地名会出…

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

carbon 加入 GitCode:Golang 时间处理的 “瑞士军刀”

在 Golang 的开发生态中,时间处理领域长期存在着诸多挑战。高效、精准的时间处理对于各类软件应用的稳定运行与功能拓展至关重要。近日,carbon 正式加入 GitCode,为 Golang 开发者带来一款强大且便捷的时间处理利器,助力项目开发迈…

项目总结: 应用程序的扩展bundle化,自定义classLoader

目录 描述事情实现的简单说明主应用业务1业务2 实现细节描述更多总结 描述事情 应用程序的主逻辑要做一件事,也提供了扩展。即如果想干预这个逻辑,业务可以自己扩展。 设计图如下: 应用:application, AppClassLoader加载&#…

基于javaweb的SpringBoot电影推荐系统

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 运行环境开发工具适用功能说明项目介绍环境需要技术栈使用说明 运行环境 Java≥8、MySQL≥5.7 开发工具 eclipse/idea/myeclips…

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…

1 推荐系统概述

推荐系统概述 1 推荐系统的意义平台方信息生产者(物品)信息消费者(用户)推荐和搜索的区别 2 推荐系统架构系统架构算法架构 3 推荐系统技术栈算法画像层召回/粗排精排重排序 工程 1 推荐系统的意义 信息生产者(平台方…

torch_bmm验算及代码测试

文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘,比如, mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…

汽车与AI深度融合:CES Asia 2025前瞻

在科技飞速发展的当下,汽车与AI的融合正成为行业变革的关键驱动力。近日,吉利、极氪、岚图、智己等多家车企纷纷官宣与DeepSeek模型深度融合,其中岚图知音更是将成为首个搭载该模型的量产车型,这无疑是汽车智能化进程中的重要里程…

Racecar Gym 总结

1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台,提供 Gymnasium(OpenAI Gym) 接口,主要用于强化学习(Reinforcement Learning, RL)、多智能体竞速(Multi-Ag…

jupyterLab插件开发

jupyter lab安装、配置: jupyter lab安装、配置教程_容器里装jupyterlab-CSDN博客 『Linux笔记』服务器搭建神器JupyterLab_linux_布衣小张-腾讯云开发者社区 Jupyter Lab | 安装、配置、插件推荐、多用户使用教程-腾讯云开发者社区-腾讯云 jupyterLab插件开发教…