1. etcd 基础与架构

1.1 etcd 核心概念

etcd 是一个分布式、可靠的键值存储系统,用于分布式系统中的关键数据存储和服务发现。它是云原生计算基金会(CNCF)的毕业项目,也是 Kubernetes 的核心组件。

核心概念 说明 关键特性
Key-Value 存储 以分层目录结构组织键值对,支持前缀查询和范围查询 有序键空间、TTL 自动过期、Watch 机制
Raft 共识算法 保证集群中所有节点数据一致性的分布式共识协议 强一致性、Leader 选举、日志复制
MVCC 多版本并发控制 每个键维护多个历史版本,支持时间旅行查询 Revision 机制、压缩清理旧版本
Watch 机制 客户端可以监听键的变化,实现事件驱动架构 实时推送、支持前缀和范围监听
Lease 租约 轻量级心跳机制,用于键的自动过期和分布式锁 TTL 续约、与 Key 绑定、KeepAlive
运维要点:etcd 的 MVCC 机制是备份恢复的关键——全量备份保存当前快照,增量备份基于 Revision 范围捕获变更。理解 Revision 的单调递增特性,有助于设计 RPO 更优的备份策略。

1.2 Raft 共识算法原理

Raft 是一种易于理解的分布式共识算法,通过 Leader 选举、日志复制 和 安全性 三个核心机制保证集群数据一致性。etcd 使用 Raft 作为其一致性引擎。

1.2.1 节点角色与状态转换

角色 职责 状态转换条件
Leader 处理所有客户端请求,管理日志复制,发送心跳 获得多数派投票后成为 Leader
Follower 被动响应 Leader 和 Candidate 的请求 启动时默认为 Follower;选举超时后转为 Candidate
Candidate 发起 Leader 选举,请求其他节点投票 获得多数派投票转为 Leader;否则退回 Follower
Raft 核心原则:一个 Term(任期)内最多只有一个 Leader;日志条目一旦被多数节点复制即视为已提交(Committed);Leader 只能追加新日志,不能覆盖已提交的日志。
Raft 节点角色状态转换图 Leader Follower Candidate 选举超时 获得多数派投票 发现更高 Term 选举超时或发现 Leader 说明: 1. 集群启动时所有节点为 Follower,等待随机超时后发起选举。 2. Candidate 获得超过半数(N/2+1)投票即成为 Leader。 3. Leader 定期发送心跳维持权威,Follower 超时未收到心跳则发起新选举。

1.2.2 日志复制流程

  1. 客户端请求:客户端将写请求发送到 Leader。
  2. 追加日志:Leader 将请求封装为日志条目,追加到本地日志。
  3. 并行复制:Leader 并行向所有 Follower 发送 AppendEntries RPC。
  4. 多数派确认:当 Leader 收到多数节点(含自身)的成功响应后,日志条目进入 Committed 状态。
  5. 应用到状态机:Leader 将已提交的日志应用到状态机,并返回结果给客户端。
  6. 异步应用:Follower 在后续心跳中得知日志已提交,异步应用到本地状态机。
备份关联:Raft 日志复制保证已提交的日志不会丢失,但未提交的日志在 Leader 故障时可能丢失。备份策略必须考虑这一特性——全量快照 + WAL 日志的增量备份组合,才能覆盖已提交的所有数据。

1.3 etcd 集群架构与角色

etcd 集群采用 对等架构,所有节点通过 Raft 协议通信。典型的生产部署为 3 节点或 5 节点集群,以平衡可用性和性能。

1.3.1 集群节点角色

角色 功能 数据状态 可投票
Voting Member 参与 Raft 投票和日志复制,存储完整数据 完整数据副本 是
Learner 仅从 Leader 接收日志,不参与投票,用于扩容或灾备 追赶中,最终一致 否
生产建议:Learner 节点非常适合作为备份目标——它不参与 Raft 投票,不会影响集群的写入性能,同时保持数据的最终一致性,可以作为备份数据源。

1.3.2 集群架构组件

etcd 集群架构与组件 Client (API v3) Leader 节点 处理读写请求 Follower 节点 1 日志复制 + 投票 Follower 节点 2 日志复制 + 投票 每个节点内部组件 Raft 状态机 WAL 日志 MVCC 存储 Snapshot WAL:预写日志,记录所有操作,用于故障恢复 Snapshot:定期压缩的快照,减少 WAL 回放时间

1.3.3 集群规模与容错

集群节点数 最大容忍故障数 推荐场景 写入性能
3 1 生产环境最小配置 高
5 2 高可用关键业务 中
7 3 跨地域部署 低
备份与集群规模的关系:节点数越多,Raft 日志复制开销越大,写入延迟增加。备份窗口应避开业务高峰期;对于 5 节点集群,建议使用 Learner 节点作为备份源,避免对 Voting Member 产生额外负载。

1.4 关键数据流与备份切入点

理解 etcd 的数据写入路径,有助于确定备份的最佳切入点和恢复策略。

  1. 客户端写入 → gRPC 请求到达 Leader 的 API 层。
  2. WAL 持久化 → 写入预写日志(WAL),保证崩溃恢复。
  3. Raft 复制 → 并行发送到 Follower,等待多数派确认。
  4. 状态机应用 → 日志提交后应用到 MVCC 存储引擎。
  5. Snapshot 压缩 → 定期生成快照,清理旧版本数据。
备份关键点:etcd 的备份必须包含 数据目录(含 WAL 和 Snapshot)或使用 etcdctl snapshot save 命令。仅备份 Snapshot 而不备份 WAL,会丢失两次 Snapshot 之间的增量数据,导致 RPO 不可控。
# 全量快照备份命令
etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/etcd/ca.pem \
  --cert=/etc/etcd/client.pem \
  --key=/etc/etcd/client-key.pem \
  snapshot save /backup/etcd-snapshot-$(date +%Y%m%d%H%M%S).db

# 查看快照状态
etcdctl snapshot status /backup/etcd-snapshot-20250301120000.db -w table
RPO 优化思路:全量快照 + WAL 增量备份的组合策略,可以将 RPO 从小时级降低到分钟级。WAL 文件默认每 10MB 或每 5 分钟滚动一次,增量备份可以捕获这些滚动文件,实现接近实时的数据保护。