【etcd】运维与升级:member change、backup/restore 与 3.5→3.6/3.7 门
内容提要
etcd v3.5.33运维要点:成员变更需按步骤操作,避免quorum丢失;备份恢复用snapshot,K8s环境需bump revision;升级须逐minor滚动,3.5→3.6前清理v2数据,3.6→3.7前迁移experimental标志,全程保持snapshot,混合版本窗口可回滚,全升后只能restore。
延伸解读
升级不可逆:混合版本窗口是唯一回滚机会
文章强调,在滚动升级过程中,只要还有成员停留在旧版本,就可以通过换回旧二进制或从快照恢复来回滚。但一旦所有成员都升级到新 minor 版本,就无法再通过简单替换二进制回滚,只能从升级前的快照恢复。因此,升级前必须确保有可用的快照,并规划好回滚策略。
K8s 环境恢复需注意 revision 回退
在 Kubernetes 中使用 etcd 时,从快照恢复会导致 revision 大幅回退,可能引发 informer 缓存与 etcd 数据不一致。官方建议使用 --bump-revision 和 --mark-compacted 参数,使新 revision 高于旧缓存,并终止旧 revision 上的 Watch,强制客户端重新全量同步。bump 量级需根据快照年龄和写入速率估算,并非固定值。
v2 数据清理是 3.5→3.6 升级的关键前置
升级到 etcd 3.6 前,必须检查并清理 v2 数据。若从未启用 v2 API,可直接升级;否则需使用 etcdutl check v2store 检查,并根据输出进行迁移或使用 --v2-deprecation=write-only-skip-check(有风险)。WAL 中的 v2 记录可能需要等待下次 v2 快照或临时设置 --snapshot-count=1 强制快照来清理。
Q&A
etcd 集群进行成员替换时,推荐的操作步骤是什么?
推荐使用 etcdctl member add 添加新成员(可以是 learner 或 voting),然后在新节点上用 --initial-cluster-state=existing 启动,等待新节点 Raft index 追平,再 member remove 旧成员,最后确认全集群 endpoint health/status 一致。
etcd 备份时,直接拷贝 member/snap/db 文件有什么风险?
直接拷贝 member/snap/db 可能丢失尚未 snap 进 db 的 WAL 数据,因此推荐使用 etcdctl snapshot save 进行在线逻辑备份。
etcd 恢复后,为什么需要 bump revision?如何操作?
恢复后 Revision 可能回退,导致 informer 缓存不一致。使用 etcdutl snapshot restore 时加上 --bump-revision 和 --mark-compacted 可以提升 Revision 并终止旧 Watch,迫使客户端全量 List。bump 量级需根据 snapshot 年龄和写入速率估算,例如一周旧 snapshot 和 <1500 writes/s 时可考虑 10^9 量级。
从 etcd 3.5 升级到 3.6 前,必须完成哪些检查?
必须确保所有 member 版本 ≥3.5.32,移除 --enable-v2 或 ETCD_ENABLE_V2,用 etcdutl check v2store 检查 v2 数据,升级前必须做 snapshot,并采用逐 member 滚动升级。
etcd 升级到 3.7 前,需要处理哪些废弃特性?
3.7 删除了 --experimental-* 标志,需要在 3.6 阶段迁移到 feature gate 或稳定 flag;同时 3.7 移除了 v2 store/API/client/discovery,需确保 v2 数据已清理。
etcd 集群升级过程中,什么情况下可以回滚?什么情况下只能 restore?
在混合版本窗口(仍有 member 在旧版本)时,可以回滚二进制或使用 snapshot restore;一旦所有 member 都升级到新 minor 版本,则无法通过换回旧二进制回滚,只能从升级前的 snapshot 恢复。
etcd 中 learner 成员的作用是什么?promote 时需要注意什么?
Learner 是非投票成员,先以 learner 加入并同步日志,待追平后再 promote 为 voting member,以降低新节点拖慢 quorum commit 的概率。promote 前必须确保 learner 已 catch-up。
etcd 集群进行成员变更时,有哪些检查项?
检查项包括:变更前做 snapshot、确保集群仍有 quorum、新节点 --name 和 --initial-advertise-peer-urls 与 member add 输出一致、不要对已有 member 误跑 snapshot restore 覆盖 live data、K8s 环境 apiserver --etcd-servers 列表与现 member 对齐、变更后 committed index 与 applied index 差距收敛。