文档版本 v3.7-DRAFT 处于 草稿 状态。如需获取最新的稳定版文档,请参阅 v3.6。
数据损坏
etcd 数据损坏与恢复
etcd 内置了自动化的数据损坏检测功能,以防止成员状态出现分歧。
启用数据损坏检测
数据损坏检测可以通过以下方式进行:
- 初始检查,通过
--experimental-initial-corrupt-check标志启用。 - 定期检查:
- 压缩修订版本哈希,通过
--experimental-compact-hash-check-enabled标志启用。 - 最新修订版本哈希,通过
--experimental-corrupt-check-time标志启用。
- 压缩修订版本哈希,通过
初始检查将在 etcd 成员启动时执行。成员会将其持久状态与其他成员进行比较,如果存在不匹配则退出。
两种定期检查将由正在运行的集群中的领导者执行。领导者会将其持久状态与其他成员进行比较,如果存在不匹配则会触发 CORRUPT ALARM。这两种检查的目的相同,但都值得启用以平衡性能和检测时间。
- 压缩修订版本哈希检查 - 需要定期压缩,性能开销最小,可以处理慢跟随者。
- 最新修订版本哈希检查 - 性能开销高,无法处理慢跟随者或频繁压缩。
压缩修订版本哈希检查
使用 --experimental-compact-hash-check-enabled 标志启用后,该检查每分钟执行一次。可以使用 --experimental-compact-hash-check-time 标志调整检查频率,格式为:1m - 每分钟,1h - 每小时。此检查扩展了压缩过程,还会计算可以在集群成员之间比较的校验和。不会导致额外的数据库扫描,因此成本很低,但需要在集群中定期进行压缩。
最新修订版本哈希检查
使用 --experimental-corrupt-check-time 标志启用,需要提供一个执行周期,格式为:1m - 每分钟,1h - 每小时。由于性能开销较高,建议的周期为几小时。运行检查需要通过扫描给定修订版本的整个 etcd 内容来计算校验和。
恢复损坏的成员
有三种方法可以恢复损坏的成员:
- 清除成员持久状态
- 替换成员
- 恢复整个集群
在损坏的成员恢复后,可以移除 CORRUPT ALARM。
清除成员持久状态
成员状态可以通过以下方式清除:
- 停止 etcd 实例。
- 备份 etcd 数据目录。
- 将
snap子目录从 etcd 数据目录中移出。 - 使用
--initial-cluster-state=existing和--initial-cluster中列出的集群成员启动etcd。
预计 etcd 成员将从领导者下载最新的快照。
替换成员
成员可以通过以下方式替换:
- 停止 etcd 实例。
- 备份 etcd 数据目录。
- 删除数据目录。
- 通过运行
etcdctl member remove从集群中移除成员。 - 通过运行
etcdctl member add将其重新添加回集群 - 使用
--initial-cluster-state=existing和--initial-cluster中列出的集群成员启动etcd。
恢复整个集群
可以通过从当前领导者保存快照并将其恢复到所有成员来恢复集群。对领导者运行etcdctl snapshot save,然后按照恢复集群的步骤进行操作。