4. etcd 压测沙盘设计:沙盘目标、资源隔离方案、模拟真实日志写入场景的流量模型
压测沙盘是验证 etcd 在真实日志写入压力下一致性保障能力的核心实验环境。本节从沙盘建设目标出发,逐步拆解资源隔离策略与流量模型设计,确保压测结果可复现、可对比、可审计。
4.1 沙盘建设目标
沙盘需同时满足以下三个维度的验证需求:
| 目标维度 | 具体说明 | 验收指标 |
|---|---|---|
| 一致性复核 | 在并发写入与资源变更(扩缩容、Leader 切换)期间,验证 etcd 的线性一致性与最终一致性是否被破坏 | 无 stale read、无写入丢失、Revision 单调递增 |
| 性能基准 | 建立不同负载等级下的延迟与吞吐基线,用于后续优化对比 | P99 延迟 ≤ 10ms(3 节点,1KB value) |
| 故障注入 | 模拟网络分区、磁盘 I/O 抖动、节点宕机等异常,观察 etcd 自愈与数据一致性恢复行为 | Raft 日志不分裂、集群在 30s 内恢复可用 |
沙盘设计原则:所有压测场景必须可重复执行,且每次执行前重置 etcd 集群到初始状态(清空数据目录、重置 Raft 日志),避免历史状态污染测试结果。
4.2 资源隔离方案
为避免压测流量干扰生产环境或不同压测任务之间相互影响,沙盘采用三层隔离架构:
- 物理/虚拟机隔离:每个 etcd 集群独占一组节点(或容器组),通过 cgroup 限制 CPU、内存、磁盘 IOPS。
- 网络命名空间隔离:使用 Linux Network Namespace 或 Kubernetes NetworkPolicy,确保压测流量仅在沙盘网络域内流转。
- 数据目录隔离:每个压测任务使用独立的数据目录与 WAL 目录,通过
--data-dir与--wal-dir参数指定。
推荐资源配额(单节点):2 vCPU / 4GB RAM / 50GB SSD(2000 IOPS),etcd 版本 ≥ 3.5.x,Raft 心跳间隔 100ms,选举超时 1000ms。
以下 SVG 展示了沙盘的整体资源隔离拓扑:
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 展示了流量模型的时间序列与并发关系:
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,用于关联分析一致性事件与性能抖动。