数据损坏

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。

清除成员持久状态

成员状态可以通过以下方式清除:

  1. 停止 etcd 实例。
  2. 备份 etcd 数据目录。
  3. snap 子目录从 etcd 数据目录中移出。
  4. 使用 --initial-cluster-state=existing--initial-cluster 中列出的集群成员启动 etcd

预计 etcd 成员将从领导者下载最新的快照。

替换成员

成员可以通过以下方式替换:

  1. 停止 etcd 实例。
  2. 备份 etcd 数据目录。
  3. 删除数据目录。
  4. 通过运行 etcdctl member remove 从集群中移除成员。
  5. 通过运行 etcdctl member add 将其重新添加回集群
  6. 使用 --initial-cluster-state=existing--initial-cluster 中列出的集群成员启动 etcd

恢复整个集群

可以通过从当前领导者保存快照并将其恢复到所有成员来恢复集群。对领导者运行etcdctl snapshot save,然后按照恢复集群的步骤进行操作。


最后更新于 2025 年 6 月 3 日:递归地将 v3.6 的内容复制到 v3.7(a90b2a6)