3. 压测沙盘环境搭建:Docker Compose 部署 etcd 集群、Prometheus + Grafana 监控栈、压测工具安装

压测沙盘是进行 etcd 性能实验与调试的隔离环境。本章将指导你使用 Docker Compose 一键部署一个包含 3 节点 etcd 集群、Prometheus + Grafana 监控栈以及压测工具(benchmark / ghz)的完整沙盘。所有组件均运行在容器中,确保环境可重复、可销毁、可快速重建。

3.1 整体架构概览

沙盘采用分层架构:底层为 etcd 集群(3 节点),中间层为指标采集与存储(Prometheus),上层为可视化与压测工具。压测工具可运行在宿主机或独立容器中,直接向 etcd 集群发起请求。

压测沙盘整体架构 压测工具层 benchmark (etcd 官方) | ghz (gRPC 压测) 监控与可视化层 Prometheus (指标存储) | Grafana (仪表盘) etcd 集群 (3 节点) etcd-0 (leader/follower) etcd-1 (follower) etcd-2 (follower) 数据流:压测工具 → etcd 集群 → Prometheus (拉取 /metrics) → Grafana (查询展示)

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 可视化仪表盘