Raft 將一致性問題分解為三個相對獨立的子問題:**領導者選舉**、**日誌複制**、**安全性**,並透過強領導者模型、任期號、日誌連續性等機制,達成比 Paxos 更易理解、更易工程實現的一致性協議。本文系統整理 Raft 核心機制、流程細節、工程落地要點與常見問題。
| 術語 | 說明 |
|---|---|
| Leader | 唯一處理寫入請求的節點,發送心跳/日誌維持權威 |
| Follower | 被動接收請求,轉發寫入給 Leader |
| Candidate | 選舉過程中臨時角色,發起 RequestVote |
| Term (任期) | 邏輯時鐘,單調遞增,每次選舉產生新 Term |
| Log Index | 日誌條目序號,從 1 開始單調遞增 |
| Quorum (多數派) | N/2+1 節點,確保任兩個 Quorum 至少有一個交集 |
| Commit Index | 已提交的最高日誌索引,可應用到狀態機 |
| Election Timeout | 隨機化超時 (150-300ms),避免選票分裂 |
electionTimeout 內未收到 Leader 的 AppendEntries (含心跳)。RequestVote(term, candidateId, lastLogTerm, lastLogIndex) 給所有節點。
3. 等待回應,三種結果:
lastLogTerm 較大者較新;Term 相同則比 lastLogIndex 較大者較新。electionTimeout ∈ [150ms, 300ms] 隨機選取。最先超時的節點最先發起選舉,大概率單獨完成選舉,避免多 Candidate 互搶選票導致無 Leader (Live Lock)。
AppendEntries(term, leaderId, prevLogIndex, prevLogTerm, entries[], leaderCommit) 給所有 Follower。
3. 等待多數派回應成功。
4. 推進 commitIndex,應用到狀態機,回應客戶端成功。
5. 後續心跳帶上新 leaderCommit,Follower 推進各自 commitIndex 應用。
prevLogIndex 處無日誌或 Term 不匹配 → 回 false (日誌不連續)。
3. 衝突處理:刪除 prevLogIndex 之後所有衝突條目,追加 Leader 發送的新條目。
4. 成功 → 回 true,更新 commitIndex = min(leaderCommit, lastNewIndex)。
nextIndex (下一條要發送的索引) 與 matchIndex (已確認匹配的最高索引)。nextIndex-- 重試,直到找到匹配點 (指數退避優化:每次退一個 Term)。nextIndex = matchIndex + 1。只有 CurrentTerm 產生的條目 經多數派確認才可提交。舊 Term 條目隨新條目提交間接確認 (圖示參考論文 Figure 8)。
(lastIncludedIndex, lastIncludedTerm)nextIndex 落後超過閾值 (或新節點加入) → 觸發 InstallSnapshot。(term, leaderId, lastIncludedIndex, lastIncludedTerm, offset, data[], done)。
lastIncludedIndex 前日誌、載入狀態機。
從 C_old 遷移至 C_new,引入過渡配置 C_old-new (Joint Consensus)。
C_old-new 配置條目,複制至多數派 (需同時在 C_old 和 C_new 達多數派)。C_old-new 提交後,任何節點收到即採用新配置判斷多數派。
3. Leader 建立 C_new 配置條目,複制提交。
4. C_new 提交後,不在 C_new 的節點可安全下線。
任意時刻 最多只有一個 Leader。階段 1-3 只有 C_old 節點能當選;階段 4-6 只有含 C_old-new 節點能當選;階段 7-8 只有 C_new 節點能當選。
| 參數 | 建議值 | 說明 |
|---|---|---|
| heartbeatInterval | 50-100ms | 遠小於 electionTimeout |
| electionTimeout | 150-300ms (隨機) | ≫ heartbeatInterval,≪ MTBF |
| maxAppendEntriesSize | 1-4 MB | 批次複制大小,平衡延遲與頻寬 |
| snapshotThreshold | 10k-100k entries | 觸發快照的日誌長度 |
| snapshotInterval | 30-60min | 定期快照間隔 |
broadcastTime ≪ electionTimeout ≪ MTBF。Raft 以「可理解性」為設計目標,將一致性拆解為選舉、複制、安全三模組,配合強領導者、日誌連續、任期號等機制,成為工業界分散式一致性的主流選擇。深入掌握其細節,是構建高可用分散式系統的必修課。