Raft 101
文章目录
前言
在分布式系统中,一致性共识协议是保证多个节点达成同一状态的核心技术。虽然 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 分为三个主要阶段:
-
Leader 选举 节点间通过心跳检测故障并发起投票选出一个 Leader。
-
日志复制(Log Replication) 所有写入请求由 Leader 接收并复制到 Follower,半数以上确认后提交。
-
安全提交(Commit) Leader 确认多数节点写入后,提交并通知 Follower 应用状态变更。
角色分类:
- Leader:唯一处理客户端请求。
- Follower:被动响应 Leader 或 Candidate。
- Candidate:在选举时发起投票的节点。
属性与指标
Raft 关注以下属性与性能指标:
-
线性一致性(Linearizability) 所有客户端看见的数据变化顺序一致。
-
容错性(Fault Tolerance) 能容忍少数节点宕机(2f+1 中允许 f 节点失败)。
-
可恢复性 节点崩溃后重启可恢复状态,日志持久化保障一致性。
-
选举安全性 同一任期只能有一个 Leader。
-
高可用性 Leader 故障后快速重新选举保持服务不中断。
-
日志压缩 通过快照和日志截断减少存储压力。
类型
日志复制机制
- AppendEntries:Leader 向 Follower 发送日志条目。
- Leader Commit Rule:Leader 只有在某日志条目被大多数节点存储时,才可提交该条目。
- Log Matching:相同任期和索引的日志应保证内容一致。
选举机制
- 随机超时触发选举
- 投票请求(RequestVote)
- Leader 心跳(Heartbeat)保持统治
日志压缩方式
- 快照(Snapshot)
- InstallSnapshot RPC
- 日志截断
应用场景与程序关系
场景 | 是否适用 Raft | 说明 |
---|---|---|
分布式协调服务 | ✅ | 适合高一致性系统,如分布式锁 |
主从切换与容灾 | ✅ | 自动 Leader 选举 |
分布式 KV 存储 | ✅ | 一致性写入,事务支持 |
异步副本系统 | ❌ | 不适合 eventual consistency 场景 |
大规模区块链 | ❌ | 不适合开放网络的共识需求 |
编程关系:
- 推荐使用已有实现:如 etcd(Go 实现)、Consul(Go)、Hashicorp Raft。
- 适用于小规模强一致集群:如配置中心、数据库集群等。
- 写入延迟受限于同步复制:网络 RTT 会直接影响写性能。
常用基于 Raft 的系统
- etcd:Kubernetes 的核心组件,保存集群状态。
- Consul:服务发现与配置管理平台。
- TiKV:分布式事务型 KV 数据库,TiDB 存储引擎。
- Rqlite:基于 SQLite 的分布式数据库。
- CockroachDB(部分借鉴):NewSQL 数据库,参考 Raft 设计。
参考
文章作者 沉风网事
上次更新 2018-10-24