↓ 跳过正文

从零理解 Raft:示例长文档

·2 分钟

这篇文档是 HTML 长文档通道的示例。源文件是 content/posts/raft/index.html,正文只保留片段,不带 html、head、body 外壳。

为什么需要共识

单机系统只需要一个写入者;一旦复制到多台机器,就必须在“部分节点不可用”的前提下仍然对同一顺序达成一致。Raft 把这个问题拆成三块:选举、日志复制和安全性。

节点只有三种状态:Follower、Candidate、Leader。任意时刻最多一个 Leader,任期号单调递增。

选举流程

  1. Follower 在选举超时后转为 Candidate,任期加一,并向其他节点拉票。
  2. 获得多数票的 Candidate 成为 Leader,开始发送心跳。
  3. 如果收到任期更大的消息,立即退回 Follower。
状态行为
Follower被动接收日志与心跳
Candidate发起投票,等待多数派
Leader接收写入并复制日志

日志复制

Leader 把客户端请求追加为日志条目,并行发送给所有 Follower。多数节点确认后条目即为已提交,随后在状态机上按序应用。

AppendEntries(term, leaderId, prevLogIndex, prevLogTerm, entries, leaderCommit)

Follower 只有在 prevLogIndex 与 prevLogTerm 都匹配时才接受新条目,否则拒绝并要求 Leader 回退。

与 RSS 的关系

这篇文档会以全文进入 /rss.xml,正文 HTML 做 XML 转义后放入 content:encoded。订阅器里保留语义结构,但不保证站内样式;页面样式只作用于站点本身。