2. etcd 架构与数据模型:Raft 共识、键值存储与 MVCC

etcd 是一个高可用的分布式键值存储系统,其核心架构围绕 Raft 共识算法、有序键值存储和多版本并发控制(MVCC)三大支柱构建。理解这三者之间的协作关系,是制定灾备策略、评估 RPO 目标的基础。

2.1 Raft 共识机制:分布式一致性的基石

etcd 使用 Raft 算法来保证集群中多个节点之间的数据一致性。Raft 将节点划分为三种角色,并通过领导者选举和日志复制来达成共识。

角色 职责 灾备关联
Leader(领导者) 处理所有客户端写入请求,管理日志复制,定期发送心跳。 Leader 节点故障将触发重新选举,期间写入不可用。
Follower(跟随者) 被动接收 Leader 的日志复制,响应 Leader 和 Candidate 的请求。 Follower 节点可用于读取(线性一致性读),也可作为灾备恢复的数据源。
Candidate(候选者) 在选举超时后发起领导者选举,争取成为新 Leader。 选举过程需要多数节点(quorum)存活,直接影响集群可用性。
关键指标:Raft 要求集群中超过半数(N/2 + 1)的节点存活才能正常提供服务。例如,3 节点集群允许 1 个节点故障;5 节点集群允许 2 个节点故障。这是灾备设计中计算最小集群规模的核心依据。
Raft 共识机制流程 Raft 共识机制:领导者选举与日志复制 Leader 处理写入 · 复制日志 Follower 被动复制 · 提供读取 Follower 被动复制 · 提供读取 日志复制 日志复制 Leader 心跳超时 → Follower 转为 Candidate → 发起选举 → 获得多数投票 → 成为新 Leader 选举期间(通常 50-200ms)集群不可写入,但可读取已提交数据 • 写入必须由 Leader 处理,并复制到多数节点后才算提交(committed) • 灾备恢复时,必须从多数节点或最新快照中恢复数据,避免丢失已提交日志

2.2 键值存储结构:有序的扁平化数据模型

etcd 的存储模型是一个扁平的、有序的键值空间。所有数据都以键值对的形式存储,并且键按照字典序(byte-wise lexicographic order)进行排序。这种有序性使得范围查询(Range Query)非常高效。

  • Key(键):字节数组,支持任意二进制数据,但通常使用可读字符串。
  • Value(值):字节数组,存储与键关联的数据。
  • Revision(修订版本):全局单调递增的整数,每次写入(Put/Delete/Txn)都会生成一个新的 revision。
  • Lease(租约):一种 TTL 机制,关联的键会在租约到期后自动删除。
操作 说明 对 Revision 的影响
Put 写入或更新一个键值对 生成一个新的 revision
Get 读取一个键或一个范围内的键 不生成 revision
Delete 删除一个键或一个范围内的键 生成一个删除标记(tombstone)的 revision
Txn(事务) 原子性地执行一组条件判断和操作 根据内部操作生成一个或多个 revision
灾备提示:备份时,除了保存键值数据本身,还必须记录备份时刻的 revision。恢复时,可以通过指定 revision 实现时间点恢复(Point-in-Time Recovery),这是对齐 RPO 目标的关键手段。

2.3 MVCC 多版本并发控制:支持快照与历史查询

etcd 通过 MVCC 机制实现高效的并发控制,同时为备份恢复提供了天然的快照能力。每次写入操作不会原地覆盖旧值,而是创建一个新版本。

MVCC 多版本并发控制结构 MVCC 多版本并发控制:键的版本链 Key: /app/config Revision: 100 Revision: 150 Revision: 200 (当前) MVCC 核心特性 • 每次写入创建新版本 • 旧版本不会被立即删除 • 读取可指定 revision 实现快照读(Snapshot Read) • 后台压缩(Compaction) 定期清理旧版本释放空间

2.4 数据模型与灾备恢复的映射关系

理解 etcd 的数据模型,可以直接指导灾备策略的设计:

数据模型特性 灾备恢复应用 RPO 影响
Raft 日志复制 从 Follower 节点备份数据,避免影响 Leader 性能 日志复制延迟决定 RPO 下限
有序键值空间 支持增量备份:只备份自上次备份以来修改的键范围 增量备份可缩短备份窗口,降低 RPO
MVCC 版本链 支持时间点恢复:恢复到指定 revision 的历史状态 精确到单个写入操作的 RPO
Revision 全局单调递增 作为备份的“水位线”标记,确保恢复数据的一致性 避免部分恢复导致的数据不一致
重要警告:etcd 的 MVCC 后台压缩(Compaction)会定期删除旧版本数据。如果备份频率低于压缩频率,将无法恢复到较早的时间点。灾备策略必须确保备份周期短于 etcd 的 --auto-compaction-retention 配置周期。

2.5 核心组件协作关系

etcd 内部各组件如何协同工作,完成一次写入操作?

  1. 客户端向 Leader 节点发起 Put 请求。
  2. Raft 模块将请求封装为日志条目,并复制到所有 Follower 节点。
  3. 当多数节点确认写入后,日志条目被标记为已提交(committed)。
  4. MVCC 模块将日志条目应用到键值存储,生成一个新的 revision。
  5. 后端存储(Backend)将数据持久化到 BoltDB(etcd v3 的底层存储引擎)。

这个流程决定了灾备恢复的两个关键点:

  • Raft 日志是数据一致性的第一道防线,备份 Raft 日志可以实现接近零 RPO 的持续复制。
  • MVCC 快照是数据恢复的最终载体,定期创建快照备份是满足 RPO 目标的最可靠手段。