1. etcd 基础架构与核心概念

etcd 是一个分布式、可靠的键值存储系统,用于服务发现、共享配置及分布式协调。理解其基础架构与核心概念是进行策略评审、故障排查与权限变更的前提。本章聚焦于构成 etcd 基石的四项核心机制:Raft 共识算法、键值存储模型、Watch 机制与Lease 机制。

1.1 Raft 共识算法

Raft 是 etcd 分布式一致性的核心,它通过选举领导者(Leader)并复制日志来保证集群数据的一致性。Raft 将节点角色分为三种:Leader、Follower 和 Candidate。

关键指标: 集群正常工作时,所有写入请求必须由 Leader 处理;Leader 将日志条目复制到多数节点(Quorum)后,才视为提交成功。Quorum = N/2 + 1(N 为集群节点数)。
Raft 共识算法核心流程 Leader 处理所有写入请求 Follower 被动复制日志 Follower 被动复制日志 日志复制流程 Leader 接收客户端请求 → 追加日志条目 → 并行发送 AppendEntries RPC 到所有 Follower Leader 选举触发条件 Follower 未收到心跳(选举超时)→ 转为 Candidate → 发起 RequestVote RPC → 获得多数票 → 成为新 Leader
角色 职责 状态转换条件
Leader 处理所有客户端写入请求;管理日志复制;发送心跳 获得多数票后从 Candidate 转换
Follower 被动响应 Leader 和 Candidate 的 RPC 请求 启动时默认状态;收到合法心跳保持
Candidate 发起选举,请求其他节点投票 Follower 选举超时后转换
故障排查要点: 当集群出现 Leader 频繁切换或写入超时时,应优先检查网络延迟、磁盘 I/O 以及节点时钟同步。Raft 对网络分区敏感,多数节点不可用将导致集群不可写入。

1.2 键值存储模型

etcd 采用分层键值存储模型,所有数据以 key-value 形式存储,并支持按前缀或范围查询。键空间是一个扁平的目录树结构,每个键关联一个值(Value)和一个修订版本号(Revision)。

  • Key:字节数组,支持任意二进制数据,通常使用 UTF-8 字符串。
  • Value:字节数组,存储配置、元数据或服务信息。
  • Revision:全局递增的整数,每次写入操作都会生成新的 Revision,用于 MVCC(多版本并发控制)。
  • Compact:定期压缩历史版本,释放存储空间。
运维提示: 键空间过大或历史版本未及时压缩会导致 etcd 性能下降。建议设置 --auto-compaction-retention 参数(如 1h)自动清理旧版本。

1.3 Watch 机制

Watch 是 etcd 实现事件驱动架构的核心。客户端可以通过 Watch API 监听特定键或前缀的变化,当键值发生创建、更新或删除时,etcd 会实时推送事件通知。

  • 单键 Watch:监听单个 key 的变化。
  • 前缀 Watch:监听某个前缀下的所有 key 变化,常用于服务发现。
  • 范围 Watch:监听指定键范围的变化。
  • WithProgressNotify:在长时间无事件时发送进度通知,保持连接活跃。
Watch 机制事件流 客户端 发起 Watch 请求 etcd 服务端 注册 Watch 监听 事件源 键值变更 事件推送(PUT / DELETE) Watch 连接基于 gRPC 双向流,支持断线重连与事件序号校验(WithRev)
最佳实践: 生产环境中,Watch 客户端应实现重连逻辑,并使用 WithRev 指定起始版本号,避免丢失事件。前缀 Watch 比单键 Watch 更高效,适合服务发现场景。

1.4 Lease 机制

Lease(租约)是 etcd 实现分布式锁、服务心跳和临时节点的基础。Lease 是一个带有 TTL(生存时间)的租约,客户端需要定期续约(KeepAlive),否则租约到期后关联的键值会被自动删除。

概念 说明 典型用途
Lease ID 租约的唯一标识符,由 etcd 分配 关联键值、续约、撤销
TTL 租约的生存时间(秒),到期自动过期 服务心跳检测
KeepAlive 客户端定期发送续约请求,重置 TTL 保持租约活跃
Revoke 主动撤销租约,立即删除关联键值 分布式锁释放
关键参数: 默认 TTL 为 60 秒,可通过 --lease-checkpoint-interval 和 --lease-recheck-interval 调整检查频率。短 TTL 适合快速故障检测,但会增加续约开销。
Lease 生命周期 创建 Lease Grant API 关联键值 Put with Lease KeepAlive 定期续约 过期 / Revoke 自动删除键值 Lease 与键值绑定关系 一个 Lease 可关联多个键值;Lease 过期或撤销时,所有关联键值被自动删除
故障排查要点: 如果服务频繁掉线,检查客户端 KeepAlive 间隔是否大于 TTL,或网络延迟导致续约失败。Lease 过期后键值被删除,可能导致服务发现中断。

核心概念总结

核心概念 作用 运维关注点
Raft 共识 保证数据一致性与高可用 Quorum 计算、Leader 选举、网络分区
键值存储 提供分层、版本化的数据存储 压缩策略、键空间大小、Revision 管理
Watch 机制 实时事件通知与变更推送 连接稳定性、事件序号校验、重连逻辑
Lease 机制 临时节点管理与分布式锁 TTL 设置、KeepAlive 频率、过期处理