参考:Raft 术语速查与 etcd 命令清单
基于 etcd 3.5 · 核于 2026-08
速查
- etcd 定义:CNCF 开源的分布式强一致 KV 存储,Raft 共识,CP 型,是 K8s 唯一状态存储。
- Raft 核心:Leader 唯一写 + 过半提交。三角色 Leader/Follower/Candidate,term 任期号,奇数节点。
- 三大机制:MVCC(多版本 revision)、Watch(流式持续监听)、Lease(带 TTL 租约,做存活/选举/锁)。
- 一致性级别:Linearizable(默认,读走 Leader 强一致)/ Serializable(本地读,快但可能旧值)。
- K8s 底座:所有资源是
/registry/<kind>/<ns>/<name>的 KV,resourceVersion = revision,Watch 驱动控制循环。 - vs ZooKeeper:Raft 易理解 vs ZAB 不透明,Go 轻量 vs JVM 重型,流式 Watch vs 一次性(3.6 前)。
- vs Consul/Nacos:纯 KV 底座(要自拼发现)vs 业务服务发现开箱即用。
一、Raft 术语速查
| 术语 | 含义 |
|---|---|
| term | 任期号,单调递增的逻辑时钟,每次选举自增 |
| Leader | 唯一,处理所有写,发心跳维持地位 |
| Follower | 被动接收 Leader 日志与心跳 |
| Candidate | Follower 超时未收心跳,转为发起选举 |
| election timeout | 触发选举的超时(随机 150-300ms,防同时竞选) |
| log entry | 日志条目(term + index + cmd),按顺序复制 |
| committed | 日志被过半节点复制,不可撤销 |
| applied | committed 后应用到状态机(KV 真正写入) |
| majority(过半) | N/2+1,3 节点=2,5 节点=3 |
二、etcd 三大机制速查
| 机制 | 作用 | 关键 |
|---|---|---|
| MVCC | 每次写产生新 revision,保留历史版本 | 按 revision 读旧值;compact 清理旧版 |
| Watch | 监听 key/prefix 变化,流式推送 | 基于 revision,断线重连续看,不丢事件 |
| Lease | 带 TTL 的租约,绑定 key,到期自动删 | keep-alive 续约;过期自动删 key(存活/选举/锁) |
| TXN | 事务,if 条件 then 操作 else 操作 | compare-and-swap,原子,乐观锁 |
三、一致性级别对比
| 级别 | 原理 | 一致性 | 延迟 | 适用 |
|---|---|---|---|---|
| Linearizable(默认) | 读走 Leader,ReadIndex 确认 Leader 身份 | 强一致(最新已提交) | 较高 | 不能容忍旧值 |
Serializable(--consistency=s) | 读本地副本 | 可能 stale(旧值) | 低 | 容忍旧值(配置/监控) |
四、常用命令速查
bash
# —— 集群管理 ——
etcd # 启动单节点(默认 2379 客户端 / 2380 对等)
etcd --name=node-1 \
--initial-cluster=node-1=http://10.0.0.1:2380,node-2=http://10.0.0.2:2380,node-3=http://10.0.0.3:2380 \
--initial-cluster-state=new \
--initial-cluster-token=my-etcd # 集群启动
etcdctl member list # 集群成员
etcdctl endpoint status # 节点状态(含 Leader 标识)
etcdctl endpoint health # 健康检查
etcdctl snapshot save backup.db # 备份(必做)
etcdctl snapshot restore backup.db # 恢复
etcdctl compact <rev> # 压缩历史 revision(释放空间)
etcdctl defrag # 碎片整理(压缩后)
# —— KV 操作 ——
etcdctl put /config/db/host 10.0.0.100
etcdctl get /config/db/host # 单 key
etcdctl get /config/ --prefix # 前缀查询
etcdctl get /config/ --prefix --keys-only # 只看 key
etcdctl del /config/db/host
etcdctl del /config/ --prefix # 批量删
# —— Lease 租约 ——
LEASE=$(etcdctl lease grant 30 | awk '{print $2}') # 创建 30s 租约
etcdctl put /leader node-1 --lease=$LEASE # 绑定租约
etcdctl lease keep-alive $LEASE # 续约
etcdctl lease revoke $LEASE # 主动释放
# —— Watch ——
etcdctl watch /config/db/host # 单 key
etcdctl watch --prefix /config/ # 前缀
etcdctl watch /x --rev=100 # 从 rev=100 开始
# —— 事务(CAS)——
etcdctl txn <<EOF
mod_revision("/leader") = 0
put /leader node-1 --lease=$LEASE
EOF
# —— 选举 / 锁 ——
etcdctl elect /services/leader node-1 # 领导选举(阻塞,持有时是 leader)
etcdctl lock /my-lock -- echo "hold lock" # 分布式锁五、关键 API(gRPC,HTTP 网关)
| 方法 | 路径 | 用途 |
|---|---|---|
| PUT | /v3/kv/put | 写 key(可带 lease) |
| RANGE | /v3/kv/range | 读(单 key / prefix) |
| DELETE | /v3/kv/deleterange | 删 |
| TXN | /v3/kv/txn | 事务(if-then-else) |
| WATCH | /v3/watch | Watch(gRPC stream) |
| LEASE GRANT | /v3/lease/grant | 创建租约 |
| LEASE KEEPALIVE | /v3/lease/keepalive | 续约 |
| MEMBER LIST | /v3/cluster/member/list | 集群成员 |
| STATUS | /v3/maintenance/status | 节点状态(含 leader) |
六、易错点清单
- 「etcd 是注册中心」:错。etcd 是纯 KV 底座,没有服务发现/健康检查/DNS 语义。业务注册中心(开箱即用)选 Consul/Nacos,etcd 要自拼或做 K8s 底座。
- 「etcd 能存大量数据」:错。etcd 设计目标是「小而精」(官方建议 2-8GB),存大量业务数据要上专门数据库。K8s 也限制单对象 1.5MB。
- 「偶数节点更好」:错。Raft 要奇数节点(3/5/7)——偶数节点不提升容错(4 节点仍只容忍 1 故障,多数派 3),反而增加运维成本。
- 「读一定读到最新值」:错。默认 Linearizable 读才强一致;Serializable(
--consistency=s)可能读到旧值。 - 「3 节点容忍 2 个故障」:错。3 节点多数派是 2,容忍 1 个故障(挂 2 个凑不齐多数派无法写)。容忍 2 个故障要 5 节点。
- 「etcd 适合跨 DC 大集群」:错。写要过半 ack,跨 DC 延迟显著拖慢写。跨 DC 要用集群联邦或 LVM。
- 「ZooKeeper 用 Raft」:错。ZK 用 ZAB(Zookeeper Atomic Broadcast),etcd/Consul 才用 Raft。两者都是过半提交但协议不同。
- 「etcd 挂了 K8s 所有 Pod 都停」:错。etcd 挂了 apiserver 无法读写,但已运行的 Pod 不受影响(kubelet 本地缓存),只是无法新建/删除/调度。
- 「Watch 会丢事件」:错。Watch 基于 revision,断线重连从上次 revision 续看,不丢不重。但 revision 太旧(已被 compact)会报错,需重新 list。
- 「K8s 的 resourceVersion 是版本号自增」:错。它是 etcd 的 revision(全局 KV 修订号),不是资源自己的自增版本。
七、进阶方向(链接其他叶)
- Consul —— 同样用 Raft,但提供业务服务发现语义(注册/健康检查/DNS),对比纯 KV 底座
- Nacos —— 业务服务发现的另一种选择(中国 Spring Cloud)
- Istio —— 服务网格,运行在 K8s 之上(K8s 底座正是 etcd)