4. etcd 压测沙盘设计:沙盘目标、资源隔离方案、模拟真实日志写入场景的流量模型

压测沙盘是验证 etcd 在真实日志写入压力下一致性保障能力的核心实验环境。本节从沙盘建设目标出发,逐步拆解资源隔离策略与流量模型设计,确保压测结果可复现、可对比、可审计。

4.1 沙盘建设目标

沙盘需同时满足以下三个维度的验证需求:

目标维度 具体说明 验收指标
一致性复核 在并发写入与资源变更(扩缩容、Leader 切换)期间,验证 etcd 的线性一致性与最终一致性是否被破坏 无 stale read、无写入丢失、Revision 单调递增
性能基准 建立不同负载等级下的延迟与吞吐基线,用于后续优化对比 P99 延迟 ≤ 10ms(3 节点,1KB value)
故障注入 模拟网络分区、磁盘 I/O 抖动、节点宕机等异常,观察 etcd 自愈与数据一致性恢复行为 Raft 日志不分裂、集群在 30s 内恢复可用
沙盘设计原则:所有压测场景必须可重复执行,且每次执行前重置 etcd 集群到初始状态(清空数据目录、重置 Raft 日志),避免历史状态污染测试结果。

4.2 资源隔离方案

为避免压测流量干扰生产环境或不同压测任务之间相互影响,沙盘采用三层隔离架构:

  1. 物理/虚拟机隔离:每个 etcd 集群独占一组节点(或容器组),通过 cgroup 限制 CPU、内存、磁盘 IOPS。
  2. 网络命名空间隔离:使用 Linux Network Namespace 或 Kubernetes NetworkPolicy,确保压测流量仅在沙盘网络域内流转。
  3. 数据目录隔离:每个压测任务使用独立的数据目录与 WAL 目录,通过 --data-dir 与 --wal-dir 参数指定。
推荐资源配额(单节点):2 vCPU / 4GB RAM / 50GB SSD(2000 IOPS),etcd 版本 ≥ 3.5.x,Raft 心跳间隔 100ms,选举超时 1000ms。

以下 SVG 展示了沙盘的整体资源隔离拓扑:

沙盘资源隔离拓扑 压测客户端 Namespace: bench-ns cgroup: cpu=2, mem=4G etcd 集群(3 节点) etcd-0 :2380 :2379 etcd-1 :2380 :2379 etcd-2 :2380 :2379 数据目录: /var/lib/etcd/bench 监控 & 存储 Prometheus + Grafana 日志: /var/log/bench/ 网络隔离域:bench-vlan / bench-ns

4.3 模拟真实日志写入场景的流量模型

日志平台写入具有明显的 突发性、周期性 和 Key 分布倾斜 特征。沙盘流量模型需覆盖以下三种核心模式:

流量模式 模拟场景 写入速率 Key 空间 Value 大小
稳态写入 正常业务日志持续采集 1000 ~ 5000 ops/s 1000 个前缀(/logs/app-{0..999}) 512B ~ 2KB
突发写入 故障或大促期间日志洪峰 10000 ~ 50000 ops/s(持续 30s) 200 个热点前缀 1KB ~ 4KB
混合读写 日志查询与写入同时进行 写入 2000 ops/s + 读取 8000 ops/s 写入新 Key,读取最近 100 个 Key 写入 1KB,读取返回全量
注意:突发写入场景必须配合 --snapshot-count 参数调整(建议设为 100000),避免频繁快照导致写放大。同时监控 WAL 文件大小,防止磁盘空间写满。

以下 SVG 展示了流量模型的时间序列与并发关系:

流量模型时间序列与并发关系 T0 T1 (稳态) T2 (突发) T3 (恢复) 稳态 2000 ops 突发 30000 ops 恢复 1500 ops 并发客户端数 稳态: 10 / 突发: 50

4.4 流量模型实现要点

使用 benchmark 工具或自定义压测脚本时,需注意以下参数配置:

# 稳态写入示例
benchmark --endpoints=10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 \
  --conns=10 --clients=10 \
  put --key-size=16 --val-size=1024 \
  --total=100000 --rate=2000 \
  --key-space=1000

# 突发写入示例
benchmark --endpoints=10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 \
  --conns=50 --clients=50 \
  put --key-size=16 --val-size=2048 \
  --total=50000 --rate=30000 \
  --key-space=200

# 混合读写示例
benchmark --endpoints=10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 \
  --conns=20 --clients=20 \
  mix --put-rate=2000 --get-rate=8000 \
  --key-size=16 --val-size=1024 \
  --total=100000 --key-space=1000
关键监控指标:压测期间持续采集 etcd 的 etcd_server_leader_changes_seen_total、etcd_disk_wal_fsync_duration_seconds_bucket、etcd_network_client_grpc_sent_bytes_total,用于关联分析一致性事件与性能抖动。