前言

在分布式系统中,一致性共识协议是保证多个节点达成同一状态的核心技术。虽然 Paxos 提供了理论基础,但它实现复杂、理解困难。为此,Raft 协议应运而生,目标是更易理解、实现且具备等价安全性。

如今,许多主流系统如 etcd、Consul、TiKV 都基于 Raft 构建,是工程实践中最受欢迎的共识协议之一。


定义

wiki 定义如下:

Raft is a consensus algorithm designed as an alternative to Paxos, with the goal of being more understandable.

一句话:Raft 是一种用于构建高一致性分布式系统的共识协议,以简单易懂著称。


工作原理

一句话:通过选举 Leader 并由其统一处理客户端请求,实现复制日志并达成一致状态。

Raft 分为三个主要阶段:

  1. Leader 选举 节点间通过心跳检测故障并发起投票选出一个 Leader。

  2. 日志复制(Log Replication) 所有写入请求由 Leader 接收并复制到 Follower,半数以上确认后提交。

  3. 安全提交(Commit) Leader 确认多数节点写入后,提交并通知 Follower 应用状态变更。

角色分类:

  • Leader:唯一处理客户端请求。
  • Follower:被动响应 Leader 或 Candidate。
  • Candidate:在选举时发起投票的节点。

属性与指标

Raft 关注以下属性与性能指标:

  1. 线性一致性(Linearizability) 所有客户端看见的数据变化顺序一致。

  2. 容错性(Fault Tolerance) 能容忍少数节点宕机(2f+1 中允许 f 节点失败)。

  3. 可恢复性 节点崩溃后重启可恢复状态,日志持久化保障一致性。

  4. 选举安全性 同一任期只能有一个 Leader。

  5. 高可用性 Leader 故障后快速重新选举保持服务不中断。

  6. 日志压缩 通过快照和日志截断减少存储压力。


类型

日志复制机制

  1. AppendEntries:Leader 向 Follower 发送日志条目。
  2. Leader Commit Rule:Leader 只有在某日志条目被大多数节点存储时,才可提交该条目。
  3. Log Matching:相同任期和索引的日志应保证内容一致。

选举机制

  1. 随机超时触发选举
  2. 投票请求(RequestVote)
  3. Leader 心跳(Heartbeat)保持统治

日志压缩方式

  1. 快照(Snapshot)
  2. InstallSnapshot RPC
  3. 日志截断

应用场景与程序关系

场景 是否适用 Raft 说明
分布式协调服务 ✅ 适合高一致性系统,如分布式锁
主从切换与容灾 ✅ 自动 Leader 选举
分布式 KV 存储 ✅ 一致性写入,事务支持
异步副本系统 ❌ 不适合 eventual consistency 场景
大规模区块链 ❌ 不适合开放网络的共识需求

编程关系:

  1. 推荐使用已有实现:如 etcd(Go 实现)、Consul(Go)、Hashicorp Raft。
  2. 适用于小规模强一致集群:如配置中心、数据库集群等。
  3. 写入延迟受限于同步复制:网络 RTT 会直接影响写性能。

常用基于 Raft 的系统

  1. etcd:Kubernetes 的核心组件,保存集群状态。
  2. Consul:服务发现与配置管理平台。
  3. TiKV:分布式事务型 KV 数据库,TiDB 存储引擎。
  4. Rqlite:基于 SQLite 的分布式数据库。
  5. CockroachDB(部分借鉴):NewSQL 数据库,参考 Raft 设计。

参考