2. 沙盘环境规划:压测沙盘拓扑设计、节点角色划分与网络延迟模拟方案
2.1 压测沙盘拓扑设计
Federation 压测沙盘采用 3 集群 × 3 节点 的星型拓扑结构,模拟跨数据中心部署场景。每个集群内部署 3 个 etcd 节点,形成独立 Raft 组;集群之间通过 Federation 层进行元数据同步与请求转发。
设计目标: 在可控的沙盘环境中复现生产级 Federation 网络拓扑,支持对 Leader 选举、跨集群读写延迟、Learner 数据追赶等场景的压测与瓶颈定位。
2.2 节点角色划分与职责
每个集群内部严格遵循 etcd 原生角色体系,同时 Federation 层引入跨集群角色标识,用于区分请求路由策略。
| 角色 | 集群内职责 | Federation 层职责 | 压测关注点 |
|---|---|---|---|
| Leader | 处理所有写请求;发起 Raft 日志复制;心跳检测 | 作为集群写入口,向 Federation 层广播元数据变更 | Leader 写吞吐上限;心跳超时对 Federation 同步的影响 |
| Follower | 接收 Raft 日志;处理读请求(可配置线性一致性) | 转发跨集群读请求到本集群 Leader;缓存 Federation 元数据 | Follower 读延迟;缓存一致性对跨集群读的影响 |
| Learner | 仅接收 Raft 日志快照;不参与投票 | 作为 Federation 层的数据订阅节点,异步拉取跨集群变更 | Learner 数据追赶延迟;快照传输对网络带宽的消耗 |
角色分配策略: 沙盘中每个集群固定 1 个 Leader、1 个 Follower、1 个 Learner。Learner 节点专门用于 Federation 层的数据订阅,避免影响集群内 Raft 投票与写入性能。
2.3 网络延迟模拟方案
为模拟跨数据中心真实网络环境,沙盘引入 tc-netem 与 Toxiproxy 两层延迟注入机制,覆盖集群间与集群内两种网络场景。
2.3.1 延迟模拟层级
- 集群间延迟(跨数据中心): 模拟 10ms–100ms 单向延迟,随机丢包率 0.1%–1%。
- 集群内延迟(同数据中心): 模拟 0.5ms–5ms 单向延迟,无丢包。
- Learner 专用延迟: 对 Learner 节点额外注入 20ms–50ms 延迟,模拟异步订阅场景。
2.3.2 tc-netem 配置示例
# 集群间延迟:模拟跨数据中心 50ms ± 10ms 延迟,0.5% 丢包
tc qdisc add dev eth0 root netem delay 50ms 10ms distribution normal loss 0.5%
# 集群内延迟:模拟同数据中心 2ms 延迟
tc qdisc add dev eth1 root netem delay 2ms
# Learner 专用延迟:在 Learner 节点上额外注入 30ms 延迟
tc qdisc add dev eth2 root netem delay 30ms
2.3.3 Toxiproxy 代理配置示例
# 启动 Toxiproxy 代理,监听 2379 端口,转发到后端 etcd 2379
toxiproxy-cli create etcd_federation -l 0.0.0.0:2379 -u 127.0.0.1:12379
# 注入延迟毒性:50ms 延迟,抖动 10ms
toxiproxy-cli toxic add etcd_federation -t latency -a latency=50 -a jitter=10
# 注入带宽限制毒性:限制带宽为 10Mbps
toxiproxy-cli toxic add etcd_federation -t bandwidth -a rate=10
注意: tc-netem 作用于网络接口层,适合模拟整机延迟;Toxiproxy 作用于应用层代理,适合精细化控制单个 etcd 客户端的延迟特征。沙盘中两者配合使用,tc-netem 负责集群间基础延迟,Toxiproxy 负责 Federation 层特定链路的延迟注入。
2.4 延迟场景矩阵
以下矩阵定义了沙盘中 6 种典型网络延迟场景,覆盖正常、高延迟、分区、抖动等压测需求。
| 场景编号 | 场景名称 | 集群间延迟 | 集群内延迟 | 丢包率 | 压测目标 |
|---|---|---|---|---|---|
| S1 | 正常跨数据中心 | 20ms ± 5ms | 1ms | 0.1% | 基准性能 |
| S2 | 高延迟跨数据中心 | 80ms ± 20ms | 2ms | 0.5% | Leader 选举超时 |
| S3 | Learner 追赶压力 | 50ms ± 10ms | 1ms | 0.2% | Learner 快照同步 |
| S4 | 网络抖动 | 30ms ± 30ms | 2ms ± 2ms | 1% | Federation 重试机制 |
| S5 | 集群间分区 | 1000ms(模拟断开) | 1ms | 100% | Federation 降级与恢复 |
| S6 | 混合负载 | 40ms ± 15ms | 1ms | 0.3% | 读写混合压测 |
2.5 沙盘环境配置清单
以下为沙盘环境的基础配置参数,所有节点均运行在 Docker 容器中,通过 docker-compose 统一编排。
| 组件 | 配置项 | 值 | 说明 |
|---|---|---|---|
| etcd 节点 | CPU | 2 核 | 限制容器 CPU |
| etcd 节点 | 内存 | 4 GB | 限制容器内存 |
| etcd 节点 | 磁盘 I/O | SSD 模拟(200 MB/s) | 通过 blkio 限制 |
| etcd 节点 | etcd 版本 | v3.5.9 | 支持 Learner 与 Federation |
| 网络模拟 | tc-netem | 延迟/抖动/丢包 | 作用于容器网络接口 |
| 网络模拟 | Toxiproxy | 延迟/带宽/重连 | 作用于应用层代理 |
| 压测工具 | JMeter / k6 | 分布式模式 | 支持 gRPC 协议 |
沙盘环境验证: 在启动压测前,需通过
ping 与 mtr 验证集群间延迟是否符合预期;通过 etcdctl endpoint status 确认 Leader/Follower/Learner 角色分配正确。