3. 压测沙盘环境搭建:Docker Compose 部署 etcd 集群、Prometheus + Grafana 监控栈、压测工具安装
压测沙盘是进行 etcd 性能实验与调试的隔离环境。本章将指导你使用 Docker Compose 一键部署一个包含 3 节点 etcd 集群、Prometheus + Grafana 监控栈以及压测工具(benchmark / ghz)的完整沙盘。所有组件均运行在容器中,确保环境可重复、可销毁、可快速重建。
3.1 整体架构概览
沙盘采用分层架构:底层为 etcd 集群(3 节点),中间层为指标采集与存储(Prometheus),上层为可视化与压测工具。压测工具可运行在宿主机或独立容器中,直接向 etcd 集群发起请求。
3.2 目录结构与配置文件
在宿主机上创建以下目录结构,用于存放 Compose 文件、etcd 配置、Prometheus 配置以及 Grafana 数据源定义:
etcd-bench-sandbox/
├── docker-compose.yml
├── etcd/
│ ├── etcd-0.yml
│ ├── etcd-1.yml
│ └── etcd-2.yml
├── prometheus/
│ └── prometheus.yml
└── grafana/
└── datasources/
└── datasource.yml
3.3 Docker Compose 部署 etcd 集群
使用 bitnami/etcd 镜像部署 3 节点集群。每个节点通过环境变量配置节点名称、初始集群成员、数据目录以及客户端/对等端口。
docker-compose.yml 核心片段:
version: '3.8'
services:
etcd-0:
image: bitnami/etcd:3.5.15
container_name: etcd-0
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd-0
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd-0:2380
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd-0:2379
- ETCD_INITIAL_CLUSTER=etcd-0=http://etcd-0:2380,etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_INITIAL_CLUSTER_=etcd-cluster-
ports:
- "23790:2379"
- "23800:2380"
volumes:
- etcd-0-data:/bitnami/etcd
etcd-1:
image: bitnami/etcd:3.5.15
container_name: etcd-1
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd-1
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd-1:2380
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd-1:2379
- ETCD_INITIAL_CLUSTER=etcd-0=http://etcd-0:2380,etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_INITIAL_CLUSTER_=etcd-cluster-
ports:
- "23791:2379"
- "23801:2380"
volumes:
- etcd-1-data:/bitnami/etcd
etcd-2:
image: bitnami/etcd:3.5.15
container_name: etcd-2
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd-2
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd-2:2380
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd-2:2379
- ETCD_INITIAL_CLUSTER=etcd-0=http://etcd-0:2380,etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_INITIAL_CLUSTER_=etcd-cluster-
ports:
- "23792:2379"
- "23802:2380"
volumes:
- etcd-2-data:/bitnami/etcd
volumes:
etcd-0-data:
etcd-1-data:
etcd-2-data:
端口映射说明: 宿主机端口 23790/23791/23792 分别映射到三个 etcd 节点的客户端端口 2379,避免本地端口冲突。压测工具可通过
localhost:23790 访问 etcd-0。
3.4 Prometheus + Grafana 监控栈
Prometheus 从 etcd 集群的 /metrics 端点拉取指标。Grafana 连接 Prometheus 作为数据源,提供可视化仪表盘。
prometheus/prometheus.yml:
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: 'etcd-cluster'
static_configs:
- targets:
- 'etcd-0:2379'
- 'etcd-1:2379'
- 'etcd-2:2379'
metrics_path: /metrics
scheme: http
grafana/datasources/datasource.yml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
在 docker-compose.yml 中追加监控服务:
prometheus:
image: prom/prometheus:v2.53.0
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
grafana:
image: grafana/grafana:11.1.0
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- ./grafana/datasources:/etc/grafana/provisioning/datasources
3.5 压测工具安装
沙盘提供两种压测工具:etcd 官方 benchmark 工具(基于 go 编写)和通用 gRPC 压测工具 ghz。推荐在宿主机直接安装,或使用独立容器运行。
| 工具 | 安装方式 | 适用场景 |
|---|---|---|
| benchmark | go install go.etcd.io/etcd/v3/tools/benchmark@latest |
etcd 原生 KV 操作压测(put/range/delete/txn) |
| ghz | go install github.com/bojand/ghz/cmd/ghz@latest |
通用 gRPC 压测,支持自定义 proto 与元数据 |
快速验证安装:
# 验证 benchmark
benchmark --endpoints=localhost:23790 put --key-size=8 --val-size=256 --total=1000
# 验证 ghz
ghz --insecure --proto=/path/to/etcd.proto --call=etcdserverpb.KV.Put \
-d '{"key":"dGVzdA==","value":"dmFsdWU="}' \
localhost:23790
3.6 启动沙盘与健康检查
执行以下命令启动所有服务:
cd etcd-bench-sandbox
docker compose up -d
启动后,通过以下方式验证各组件状态:
- etcd 集群健康:
docker compose exec etcd-0 etcdctl endpoint health --cluster - Prometheus 目标状态: 浏览器访问
http://localhost:9090/targets,确认 etcd 三个 target 均为 UP - Grafana 登录: 浏览器访问
http://localhost:3000,默认账号 admin / admin
常见问题: 如果 etcd 节点启动后反复重启,检查
ETCD_INITIAL_CLUSTER_STATE 是否设置为 new(首次启动)或 existing(重启已有集群)。数据卷残留可能导致集群成员冲突,建议在重建前执行 docker compose down -v 清理卷。
3.7 沙盘组件端口汇总
| 组件 | 容器内端口 | 宿主机映射端口 | 用途 |
|---|---|---|---|
| etcd-0 | 2379 / 2380 | 23790 / 23800 | 客户端请求 / 节点间通信 |
| etcd-1 | 2379 / 2380 | 23791 / 23801 | 客户端请求 / 节点间通信 |
| etcd-2 | 2379 / 2380 | 23792 / 23802 | 客户端请求 / 节点间通信 |
| Prometheus | 9090 | 9090 | 指标采集与查询 |
| Grafana | 3000 | 3000 | 可视化仪表盘 |