数据损坏
etcd 数据损坏和恢复
etcd 内置了自动数据损坏检测机制,以防止成员状态发生不一致。
启用数据损坏检测
数据损坏检测可通过以下方式执行:
- 初始检查,通过
--experimental-initial-corrupt-check标志启用。 - 定期检查包括:
- 已压缩的修订版本哈希,通过
--experimental-compact-hash-check-enabled标志启用。 - 最新修订版本哈希,通过
--experimental-corrupt-check-time标志启用。
- 已压缩的修订版本哈希,通过
引导过程中将执行初始检查。 成员将比较其持久化状态与其他成员的状态,若发现不匹配则退出。
两个周期性检查将在已运行的集群中由领导者执行。 领导者将比较其持久化状态与其他成员的状态,若发现不一致则触发 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 数据目录。
- 将 etcd 数据目录中的
snap子目录移出。 - 使用
--initial-cluster-state=existing启动etcd,并在--initial-cluster中列出集群成员。
预计 etcd 成员将从领导者下载最新的快照。
替换成员
可按以下步骤替换成员:
- 停止 etcd 实例。
- 备份 etcd 数据目录。
- 删除数据目录。
- 运行
etcdctl member remove从集群中移除该成员。 - 运行
etcdctl member add将其重新添加。 - 使用
--initial-cluster-state=existing启动etcd,并在--initial-cluster中列出集群成员。
恢复整个集群
可通过从当前领导者保存快照,并将快照恢复到所有成员来恢复集群。
对领导者执行 etcdctl snapshot save,并参照 恢复集群过程
。