彻底搞懂 Raft 算法:为“被理解”而生的分布式共识

news/2025/11/27 2:14:03/文章来源:https://www.cnblogs.com/irobotzz/p/19275087

彻底搞懂 Raft 算法:为“被理解”而生的分布式共识

彻底搞懂 Raft 算法:为“被理解”而生的分布式共识

在分布式系统的世界里,共识(Consensus)是一个核心难题:如何让一堆机器对某个值(比如数据记录)达成一致?

很久以来,Paxos 算法是这个领域的“神”,但它太难懂了,难懂到连工程师都难以正确实现它。于是,Raft 诞生了。Raft 的设计初衷非常直白——“为了被理解”。它将复杂的共识问题拆解得清晰明了。

要理解 Raft,其实只需要搞懂三个核心问题:

  1. 老大是怎么选出来的?(Leader Election)
  2. 数据是怎么同步的?(Log Replication)
  3. 出了问题怎么办?(Safety & Network Partition)

本文将通过图解的方式,带你拆解 Raft 的核心原理。


一、 核心概念:三个角色与任期

在 Raft 集群中,任何时候,一个节点只能处于以下三种状态之一。我们可以把它想象成一个由群众、竞选者和独裁者组成的微型社会。

1. 三种角色 (Roles)

  • Leader(领导者/独裁者)
    • 特权:全权负责处理客户端的写请求,把日志复制给 Follower。
    • 义务:它必须不断给 Follower 发心跳(Heartbeat),证明自己还活着,否则会被“罢免”。
  • Follower(追随者/群众)
    • 本分:平时不说话,只响应 Leader 的指令(写数据)和 Candidate 的拉票请求。
    • 造反:如果在一段时间内没收到 Leader 的心跳,它就会认为 Leader 挂了,从而变身 Candidate。
  • Candidate(候选人/竞选者)
    • 目的:当 Follower 没听到 Leader 的声音,就会变成 Candidate,发起投票,试图成为新 Leader。

2. 任期 (Term)

Raft 将时间划分为一个个的 Term(任期),用递增的数字表示(Term 1, Term 2...)。

  • 每一届任期开始都是一次选举。
  • 规则:如果一个节点发现别人的 Term 比自己大,它会立马变回 Follower(认怂)。这就像前朝皇帝遇到了新朝皇帝。

角色状态转换图

stateDiagram-v2[*] --> FollowerFollower --> Candidate : 选举超时 (收不到心跳)Candidate --> Leader : 获得大多数选票Candidate --> Follower : 发现更高任期 / 输掉选举Candidate --> Candidate : 选举超时 (平票,重新选举)Leader --> Follower : 发现更高任期 (比如网络恢复后)

二、 阶段一:Leader 选举 (Leader Election)

Raft 使用心跳机制来触发选举。只要 Leader 还在发心跳,Follower 就乖乖听话;心跳一停,天下大乱。

1. 触发选举

Follower 节点有一个选举超时定时器(Election Timeout)(通常在 150ms-300ms 之间随机)。

  • 正常情况:收到 Leader 心跳 -> 重置定时器 -> 继续当 Follower。
  • 异常情况:定时器倒计时结束(超时) -> 变身 Candidate

2. 竞选流程

当一个节点变成 Candidate 后,它会执行以下动作:

  1. 任期 +1(Term ++)。
  2. 给自己投一票
  3. 群发 RequestVote RPC:向所有其他人喊话“请投我一票!”。

3. 谁能当选?

其他节点收到拉票请求,会根据以下原则投票:

  • 先来后到:一个任期内,票只有一张,先给谁就是谁的。
  • 比我新:你的日志不能比我的旧。

结果判定

  • 赢了:获得了集群大多数(N/2 + 1)的票数 -> 成为 Leader -> 立即发送心跳宣告主权。
  • 输了:收到了别人的心跳(说明别人赢了) -> 变回 Follower。
  • 僵局(Split Vote):票数对半开,谁都没过半。

4. 巧妙的“随机超时”

为了解决僵局,Raft 让每个节点的超时时间是一个随机值。这保证了大概率有一个节点会“先醒来”并发起投票,从而打破平衡。

选举流程图

sequenceDiagramparticipant A as Node A (Follower)participant B as Node B (Follower)participant C as Node C (Leader - 已挂)Note over C: Leader C 宕机Note over A: 等待心跳... 超时!Note over A: 状态变为 Candidate<br/>Term = Term + 1<br/>给自己投一票A->>B: RequestVote (请投我!)Note over B: 还没投过票<br/>日志也并不比A新B-->>A: VoteGranted (同意!)Note over A: 拿到 2 票 (总共3节点)<br/>满足大多数!Note over A: 状态变为 LeaderA->>B: Heartbeat (我是老大了)

三、 阶段二:日志复制 (Log Replication)

Leader 选出来了,现在开始干活。Raft 保证数据的强一致性

流程步骤

  1. Client 请求:客户端发送命令 set x=5 给 Leader。
  2. 预写入 (Append):Leader 把命令写入本地日志(状态:Uncommitted),并并行发送 AppendEntries RPC 给 Follower。
  3. Follower 写入:Follower 收到日志,检查一致性。如果没问题,写入本地日志,返回 Success
  4. 提交 (Commit)
    • Leader 收到大多数 Follower 的 Success。
    • Leader 将日志标记为 Committed,应用到状态机(执行 x=5)。
    • Leader 给客户端返回“成功”。
  5. 后续同步:Leader 在下一次心跳中告诉 Follower:“刚才那条已提交,你们也可以应用了。”

日志复制流程图

sequenceDiagramparticipant Clientparticipant Leaderparticipant Follower1participant Follower2Client->>Leader: set x=5Note over Leader: 1. 写入本地日志 (Uncommitted)par 并行发送Leader->>Follower1: AppendEntries (x=5)Leader->>Follower2: AppendEntries (x=5)endNote over Follower1: 2. 写入本地日志Follower1-->>Leader: SuccessNote over Follower2: 2. 写入本地日志Follower2-->>Leader: SuccessNote over Leader: 3. 收到大多数响应 (2/3)Note over Leader: 4. Commit 并应用状态机Leader-->>Client: 返回成功 OKpar 通知提交Leader->>Follower1: 下次心跳: "x=5 已提交"Leader->>Follower2: 下次心跳: "x=5 已提交"endNote over Follower1: Commit 并应用Note over Follower2: Commit 并应用

四、 阶段三:安全性与脑裂 (Brain Split)

分布式系统最怕网络分区(Network Partition)。假设 5 个节点(A, B, C, D, E)裂变成了两半:[A, B][C, D, E]

场景演练

  1. 旧 Leader (A) 的困境

    • A 在 [A, B] 分区。Client 给它发数据,它试图同步给 B。
    • 但它永远凑不齐 3 票(总共5个节点,需要3票)。
    • 结果:A 收下的数据永远是 Uncommitted无法响应客户端成功
  2. 新 Leader (C) 的崛起

    • [C, D, E] 分区,C 发现联系不上 A,发起选举。
    • C 拿到 C, D, E 的 3 票,成为新 Leader(Term 增加)。
    • Client 连接到 C,写入数据。C 能同步给 D 和 E,成功提交
  3. 网络恢复(真相大白)

    • 分区消失。A (Term 1) 遇到了 C (Term 2)。
    • 规则:Term 小的自动退位。
    • 结果:A 发现自己任期旧,立马变为 Follower。它会清空自己那些未提交的“脏数据”,同步 C 的最新数据。

五、 总结 Raft 的精髓

Raft 之所以能取代 Paxos 成为工业界的主流(Etcd, Consul, TiKV 都在用),就在于它清晰的规则:

  1. 强主模型 (Strong Leader):所有写操作必须经过 Leader,简化了逻辑。
  2. 大多数原则 (Quorum):只要大多数节点活着,系统就能跑,数据就不会丢。
  3. 随机超时 (Randomized Timeout):用最简单的技巧解决了复杂的选举僵局。
  4. 任期逻辑 (Terms):用“朝代”的概念解决了时序和冲突问题。

一句话总结 Raft:

选出一个管事的,所有事情听他的,大多数人记下来了就算成功。

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

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

相关文章

龙哥量化:初版简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)

3、函数buy,sell不能指定手数,只能在界面设置。 4、不识别第二个参数价格,所以, 你用上图中的10个价格之外的价格,在回测系统不起作用,比如实时突破压力线,代码中用压力线的价格成交,BUY(突破, 压力线),实际…

代码随想录算法训练营第三章 哈希表part02

代码随想录算法训练营第三章 哈希表part02第454题.四数相加II leetcode链接:https://leetcode.cn/problems/4sum-ii/description/ 题目描述:给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, …

AI:情绪冲动和阴性症状有什么关系

情感症状 和情绪冲动和阴性症状有什么关系 这个问题非常深刻,触及了精神病理学的核心。情感症状、情绪冲动与阴性症状的关系,与它们和阳性症状的关系完全不同,甚至可以说是相反的。 简单来说:阳性症状是正常功能的…

龙哥量化:简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)

3、函数buy,sell不能指定手数,只能在界面设置。 4、不识别第二个参数价格,所以, 你用上图中的10个价格之外的价格,在回测系统不起作用,比如实时突破压力线,代码中用压力线的价格成交,BUY(突破, 压力线),实际…

光缆地图网站

光缆地图网站几个全球公认最权威、最好用的光缆地图网站,各有特色: 1. 行业标准级:TeleGeography Submarine Cable Map 这是全球电信行业最权威的数据来源,也是 UI 做得最好看的。网址:https://www.submarinecabl…

AE表达式

--本篇导航--如何使用表达式(打开删除,查看图形,错误)表达式的数组、赋值输入表达式、优先级一些常用的表达式(value,time,index,wiggle,random,loopOut,Math,if…else)表达式控制一些现成的表达式(可以…

2025 Xhorse XDTPM1EN Universal Programmable TPMS Sensor: Supports 315/433MHz Key Tool Max Pro/MIDI

The 2025 Xhorse XDTPM1EN TPMS Sensor: Solving Your Tire Pressure Monitoring Challenges Problem Identification: The Frustrations of Traditional TPMS Sensors For European and American automotive professi…

2025年金蝶ERP服务商实施能力强、服务好——上海宝蝶深耕金蝶ERP管理系统、金蝶财务软件

随着企业数字化转型的加速,选择一款优秀的ERP系统是第一步,而找到一个具备超强实施能力的服务商,才是项目成功的关键。金蝶ERP作为市场主流选择,其代理商数量众多,但实施交付的专业度、成功率和行业适配性却天差地…

【论文阅读】DeltaLag: Learning Dynamic Lead-Lag Patterns in Financial Markets

【论文阅读】DeltaLag: Learning Dynamic Lead-Lag Patterns in Financial Markets在小红书上刷到的,之前没见过 lead-lag effect。这里算是头一次学习。 lead-lag effect 讲了一个简单的故事,例如 yubai 说一般 btc…

Xhorse XDTPM1EN Universal Programmable TPMS Sensor 4pcs/lot – 315/433MHz for Key Tool Max Pro/MIDI

The TPMS Challenge: Safety, Reliability, and Compliance at Stake In the world of automotive maintenance, tire pressure monitoring systems (TPMS) are non-negotiable for safety, legal compliance, and veh…

AI元人文:从价值对齐到价值共生的范式革命,及其在社会治理中的实践验证

AI元人文:从价值对齐到价值共生的范式革命,及其在社会治理中的实践验证 摘要: 本文旨在阐述“AI元人文”这一理论体系如何完成从哲学构想(“描述的哲学”)到实践方法论(“生成的语法”)的关键跃迁。我们通过一个…

深入解剖 Redis 分布式锁:从 SETNX 到 Redlock 的演进之路

深入解剖 Redis 分布式锁:从 SETNX 到 Redlock 的演进之路深入解剖 Redis 分布式锁:从 SETNX 到 Redlock 的演进之路摘要:在微服务与分布式架构中,“如何防止资源被并发抢占”是一个永恒的话题。从秒杀扣库存到定时…

闲话 25.11.26

那些你不要的:一道码力为主,没啥数学的 poly 题题解闲话 ZJUPH 恶心死我了。puzzle hunt 不好玩 😭 [数据删除] 敬请期待赛后 write-up。能完赛吗? 怎么快一个月没写鲜花了 /jk 正好投了一个题,写一下鲜花,顺便…

oop-实验4 - fg

task1 GradeCalc.hpp1 #pragma once2 3 #include<vector>4 #include<array>5 #include<string>6 7 class GradeCalc{8 public:9 GradeCalc(const std::string &cname); 10 void input(i…

揭开 Kafka 水位线的秘密:深度解析 LEO 与 HW 的同步机制

揭开 Kafka 水位线的秘密:深度解析 LEO 与 HW 的同步机制揭开 Kafka 水位线的秘密:深度解析 LEO 与 HW 的同步机制摘要:在分布式存储中,数据复制是保证高可用的核心。但你是否想过:Follower 是怎么把数据从 Leade…

INFINI Labs 产品更新 - Coco AI v0.9 与 Easysearch v2.0 全新功能上线,全面支持 GitLab 合并请求(MR)自动 AI Review

此次更新主要包括:Coco AI v0.9 全面支持 GitLab 合并请求(MR)自动 AI Review,并重构为插件流水线架构,新增 Neo4j、MongoDB 等 10+ 数据源连接器,开启“AI+开发”协同新范式;Easysearch v2.0 正式发布,内置轻…

newDay23

1.今天好好把javaweb弄了一遍,终于是实现了所有要求的功能,然后就是团员的事也弄了半天 2.明天再熟悉熟悉javaweb,争取快速过关 3.今天没啥问题

【C语言】条件编译时谨慎使用枚举值

简短不看版: 关键原则预处理器只认识 #define 宏在需要计算的地方(#if, #elif):所有标识符必须有数值未定义的标识符被当作0 枚举类型在编译阶段才被处理在条件编译 (#if, #elif) 中必须使用宏定义,不能使用枚举值…

[源码系列:手写Spring] AOP第二节:JDK动态代理 - 当AOP遇见动态代理的浪漫邂逅

"在AI可以自动生成代码的今天,为什么还要读源码?因为理解原理才能让我们从代码的使用者变成创造者!"最近AI的崛起确实让技术圈发生了翻天覆地的变化,博主之前的源码解析栏目也因此沉寂了一段时间。不过,…

黑马点评完结!

最近黑马点评已经完结! 高级篇的最后一章没看,也是感觉有点赶了,做完多级缓存就结束了!完结撒花! 明天写实习项目,目标是建好表,尽量读取数据进行修改都完成吧! 之后准备一下简历,学会自己word搭建简历模板。…