2. etcd 基础回顾:架构、Raft 协议、键值存储模型与 Watch 机制

在深入多集群压测与 PVC 一致性复核之前,必须重新夯实 etcd 的核心原理。etcd 是 Kubernetes 控制平面的“状态中枢”,所有集群资源(Pod、PVC、ConfigMap 等)的声明式数据均持久化在 etcd 中。理解其架构与协议,是诊断数据不一致、设计压测沙盘的前提。

2.1 etcd 整体架构

etcd 采用 分层模块化 设计,从上到下依次为:

  • Client 层:提供 gRPC API(v3 协议),支持 KV、Watch、Lease、Lock 等操作。
  • Raft 层:共识引擎,负责日志复制、Leader 选举、成员变更。
  • 存储层:基于 BoltDB(现为 bbolt)的持久化 KV 存储,支持 MVCC 与事务。
  • 网络层:Peer 间通信(Raft 消息)与 Client 通信分离。
关键认知: Kubernetes 的 API Server 是 etcd 的唯一客户端。所有资源变更(如 PVC 扩容、PV 绑定)都通过 API Server 转换为 etcd 的 Put / Txn 操作。
etcd 分层架构与核心模块 etcd 分层架构与核心模块 Client 层 — gRPC API (v3) KV / Watch / Lease / Lock / Txn Raft 共识层 Leader 选举 · 日志复制 · 成员变更 Term / Entry / CommitIndex / AppliedIndex 存储层 — bbolt (MVCC) B+Tree 持久化 · 多版本并发控制 · 事务 Revision / KeyValue / Lease 关联 网络层 — Peer 通信 (Raft) + Client 通信 (gRPC)

2.2 Raft 协议核心机制

Raft 是 etcd 保证数据一致性的基石。它通过 Leader 强领导模型 简化共识过程,核心流程如下:

阶段 角色 关键行为 超时/触发条件
Leader 选举 Follower → Candidate → Leader 发起 RequestVote,获得多数票 Election Timeout (随机 150~300ms)
日志复制 Leader → Follower AppendEntries 心跳 + 日志条目 Leader 收到 Client 写请求
提交确认 Leader 主导 多数节点写入后标记 committed Leader 收到多数 AppendEntries 响应
安全保证 所有节点 只选日志最新的节点;不提交旧 Term 日志 Leader 变更时触发
压测启示: 当 etcd 集群出现网络分区或磁盘 I/O 抖动时,Leader 频繁切换会导致写入延迟飙升。在 PVC 一致性复核场景中,若压测期间发生 Leader 切换,可能出现“写成功但未提交”的中间状态,需通过 --consistency=c 线性化读取验证。
Raft 日志复制与提交流程 Raft 日志复制与提交流程 Leader (Node 1) Follower (Node 2) Follower (Node 3) ① Client Put(key, value) ② 追加到本地 Log ③ 追加并响应 OK ③ 追加并响应 OK ④ 多数确认 → 提交 ⑤ 应用到状态机 → 返回 Client 关键:只有 committed 的日志才会应用到状态机 Client 收到响应时,数据已在多数节点持久化

2.3 键值存储模型与 MVCC

etcd v3 摒弃了 v2 的目录式层级结构,采用 扁平的键值模型,所有数据存储在一个有序的 B+Tree 中。核心概念:

  • Key-Value:Key 是字节数组,Value 是任意二进制数据。Kubernetes 中 Key 格式为 /registry/<resource>/<namespace>/<name>。
  • Revision:全局单调递增的版本号,每次写操作(Put/Delete)都会生成新的 Revision。MVCC 通过 Revision 实现历史版本查询。
  • Compact:定期压缩历史版本,释放存储空间。Kubernetes 默认每 5 分钟执行一次自动压缩。
概念 说明 Kubernetes 场景示例
Key 唯一标识,有序存储 /registry/persistentvolumeclaims/default/my-pvc
Value Protobuf 序列化的资源对象 PVC 的完整 Spec + Status
CreateRevision Key 首次创建时的 Revision 用于判断 PVC 是否被重建
ModRevision Key 最近一次修改的 Revision 用于乐观锁(资源冲突检测)
Version Key 被修改的次数(从 1 开始) 每次 Update 递增
一致性复核陷阱: 压测过程中,PVC 的 ModRevision 可能因频繁更新而快速递增。若复核脚本仅比较 ModRevision 是否一致,可能误判“版本不同即数据不一致”。正确做法是反序列化 Value 后比对 Spec 与 Status 中的关键字段(如 capacity.storage、accessModes)。

2.4 Watch 机制

Watch 是 etcd 实现事件驱动架构的核心,也是 Kubernetes 控制器模式的基础。API Server 通过 Watch 监听资源变化,实时更新缓存并触发 reconciliation。

Watch 工作流程:

  1. Client 发起 Watch(key, start_revision) 请求,建立 gRPC 长连接。
  2. etcd 从 start_revision 开始,扫描事件历史(若未压缩)并实时推送后续变更。
  3. 事件类型:PUT(创建/更新)、DELETE(删除)。
  4. 每个事件包含:Key、Value、Type、Revision。
压测沙盘中的 Watch 应用: 在 PVC 一致性复核工具中,可以利用 Watch 机制实时捕获 PVC 的变更事件,与压测脚本的预期变更进行比对。若 Watch 事件丢失或顺序错乱,说明 etcd 或 API Server 存在性能瓶颈。
etcd Watch 事件流与 Kubernetes 控制器消费 etcd Watch 事件流与 Kubernetes 控制器消费 etcd 集群 存储所有资源对象 维护全局 Revision Watch(key, rev) API Server Watch 缓存 + List-Watch 事件分发到 Informer PUT/DELETE 事件 控制器 PVC Controller PV Controller Watch 事件序列示例(PVC 扩容场景) Revision 100: PUT /registry/persistentvolumeclaims/default/my-pvc (初始创建) Revision 150: PUT /registry/persistentvolumeclaims/default/my-pvc (扩容:storage 10Gi → 20Gi) Revision 180: PUT /registry/persistentvolumeclaims/default/my-pvc (Status 更新:Bound)

2.5 本章小结

etcd 作为 Kubernetes 的“单一事实来源”,其架构与协议直接决定了集群的可靠性与一致性。在后续的压测沙盘构建与 PVC 一致性复核中,以下知识点将反复出现:

  • Raft 日志复制 是写入延迟的瓶颈,压测时需监控 Leader 心跳与提案耗时。
  • MVCC 与 Revision 是数据版本追踪的基础,复核脚本需正确解析 ModRevision 与 Value 内容。
  • Watch 机制 是实时捕获变更的关键,压测中需验证事件是否完整、顺序是否正确。