从零学会 Raft:分布式系统的“班长选举术”
一、Raft 是什么?
想象你和几个朋友在群里商量今晚吃什么:
- 有人提议吃火锅,有人提议吃烧烤。但网络不好,有人掉线、消息乱序,甚至有人中途改主意。你们必须达成一致:今晚到底吃什么?
- Raft 就是为了解决这个问题的算法!它让多个节点(服务器)即使在网络延迟、节点宕机的情况下,也能就某个值(比如“吃火锅”)达成一致。
二、Raft 的核心机制
1. Leader Election(班长选举)
- 问题:谁来当班长?
- 规则:
- 所有节点初始状态是 Follower(学生)。
- 如果某个 Follower 等待太久了没收到 Leader 的消息,它会变成 Candidate(竞选者),发起选举。
- Candidate 向其他节点发送投票请求,获得多数票后成为 Leader(班长)。
类比:
- 举手投票:Candidate 像班长候选人,向同学(Follower)举手求票。
- 票数过半:谁获得多数票,谁就当班长(Leader)。
2. Log Replication(日志复制)
- 问题:班长(Leader)决定后,怎么让所有人同步?
- 规则:
- Leader 接收客户端请求(比如“明天春游”),将指令写入自己的日志。
- Leader 把日志同步给其他 Follower,确保所有节点数据一致。
- 当多数节点确认收到日志后,Leader 提交日志并返回结果给客户端。
类比:
- 班长通知全班:Leader 像班长,把任务写在黑板上,确保每个人都知道。
- 少数服从多数:只要半数以上同学抄下黑板内容,任务就生效。
3. Safety(安全性)
- 问题:如果出现多个 Leader,怎么办?
- 规则:
- 每个 Leader 有唯一的 Term(任期),确保同一时间只有一个 Leader。
- 如果 Follower 收到旧 Term 的请求,会拒绝(防止“假班长”干扰)。
- 日志必须连续,不能跳过(比如不能直接从第 1 条跳到第 3 条)。
类比:
- 任期编号:班长任期有编号(Term 1, Term 2…),新班长必须任期更大。
- 防作弊:旧班长的签名无效,只有现任班长的指令才被认可。
4. Membership Change(成员变更)
- 问题:班级有人转学,怎么更新成员名单?
- 规则:
- 使用 Joint Consensus(联合共识):逐步替换成员,确保过渡期间数据一致性。
- 先让新旧成员同时参与决策,再逐步退出旧成员。
类比:
- 班级扩编:先让新同学加入班级群,再正式加入班级名单,避免混乱。
三、Java 实现 Raft 的核心代码
// Candidate:竞选者
class Candidate {
public void startElection()

最低0.47元/天 解锁文章
2357

被折叠的 条评论
为什么被折叠?



