2. etcd 基础回顾:核心机制与数据模型
在深入多集群压测与限流策略之前,必须重新夯实 etcd 的底层原理。etcd 作为分布式键值存储,其数据模型、共识算法、Watch/Lease 机制以及 MVCC 实现,直接决定了压测场景下的行为特征与限流策略的生效边界。本节将逐一拆解这五大核心模块。
2.1 数据模型:逻辑分层与物理存储
etcd 的数据模型采用 扁平的键值空间,但内部通过 前缀机制 实现逻辑隔离。所有键以 / 分隔的路径形式组织,例如 /registry/pods/default/nginx-pod。这种设计天然支持范围查询与前缀扫描。
| 层级 | 说明 | 示例 |
|---|---|---|
| 键 (Key) | UTF-8 字节序列,最大 1.5 MB | /cluster-a/namespaces/default |
| 值 (Value) | 任意字节序列,最大 1.5 MB | JSON 序列化的 Pod 对象 |
| 版本号 (Revision) | 全局单调递增整数,每次写操作 +1 | 1024 |
| 租约 (Lease) | 关联 TTL 的轻量级对象 | Lease ID: 0x12345678 |
物理存储层面,etcd 使用 BoltDB(现为 bbolt)作为底层引擎。数据写入先追加到 WAL(Write-Ahead Log),再写入内存中的 B-tree 索引,最后异步刷盘。这种设计保证了写入的持久性与读取的高效性。
2.2 Raft 共识算法:强一致性的基石
etcd 通过 Raft 算法在多个节点间达成共识,确保集群状态的一致性。Raft 将节点角色分为 Leader、Follower 和 Candidate,所有写操作必须经过 Leader。
Raft 的关键特性包括:
- Leader 选举: 当 Leader 心跳超时,Follower 转为 Candidate 发起选举,获得多数票后成为新 Leader。
- 日志复制: Leader 将客户端请求封装为日志条目,并行复制到所有 Follower,多数派确认后提交。
- 安全性: 只有拥有最新日志的节点才能当选 Leader,保证已提交的日志不会丢失。
2.3 Watch 机制:事件驱动的实时通知
etcd 的 Watch 机制允许客户端监听特定键或前缀的变化。当被监听的键发生创建、更新、删除操作时,etcd 会向所有 Watch 客户端推送事件。
| Watch 类型 | 触发条件 | 典型应用 |
|---|---|---|
| Key Watch | 单个键的变化 | 服务发现中的端点更新 |
| Prefix Watch | 指定前缀下所有键的变化 | Kubernetes 资源变更监听 |
| Revision Watch | 从指定全局版本号开始监听 | 数据同步与增量恢复 |
Watch 的实现基于 多版本并发控制(MVCC) 和 事件缓冲区。每个 Watch 客户端在服务端维护一个 WatchableStore,当事件产生时,etcd 将事件放入对应客户端的 channel 中。若客户端消费速度跟不上事件产生速度,缓冲区溢出会导致 Watch 断开。
2.4 Lease 机制:分布式租约与 TTL
Lease(租约)是 etcd 提供的一种轻量级 TTL 机制。客户端创建一个 Lease 对象,设置过期时间(TTL),然后将多个键关联到该 Lease。当 Lease 过期且未续约时,所有关联的键自动被删除。
Lease 的核心特性:
- 批量过期: 一个 Lease 可关联数千个键,过期时一次性清理,减少删除操作的开销。
- 续约机制: 客户端通过 gRPC 流式续约,服务端重置 TTL 计时器。
- 持久化: Lease 信息存储在 BoltDB 中,节点重启后恢复。
2.5 MVCC 原理:多版本并发控制
etcd 使用 MVCC 实现高效的并发读写。每个键的每次修改都会生成一个新版本,旧版本数据保留在 BoltDB 中,直到被压缩(Compaction)回收。
| 概念 | 说明 | 作用 |
|---|---|---|
| Revision | 全局单调递增的版本号 | 标识每次写操作 |
| KeyValue | 键值对及其元数据(CreateRevision、ModRevision、Version) | 支持历史版本查询 |
| Compaction | 删除指定 Revision 之前的所有历史版本 | 回收存储空间 |
MVCC 的工作流程:
- 写入: 客户端写入键
/foo,etcd 分配新的 Revision100,将新数据写入 BoltDB,同时更新内存 B-tree 索引。 - 读取: 客户端可指定读取特定 Revision 的数据,实现时间点快照查询。
- 压缩: 定期执行 Compaction,删除 Revision
<= 80的所有历史版本,释放磁盘空间。
2.6 核心机制总结
下表汇总了 etcd 五大核心机制在压测场景下的关键影响:
| 机制 | 压测关注点 | 限流策略关联 |
|---|---|---|
| 数据模型 | 键前缀设计、值大小 | 按前缀隔离限流 |
| Raft 共识 | Leader 负载、选举频率 | 限制写入 QPS,保护 Leader |
| Watch 机制 | 连接数、事件积压 | 限制 Watch 数量和缓冲区 |
| Lease 机制 | Lease 数量、TTL 分布 | 限制 Lease 创建速率 |
| MVCC | 历史版本膨胀、Compaction | 配合写入限流,控制版本增长 |