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 加密通信链路。
3.5 部署步骤总结
- 规划节点与 IP:确定集群规模(3 或 5 节点),分配固定 IP。
- 生成 TLS 证书:创建 CA、server 证书、peer 证书,分发至各节点。
- 选择发现方式:压测环境推荐静态发现,容器环境可选动态发现。
- 启动集群:按顺序启动各节点,观察集群健康状态(
etcdctl endpoint health)。 - 验证安全通信:使用
--cacert、--cert、--key参数测试 TLS 连接。 - 记录基线配置:将集群配置参数、证书信息、节点拓扑记录在压测报告中,便于复现。
快速验证命令:
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