【etcd】运维与升级:member change、backup/restore 与 3.5→3.6/3.7 门

💡 原文中文,约6700字,阅读约需16分钟。
📝

内容提要

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 差距收敛。

🏷️

标签

➡️

继续阅读