etcd:快照、恢复与 Watch 自检
etcd 快照恢复、容量与故障诊断
本轮为理论笔记与静态审读,示例、安装命令和验收器均未执行。下文命令用于解释步骤,预期结果不代表本轮实测;“历史验收”仅指此前批次记录。阅读和书面练习不需要启动服务。
快照保存与独立恢复
前置:配置程序已写入一个不附租约的配置键。etcdctl snapshot save 导出一致性快照,etcdutl snapshot restore 导入离线快照;v3.6 不应照搬历史文章中的 etcdctl snapshot restore。快照内含完整敏感配置,需加密存储、访问控制与异地保留。先验证快照能恢复,再讨论备份策略。
docker exec showdocs-m4b-etcd-main etcdctl snapshot save /etcd-data/course.db
docker exec showdocs-m4b-etcd-main etcdutl snapshot status /etcd-data/course.db -w table
docker cp showdocs-m4b-etcd-main:/etcd-data/course.db examples/etcd/course.db恢复必须使用空的新数据目录与新 cluster token/name/peer 配置;恢复不是把成员重新接回旧集群。项目验收器在 showdocs-m4b-etcd-restore-data 中运行 etcdutl,再启动 showdocs-m4b-etcd-restore,没有映射主机端口;用 docker exec 查询 /course/config,值与快照时一致,cluster_id 与源不同。完整命令见验证器源码。源 showdocs-m4b-etcd-data 不会被覆盖。
快照恢复得到的是快照时刻的数据,之后提交丢失,RPO 由备份间隔和可用性决定。已有 watch 缓存的系统(尤其 Kubernetes)还涉及 revision 回退,需按官方恢复文档评估 bump-revision 与 mark-compacted,不能把本课程无客户端缓存的恢复直接当作 Kubernetes 灾备方案。
健康、容量和清理
docker exec showdocs-m4b-etcd-main etcdctl endpoint status -w table
docker exec showdocs-m4b-etcd-main etcdctl endpoint health
docker exec showdocs-m4b-etcd-main etcdctl alarm list
docker logs --tail 30 showdocs-m4b-etcd-mainendpoint health 验证请求能完成,endpoint status 提供版本、leader、Raft 与数据库大小线索。NOSPACE 表示后端配额告警,应先核对使用量、保留策略和磁盘,不要只反复写入重试。compact 丢弃旧历史,defrag 整理空闲页;解决配额与空间问题后才按流程 disarm 告警。备份、压缩、碎片整理不是同一件事,压缩也不提供误删恢复。
目标停止与错误定位
docker stop showdocs-m4b-etcd-main
node examples/etcd/app.mjs get /course/config
docker start showdocs-m4b-etcd-main停止目标后应用退出非零,stderr 指出容器未运行;若服务进程仍在但地址不通,则可能出现 deadline exceeded。先分清 Docker 容器状态、客户端使用的 endpoint、TCP 可达性,再查证书、权限、leader 与磁盘延迟。恢复源后读取应仍保留持久化配置。网络隔离时不要轻率使用 force-new-cluster,这可能制造分裂配置;成员变更需依现有 quorum 状态实施。
required revision has been compacted 不是磁盘损坏,表示客户端要求的历史已被回收;重新全量同步。requested lease not found 通常是 lease 已到期或被撤销,注册者应申请新租约并明确重注册。单节点停止失败是教学预期,不是容错测试失败。
资源清单与练习
本包容器:showdocs-m4b-etcd-main、showdocs-m4b-etcd-restore;临时导入容器 showdocs-m4b-etcd-import 使用 --rm。卷:showdocs-m4b-etcd-data、showdocs-m4b-etcd-restore-data。先 docker inspect 核对卷挂载,确认不再需要实验数据后,只对这些确切资源执行 docker rm -f 和 docker volume rm。不要使用全局 prune。
练习:快照后把配置改为新值,再在独立恢复实例查询,应该是什么?提示:画出快照时刻、源后续写入和独立恢复三种状态;比较数据卷来源。
参考答案与边界
恢复的是快照值,源仍为新值;若二者都变成旧值,检查是否错误共享卷或改写了源数据目录。课程验收查询比较配置值和 cluster_id,不能只看“容器启动成功”。
etcd 综合练习与学习自检
本轮为理论笔记与静态审读,示例、安装命令和验收器均未执行。下文命令用于解释步骤,预期结果不代表本轮实测;“历史验收”仅指此前批次记录。阅读和书面练习不需要启动服务。
配置发布练习
前置:读懂 get、cas 和 register 的源码接口,并解释 mod_revision。目标是把配置发布推演成可检查的状态变化:假设一个不存在的新键 /course/review/config,以 revision=0 创建;两个写者读取相同版本后发布不同配置;写出各自预期退出码及最终值。不能只写“更新完成”,还要说明服务端返回版本的作用。无需执行示例。
提示:先区分“键不存在”的 revision=0 与“键已存在”的实际 mod_revision。
参考答案与边界
第一次创建 updated=true;第二个终端若再次使用 0,会冲突退出 2。两个写者读取同一 mod_revision 并竞争,成功者写入,失败者取到当前配置后重新合并。CAS 的原子比较阻止丢失更新,单独加一个进程内互斥锁不能协调另一台机器上的写者。业务发布还应记录操作者和变更内容;课程不附带审计系统。
注册与重连练习
目标:让一个观察者建立前缀缓存,另一个工作者注册后退出。先读取 /course/ 前缀并保存 header.revision,再从该 revision+1 watch;记录 PUT 和 TTL 到期 DELETE。断开观察者后继续修改,再使用最后应用 revision+1 重连。
提示:画出全量读取、监听起点、断线位置与压缩边界的时间线。
参考答案与边界
保留的历史能补发变化;已经 compacted 的历史不能补发,须全量重建缓存。租约续约失败时应把自身注册状态标为未知或失效,不能继续宣布健康。模拟 TTL 到期时允许服务端实际时间窗口,不将毫秒级误差视作错误。用 revoke 可以主动注销,但不能用 revoke 冒充本题“自然到期”的证据。
恢复与容量练习
目标:保存快照,源写入快照后值,在全新独立数据卷恢复并查询。说明两个集群值不同的原因,列出 revision、cluster_id、快照时刻与启动参数。随后说明为何 compact 后磁盘文件未立即缩小。
提示:分别列出快照的数据边界与 defrag 的空间作用。
参考答案与边界
恢复集群处于快照时刻,cluster_id 是新集群,源不回滚。compact 移除可见旧历史,数据库页可能仍占文件空间,defrag 才整理空闲页;它会阻塞成员服务一段时间,不能在繁忙集群无计划并发执行。定期备份与恢复演练用于测量 RPO/RTO,单次小数据成功不能证明生产恢复时长。
完成标准与后续边界
你应能解释 revision/version/mod_revision 的区别,知道默认线性一致读取仍需 CAS 防止竞争,能看到 lease 到期 DELETE,能处理 watch 历史压缩,能恢复独立快照并通过停止目标确认失败退出。若任一项只会背命令,回到对应机制章节再做一次。
历史批次没有验收多成员 quorum 故障切换、生产 TLS/RBAC 配置、Kubernetes revision 修复或大规模负载。后续扩展应增加多故障域部署、证书轮换、身份权限、配额告警与完整客户端重同步测试。旧 3.1.5/v2 和 3.3.10 文档仍作历史资料,不能将其安装和恢复命令直接混入本课 v3.6 路线。
继续阅读
- 完整实践
- 知识专题
- 知识专题