3. etcd 集群部署:单节点与集群模式部署、静态与动态发现、TLS 安全配置

etcd 集群的部署方式直接影响压测环境的稳定性与数据一致性。本章从部署模式、节点发现机制、安全通信三个维度展开,为后续压测提供可靠的集群基础。

3.1 单节点 vs. 集群模式部署

etcd 支持单节点与多节点集群两种部署模式。单节点适用于开发测试或非关键场景;集群模式(通常 3 或 5 节点)用于生产环境,提供高可用与容错能力。

对比维度 单节点 集群模式(3 节点)
数据一致性 单点写入,无 Raft 开销 Raft 多数派写入,强一致
可用性 节点故障即不可用 容忍 1 节点故障
写入延迟 低(无网络同步) 中等(需多数派确认)
压测适用场景 单机性能基线测试 分布式一致性压测、故障注入
配置复杂度 低 中(需配置成员与发现)
压测建议: 单节点用于获取 etcd 单机极限 QPS;集群模式用于验证线性一致读、写入延迟分布、Leader 切换对吞吐的影响。

3.2 静态发现 vs. 动态发现

etcd 集群启动时,节点之间需要互相发现并组成 Raft 组。发现方式分为静态发现与动态发现两类。

3.2.1 静态发现

在启动时通过 --initial-cluster 参数直接指定所有节点的地址与名称。适用于 IP 固定的环境。

# 节点 1
etcd --name node1 \
  --initial-advertise-peer-urls http://192.168.1.10:2380 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --initial-cluster node1=http://192.168.1.10:2380,node2=http://192.168.1.11:2380,node3=http://192.168.1.12:2380 \
  --initial-cluster-state new

# 节点 2、3 类似,仅修改 --name 与对应 IP

3.2.2 动态发现

通过 etcd discovery 服务或 DNS SRV 记录自动发现成员。适用于 IP 动态分配或容器化部署。

# 使用 etcd discovery 服务
# 1. 先在已有 etcd 集群中创建 discovery 
discovery_=$(curl -X PUT http://discovery.etcd.io/new?size=3)

# 2. 各节点启动时指定 discovery 
etcd --name node1 \
  --initial-advertise-peer-urls http://192.168.1.10:2380 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --discovery http://discovery.etcd.io/${discovery_}
发现方式 优点 缺点 压测推荐
静态发现 配置明确,无外部依赖 IP 变更需手动更新 固定 IP 压测环境
动态发现 灵活,适合动态基础设施 依赖外部 discovery 服务 容器化/自动扩缩容场景
注意: 压测期间不建议使用动态发现,因为 discovery 服务本身可能成为瓶颈或单点故障。静态发现更可控,便于复现压测结果。

3.3 TLS 安全配置

etcd 支持基于 TLS 的加密通信,包括 peer 间通信(集群内部)与 client 通信(客户端访问)。压测环境中启用 TLS 会引入额外的 CPU 开销,需在安全与性能之间权衡。

3.3.1 证书生成(使用 cfssl)

# 生成 CA 证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

# 生成 etcd 服务端证书(含 SAN)
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=server \
  server-csr.json | cfssljson -bare server

# 生成 peer 证书(用于节点间通信)
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=peer \
  peer-csr.json | cfssljson -bare peer

3.3.2 启动带 TLS 的 etcd 集群

etcd --name node1 \
  --initial-advertise-peer-urls https://192.168.1.10:2380 \
  --listen-peer-urls https://0.0.0.0:2380 \
  --listen-client-urls https://0.0.0.0:2379 \
  --advertise-client-urls https://192.168.1.10:2379 \
  --cert-file=/etc/etcd/ssl/server.pem \
  --key-file=/etc/etcd/ssl/server-key.pem \
  --peer-cert-file=/etc/etcd/ssl/peer.pem \
  --peer-key-file=/etc/etcd/ssl/peer-key.pem \
  --peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \
  --trusted-ca-file=/etc/etcd/ssl/ca.pem \
  --client-cert-auth \
  --peer-client-cert-auth

3.3.3 TLS 对压测性能的影响

指标 无 TLS TLS(RSA 2048) TLS(ECDSA P256)
写入 QPS 100% 基线 下降约 15-25% 下降约 8-12%
读取 QPS 100% 基线 下降约 10-20% 下降约 5-10%
CPU 使用率 低 中(握手与加解密) 较低
延迟 P99 低 增加 1-3ms 增加 0.5-1ms
压测最佳实践: 若压测目标为 etcd 本身性能极限,建议先关闭 TLS 获取基线;若压测模拟生产环境,必须启用 TLS 并记录性能损耗。推荐使用 ECDSA 证书以减少加解密开销。

3.4 集群部署架构图

下图展示了一个 3 节点 etcd 集群的部署架构,包含静态发现与 TLS 加密通信链路。

etcd 3 节点集群部署架构(静态发现 + TLS) etcd 3 节点集群部署架构 etcd Node 1 192.168.1.10:2380 Role: Leader TLS peer: enabled etcd Node 2 192.168.1.11:2380 Role: Follower TLS peer: enabled etcd Node 3 192.168.1.12:2380 Role: Follower TLS peer: enabled Client (压测工具) 说明: 1. 节点间通过 peer URL(2380 端口)进行 Raft 通信,启用 TLS 双向认证。 2. 客户端通过 client URL(2379 端口)访问任意节点,支持 TLS 加密。 3. 静态发现:启动时通过 --initial-cluster 指定全部节点地址,无需外部服务。

3.5 部署步骤总结

  1. 规划节点与 IP:确定集群规模(3 或 5 节点),分配固定 IP。
  2. 生成 TLS 证书:创建 CA、server 证书、peer 证书,分发至各节点。
  3. 选择发现方式:压测环境推荐静态发现,容器环境可选动态发现。
  4. 启动集群:按顺序启动各节点,观察集群健康状态(etcdctl endpoint health)。
  5. 验证安全通信:使用 --cacert、--cert、--key 参数测试 TLS 连接。
  6. 记录基线配置:将集群配置参数、证书信息、节点拓扑记录在压测报告中,便于复现。
快速验证命令:
etcdctl --endpoints=https://192.168.1.10:2379 --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/server.pem --key=/etc/etcd/ssl/server-key.pem endpoint status --write-out=table