4. 压测沙盘总体设计:沙盘组件、数据流、模拟集群生命周期管理
多集群压测沙盘是一个可编程、可观测、可复现的仿真环境,用于在受控条件下模拟 etcd 集群的负载特征、故障场景与扩缩容行为。本章从组件架构、数据流拓扑与生命周期管理三个维度展开总体设计。
4.1 沙盘组件架构
沙盘由以下六大核心组件构成,各组件以松耦合方式协作,支持独立升级与故障注入。
| 组件名称 | 职责 | 部署形态 |
|---|---|---|
| 压测引擎 | 生成读写请求、事务、Watch 流;支持线性/突发/正弦负载模式 | 独立进程,多副本部署 |
| 集群控制器 | 管理 etcd 集群的创建、销毁、扩缩容、成员变更 | Operator 模式,单主 + 备用 |
| 故障注入器 | 模拟网络分区、节点宕机、磁盘延迟、Leader 切换 | Sidecar 或 DaemonSet |
| 观测收集器 | 采集延迟、吞吐、Raft 指标、慢日志、事件流 | Agent + 时序数据库 |
| 调度决策器 | 基于观测数据触发跨集群调度策略(迁移、重平衡) | 中心化服务 |
| 沙盘编排器 | 协调上述组件的生命周期,提供 API 与 Web UI | 主控进程 |
设计要点:压测引擎与故障注入器之间通过事件总线解耦,避免故障注入时压测流量中断导致的误判。观测收集器采用推拉结合模式,关键指标(如 Raft 提案延迟)使用推模式,慢日志使用拉模式。
4.2 数据流拓扑
沙盘内部数据流分为控制流与数据流两条主线。控制流负责集群状态变更与调度指令下发,数据流负责压测请求与观测指标上报。下图展示了完整的拓扑关系。
关键数据流路径:
- 压测请求流:压测引擎 → etcd 集群(读写/事务/Watch)→ 观测收集器(指标聚合)。
- 故障注入流:故障注入器 → etcd 集群(网络/磁盘/进程级故障)→ 观测收集器(故障影响记录)。
- 调度控制流:观测收集器 → 调度决策器(瓶颈分析)→ 集群控制器(成员变更/迁移)→ etcd 集群。
4.3 模拟集群生命周期管理
沙盘中的每个 etcd 集群都遵循标准化的生命周期状态机,支持自动化与手动干预两种模式。状态定义如下:
| 状态 | 说明 | 触发条件 |
|---|---|---|
| Provisioning | 资源分配与节点初始化 | 沙盘编排器下发创建指令 |
| Running | 集群正常服务,接受压测请求 | 所有节点通过健康检查 |
| Scaling | 扩缩容或成员变更进行中 | 调度决策器或手动触发 |
| Faulted | 故障注入生效,集群处于降级状态 | 故障注入器激活 |
| Recovering | 故障恢复或 Leader 选举中 | 故障注入撤销或自动恢复 |
| 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},直接写入观测收集器的时序数据库,用于后续瓶颈分析与调度优化回放。