4. 压测沙盘总体设计:沙盘组件、数据流、模拟集群生命周期管理

多集群压测沙盘是一个可编程、可观测、可复现的仿真环境,用于在受控条件下模拟 etcd 集群的负载特征、故障场景与扩缩容行为。本章从组件架构、数据流拓扑与生命周期管理三个维度展开总体设计。

4.1 沙盘组件架构

沙盘由以下六大核心组件构成,各组件以松耦合方式协作,支持独立升级与故障注入。

组件名称 职责 部署形态
压测引擎 生成读写请求、事务、Watch 流;支持线性/突发/正弦负载模式 独立进程,多副本部署
集群控制器 管理 etcd 集群的创建、销毁、扩缩容、成员变更 Operator 模式,单主 + 备用
故障注入器 模拟网络分区、节点宕机、磁盘延迟、Leader 切换 Sidecar 或 DaemonSet
观测收集器 采集延迟、吞吐、Raft 指标、慢日志、事件流 Agent + 时序数据库
调度决策器 基于观测数据触发跨集群调度策略(迁移、重平衡) 中心化服务
沙盘编排器 协调上述组件的生命周期,提供 API 与 Web UI 主控进程
设计要点:压测引擎与故障注入器之间通过事件总线解耦,避免故障注入时压测流量中断导致的误判。观测收集器采用推拉结合模式,关键指标(如 Raft 提案延迟)使用推模式,慢日志使用拉模式。

4.2 数据流拓扑

沙盘内部数据流分为控制流与数据流两条主线。控制流负责集群状态变更与调度指令下发,数据流负责压测请求与观测指标上报。下图展示了完整的拓扑关系。

沙盘数据流拓扑 沙盘数据流拓扑 压测引擎 故障注入器 etcd 集群 (3/5/7 节点) 观测收集器 调度决策器 集群控制器 沙盘编排器 读写请求 故障注入 指标/日志 分析结果 调度指令 成员变更 生命周期指令 数据流说明: 控制流(实线):沙盘编排器 → 集群控制器 → etcd 集群;调度决策器 → 集群控制器。 数据流(实线):压测引擎 → etcd 集群 → 观测收集器 → 调度决策器。
关键数据流路径:
  1. 压测请求流:压测引擎 → etcd 集群(读写/事务/Watch)→ 观测收集器(指标聚合)。
  2. 故障注入流:故障注入器 → etcd 集群(网络/磁盘/进程级故障)→ 观测收集器(故障影响记录)。
  3. 调度控制流:观测收集器 → 调度决策器(瓶颈分析)→ 集群控制器(成员变更/迁移)→ etcd 集群。

4.3 模拟集群生命周期管理

沙盘中的每个 etcd 集群都遵循标准化的生命周期状态机,支持自动化与手动干预两种模式。状态定义如下:

状态 说明 触发条件
Provisioning 资源分配与节点初始化 沙盘编排器下发创建指令
Running 集群正常服务,接受压测请求 所有节点通过健康检查
Scaling 扩缩容或成员变更进行中 调度决策器或手动触发
Faulted 故障注入生效,集群处于降级状态 故障注入器激活
Recovering 故障恢复或 Leader 选举中 故障注入撤销或自动恢复
Terminating 集群销毁,资源回收 压测结束或手动销毁

生命周期状态转换由集群控制器中的状态机引擎驱动,每次转换都会记录到观测收集器的时间线中,用于后续回放与分析。

集群生命周期状态机 集群生命周期状态机 Provisioning Running Scaling Faulted Recovering Terminating 初始化完成 扩缩容触发 变更完成 故障注入 故障撤销 选举/恢复完成 销毁指令
生命周期管理避坑:
  • Scaling 状态超时:成员变更操作(如 etcdctl member add)在沙盘中必须设置超时阈值(默认 30s),超时后自动回滚至 Running 并记录异常。
  • Faulted 状态死锁:当故障注入导致集群失去法定人数时,Recovering 状态需要外部干预(如强制移除故障节点),沙盘编排器应提供手动恢复 API。
  • Terminating 资源泄漏:销毁集群前必须确认所有数据目录已清理,避免残留 WAL 文件影响后续集群创建。

4.4 沙盘编排器 API 设计

沙盘编排器提供 RESTful API 用于生命周期管理,核心端点如下:

# 创建集群
POST /api/v1/clusters
{
  "name": "bench-cluster-01",
  "node_count": 5,
  "version": "3.5.15",
  "storage_backend": "ssd"
}

# 查询集群状态
GET /api/v1/clusters/{cluster_id}

# 触发扩缩容
PUT /api/v1/clusters/{cluster_id}/scale
{
  "target_node_count": 7
}

# 注入故障
POST /api/v1/clusters/{cluster_id}/faults
{
  "type": "network_partition",
  "target_nodes": ["node-1", "node-2"],
  "duration_sec": 60
}

# 销毁集群
DELETE /api/v1/clusters/{cluster_id}
沙盘可观测性集成:每个生命周期事件都会自动生成结构化日志,格式为 {timestamp, cluster_id, from_state, to_state, trigger, duration_ms},直接写入观测收集器的时序数据库,用于后续瓶颈分析与调度优化回放。