3. etcd 核心原理:Raft共识算法、MVCC、事务隔离级别、WAL与快照机制
etcd 作为云原生控制面的“状态中枢”,其可靠性、一致性与性能直接决定了整个集群的稳定性。本章深入剖析 etcd 的五大核心支柱:Raft 共识算法、MVCC 多版本并发控制、事务隔离级别、WAL 预写日志与快照机制。理解这些原理是后续进行压测沙盘性能调优与瓶颈定位的基础。
3.1 Raft 共识算法:分布式一致性的基石
Raft 是一种易于理解的分布式共识算法,它通过“选举”和“日志复制”来保证集群中多个节点数据的一致性。etcd 使用 Raft 确保即使部分节点故障,集群仍能对外提供强一致性的服务。
(n/2)+1 个节点确认。在 3 节点集群中,Leader 必须等待至少 2 个节点(包括自己)写入成功才能返回客户端。这是 etcd 写入延迟的主要来源之一。
3.2 MVCC 与事务隔离级别
etcd 使用 MVCC(多版本并发控制) 来支持高并发读写,并提供了 可序列化快照隔离(SSI) 级别的事务保证。
3.2.1 MVCC 工作原理
每次对 key 的修改都会生成一个新的版本(revision),旧版本数据不会被立即覆盖,而是保留一段时间供历史查询或并发事务使用。etcd 通过一个全局递增的 revision 主版本号来标识每一次写操作。
| 概念 | 说明 | 性能影响 |
|---|---|---|
| Revision | 全局单调递增的主版本号,每次事务提交时递增 | 高并发下 revision 分配可能成为瓶颈 |
| KeyValue | 存储 key、value、create_revision、mod_revision、version | 版本字段占用额外存储空间 |
| 历史版本 | 旧版本数据存储在 BoltDB 中,通过 revision 索引 | 历史版本过多会导致查询变慢、存储膨胀 |
| 压缩(Compaction) | 定期删除指定 revision 之前的历史版本 | 压缩操作本身消耗 I/O,需合理配置 |
3.2.2 事务隔离级别:可序列化快照隔离(SSI)
etcd 的事务隔离级别介于“可重复读”和“可序列化”之间,称为 可序列化快照隔离(SSI)。事务开始时,etcd 会获取一个当前最新的 revision 作为快照,事务内的所有读操作都基于这个快照进行,从而避免了脏读、不可重复读和幻读。
txn API 提供了原子性的比较与提交能力。
3.3 WAL 与快照机制:数据持久化与恢复
etcd 的数据持久化依赖两大组件:WAL(Write-Ahead Log,预写日志) 和 快照(Snapshot)。它们共同保证了数据的完整性和高效的恢复能力。
3.3.1 WAL 预写日志
所有对 etcd 数据的修改操作,在应用到内存状态机之前,必须先追加写入到 WAL 文件中。WAL 是顺序追加写入的,因此写入性能非常高。WAL 文件按段(segment)进行管理,每个段文件大小默认为 64MB。
# WAL 文件结构示例(数据目录下)
/member/wal/
├── 0000000000000000-0000000000000000.wal
├── 0000000000000001-0000000000000001.wal
└── 0000000000000002-0000000000000002.wal
# 每个 WAL 记录包含:
# - 类型(Type):Entry(日志条目)或 Metadata(元数据)
# - CRC 校验和:用于数据完整性校验
# - 数据:序列化的 Raft 日志条目
3.3.2 快照机制
随着 WAL 日志的不断增长,etcd 会定期创建快照(Snapshot)来压缩日志。快照是 etcd 在某个时间点内存状态的全量持久化副本。创建快照后,该时间点之前的所有 WAL 日志都可以被安全删除。
3.3.3 恢复流程
当 etcd 节点重启时,恢复流程如下:
- 加载最新快照:从快照文件中读取全量状态,快速恢复到快照创建时刻。
- 重放 WAL 日志:从快照之后的最新 WAL 段开始,顺序重放所有日志条目,将状态机更新到最新状态。
- 参与 Raft 集群:恢复完成后,节点作为 Follower 加入集群,开始接收新的日志条目。
--snapshot-count 参数(默认 100,000 次事务触发一次快照)。
3.4 核心原理总结
| 组件 | 核心作用 | 性能关注点 |
|---|---|---|
| Raft | 保证分布式一致性,Leader 选举与日志复制 | 网络延迟、磁盘 fsync 延迟、选举风暴 |
| MVCC | 支持高并发读写,提供快照隔离 | 历史版本膨胀、revision 分配竞争 |
| 事务隔离 | 可序列化快照隔离(SSI) | 写偏序需应用层通过条件更新规避 |
| WAL | 顺序追加写入,保证数据持久性 | 磁盘写入延迟直接影响写入延迟 |
| 快照 | 压缩 WAL 日志,加速节点恢复 | 快照创建频率与 I/O 开销的平衡 |