高级 #distributed#consensus#raft

一致性协议(Paxos, Raft)

一致性协议让分布式系统中的节点对某个值达成共识——Paxos 是理论基础但难理解,Raft 通过强领导者简化了共识过程,是 etcd/Consul 的核心

🤝 几个人做出”同一个决定”

几个同学要决定晚上去哪吃饭。每个人有自己的想法——但最终所有人必须达成同一个决定。

  • 如果大家坐在一起讨论——直接投票就行
  • 但是:如果有人在线上(网络可能断)、有人可能迟到(节点可能挂)、消息可能延迟——怎么”达成共识”?

共识(Consensus) 就是:在分布式系统中,让所有正常运行的节点同一个值达成一致——即使有节点故障或网络问题。


🏛️ Raft——通过选举领导者达成共识

Raft 把共识问题分解为三个独立的子问题:

1️⃣ 领导者选举(Leader Election):选出一个节点当"班长"
2️⃣ 日志复制(Log Replication):班长把决定通知所有人
3️⃣ 安全性(Safety):如果有足够多人确认了——就是最终决定

三个角色

角色状态职责
领导者(Leader)正常时只有一个处理请求,管理日志复制
跟随者(Follower)大多数节点被动接受领导者的指令
候选者(Candidate)选举中发起新的领导者选举

Raft 工作流程

正常状态(有领导者):
客户端 ──请求──→ 领导者 ──复制日志──→ 所有跟随者
                    ←──确认收到────
                多数确认 → 日志提交 → 通知客户端

领导者挂了:
跟随者1(等超时) → 变成候选者 → 发起选举投票
              → 获得多数票 → 成为新领导者
              → 开始处理新请求

关键规则:一个 term(任期)内最多只能有一个领导者
         → 保证不会出现"两个人都以为自己是班长"
# Raft 的简化版——判断"什么时候日志算提交了?"
# 如果领导者把日志复制到了多数节点(N/2 + 1)
# → 日志已提交 → 不会丢失

🏪 **类比:班长决定”

Raft = 全班选班长。班长做决定,通知全班。如果班长联系不上了——重新选一个新的。

关键保证:一个”任期”内只有一个班长——不会出现”两个班长同时发命令”的混乱。

只要大多数同学都收到了班长的通知——这个决定就”生效”了(已提交)。即使有少数同学没收到——等他们恢复后,新班长会补发。


📜 Paxos——理论上的”始组”

Paxos 比 Raft 更早(1990 年由 Leslie Lamport 提出),也更难理解。Raft 可以理解为”Paxos 的简化版”。

Paxos 核心矛盾:不用选举领导者也能达成共识
→ 更复杂(Lamport 的原始论文以"一个议员的故事"形式写——没人看得懂)
→ 更难实现

Raft 的贡献:用"强领导者"简化了共识
→ 更易理解 → 更容易正确实现
→ 成为 etcd、Consul 等主流工具的基础

🏢 实际应用

工具使用的共识协议用途
etcdRaftKubernetes 的核心——存储集群配置
ConsulRaft服务发现、配置管理
ZooKeeperZab(类 Raft)Hadoop 生态的协调服务
TiDBRaft分布式数据库——Raft 保证数据一致性

📝 小结

概念一句话
共识(Consensus)所有正常节点对同一个值达成一致
Raft通过选举领导者来简化共识过程
多数确认日志复制到多数节点(N/2+1)后即为已提交
领导者选举领导者挂了 → 跟随者超时 → 发起新选举
Paxos共识协议的理论基础——比 Raft 更难理解和实现

为什么先学这个? 共识是可靠性的基础。有了共识,才能构建分布式存储(GFS, HDFS)分布式计算(MapReduce)