3. 单节点 etcd 部署:环境准备与实例启动
单节点 etcd 是压测沙盘的基础单元。本节将完成从操作系统配置、Go 语言环境准备、etcd 二进制下载安装,到单节点实例启动与健康验证的全流程。所有操作均面向后续压测场景,强调可复现性与最小化干扰。
3.1 环境准备:操作系统与 Go 版本
etcd 官方对 Linux 平台支持最佳,推荐使用 Ubuntu 22.04 LTS 或 CentOS 7.9+。以下为已验证的基准环境配置:
| 环境项 | 推荐值 | 最低要求 | 说明 |
|---|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS | Linux kernel 4.15+ | 内核需支持 epoll 与 TCP 快速重传 |
| Go 版本 | 1.21.x | 1.19+ | 编译 etcd 源码或运行 Go 客户端压测工具 |
| CPU | 4 核 | 2 核 | 压测场景建议 4 核以上 |
| 内存 | 8 GB | 4 GB | etcd 默认使用 2 GB 内存缓存 |
| 磁盘 | SSD, 100 GB | HDD, 20 GB | 强烈建议 SSD,避免 IO 成为瓶颈 |
Go 版本检查: 执行
go version 确认版本。若未安装,可通过以下命令快速安装 Go 1.21:
wget https://go.dev/dl/go1.21.13.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.13.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
3.2 下载与安装 etcd
etcd 提供预编译二进制包,推荐直接从 GitHub Releases 获取。以下为 v3.5.15 版本的安装步骤(当前稳定版):
- 下载压缩包
ETCD_VER=v3.5.15 wget https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz - 解压并移动二进制文件
tar -xzf etcd-${ETCD_VER}-linux-amd64.tar.gz sudo mv etcd-${ETCD_VER}-linux-amd64/etcd* /usr/local/bin/ - 验证安装
输出应显示版本号etcd --version etcdctl version3.5.15及 API 版本3.5。
注意: 不要使用系统包管理器(如 apt、yum)安装 etcd,其版本通常滞后且缺少压测所需的最新特性。始终从官方 Release 下载。
3.3 启动单节点实例
单节点模式无需配置集群参数,只需指定数据目录与监听地址。以下为最小化启动命令:
etcd --name etcd-single \
--data-dir /var/lib/etcd \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://127.0.0.1:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://127.0.0.1:2380 \
--initial-cluster etcd-single=http://127.0.0.1:2380 \
--initial-cluster- etcd-single- \
--initial-cluster-state new
参数说明:
| 参数 | 值 | 作用 |
|---|---|---|
--name |
etcd-single | 节点名称,用于集群内标识 |
--data-dir |
/var/lib/etcd | 数据持久化目录 |
--listen-client-urls |
http://0.0.0.0:2379 | 客户端监听地址,压测工具连接此端口 |
--advertise-client-urls |
http://127.0.0.1:2379 | 对外公布的客户端地址 |
--initial-cluster-state |
new | 新建集群,非加入已有集群 |
启动后,etcd 会在前台打印日志。建议使用 nohup 或 systemd 将其转为后台服务:
nohup etcd --name etcd-single \
--data-dir /var/lib/etcd \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://127.0.0.1:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://127.0.0.1:2380 \
--initial-cluster etcd-single=http://127.0.0.1:2380 \
--initial-cluster- etcd-single- \
--initial-cluster-state new \
&> /var/log/etcd.log &
3.4 验证服务状态
启动后,通过以下三种方式验证 etcd 是否正常运行:
- 检查进程与端口
应看到 etcd 进程监听 2379(客户端)和 2380(节点间通信)端口。ss -tlnp | grep -E '2379|2380' ps aux | grep etcd - 使用 etcdctl 检查集群健康
返回etcdctl --endpoints=http://127.0.0.1:2379 endpoint healthhttp://127.0.0.1:2379 is healthy: successfully committed proposal: took = 2.345ms表示健康。 - 写入与读取键值对
应输出etcdctl put /test-key "hello-etcd" etcdctl get /test-key/test-key及值hello-etcd。
压测前置检查: 在开始压测前,务必执行
etcdctl endpoint status --write-out=table 确认节点版本、DB 大小与 leader 信息。单节点模式下,leader 即为自身。
3.5 单节点部署架构示意
下图展示了单节点 etcd 实例的内部组件与外部交互关系,为后续压测中的客户端连接模型提供参考:
3.6 常见问题与排查
| 现象 | 可能原因 | 解决方式 |
|---|---|---|
| 端口 2379 被占用 | 已有 etcd 或其他服务运行 | sudo lsof -i:2379 查找进程并停止,或更换端口 |
| 数据目录权限不足 | etcd 以非 root 用户运行 | sudo chown -R $(whoami) /var/lib/etcd |
| etcdctl 连接超时 | 防火墙或监听地址未绑定 0.0.0.0 | 检查 --listen-client-urls 是否包含 0.0.0.0 |
| 启动日志报 "rafthttp: request cluster ID mismatch" | 数据目录残留旧集群数据 | 清空 /var/lib/etcd/member 后重新启动 |
压测前重置环境: 每次压测前建议执行
etcdctl del "" --prefix 清空所有键值,或直接删除 --data-dir 目录并重启,确保测试基线一致。