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 为集群节点数)。
| 角色 | 职责 | 状态转换条件 |
|---|---|---|
| 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 客户端应实现重连逻辑,并使用
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 适合快速故障检测,但会增加续约开销。
故障排查要点: 如果服务频繁掉线,检查客户端 KeepAlive 间隔是否大于 TTL,或网络延迟导致续约失败。Lease 过期后键值被删除,可能导致服务发现中断。
核心概念总结
| 核心概念 | 作用 | 运维关注点 |
|---|---|---|
| Raft 共识 | 保证数据一致性与高可用 | Quorum 计算、Leader 选举、网络分区 |
| 键值存储 | 提供分层、版本化的数据存储 | 压缩策略、键空间大小、Revision 管理 |
| Watch 机制 | 实时事件通知与变更推送 | 连接稳定性、事件序号校验、重连逻辑 |
| Lease 机制 | 临时节点管理与分布式锁 | TTL 设置、KeepAlive 频率、过期处理 |