etcd:云原生分布式键值存储

FreeGuideOnline 最新 2026-06-30

/config/app/database/host = "10.0.0.5" /config/app/database/port = "3306" /service/user/api/v1/instances/instance1 = "192.168.1.10:8080"

可以用前缀 `/config/app/database` 一次性获取数据库相关所有配置,也可以通过 Watch 监视整个 `/config/` 下的变化。

## 安装与运行 etcd
### 单节点快速体验
在 Linux 或 macOS 上可通过官方二进制直接运行:
```bash
ETCD_VER=v3.5.13
# 下载并解压
curl -L https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o etcd.tar.gz
tar xzvf etcd.tar.gz
cd etcd-${ETCD_VER}-linux-amd64
# 启动单机 etcd,客户端监听 localhost:2379,集群通讯端口 2380
./etcd --data-dir=/tmp/etcd-data

默认情况下,etcd 的客户端请求端口为 2379,用于接收 etcdctl 或其他应用的连接。

构建本地三节点集群

使用 goreman 工具可以快速在单机模拟多节点集群。首先准备 Procfile 文件:

etcd1: bin/etcd --name infra1 --listen-client-urls http://127.0.0.1:2379 --advertise-client-urls http://127.0.0.1:2379 --listen-peer-urls http://127.0.0.1:2380 --initial-advertise-peer-urls http://127.0.0.1:2380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:2380,infra2=http://127.0.0.1:2381,infra3=http://127.0.0.1:2382' --initial-cluster-state new
etcd2: bin/etcd --name infra2 --listen-client-urls http://127.0.0.1:2389 --advertise-client-urls http://127.0.0.1:2389 --listen-peer-urls http://127.0.0.1:2381 --initial-advertise-peer-urls http://127.0.0.1:2381 ...
etcd3: ...

执行 goreman start 即可启动三个节点,它们会自动选举出 Leader。

基础操作:使用 etcdctl

etcdctl 是 etcd 的命令行工具,支持 V2 和 V3 API(现在默认 V3)。通过 export ETCDCTL_API=3 启用 V3。

写入与读取键值

# 设置键值
etcdctl put /config/app/name "myapp"
# 读取键值
etcdctl get /config/app/name
# 读取键值,并输出更多信息(创建/修改 revision 等)
etcdctl get /config/app/name --print-value-only
etcdctl get /config/app/name -w json
# 获取某个前缀的所有键值
etcdctl get /config/app --prefix

监听变化

# 监听某个键的变化(阻塞式,之后对该键的更新会实时输出)
etcdctl watch /config/app/name
# 监听某个前缀下的所有键变化
etcdctl watch /config/app --prefix
# 从历史版本开始监听(避免错过启动前的变更)
etcdctl watch /config/app/name --rev=123

租约与自动过期

# 创建一个租约,有效期为 60 秒
etcdctl lease grant 60
# 返回租约 ID,例如 694d7d45b5a5f765
# 写入带租约的键
etcdctl put /service/instance1 "10.0.0.1:8080" --lease=694d7d45b5a5f765
# 查看键剩余存活时间
etcdctl lease timetolive 694d7d45b5a5f765
# 对租约续约(保持心跳)
etcdctl lease keep-alive 694d7d45b5a5f765
# 撤销租约立即删除关联键
etcdctl lease revoke 694d7d45b5a5f765

事务与分布式锁

etcdctl 支持执行简单事务,格式为:

ETCDCTL_API=3 etcdctl txn -i
compares:
value("/config/app/version") = "1"
success requests:
put /config/app/version "2"
put /config/app/status "upgraded"
failure requests:
get /config/app/version