# 数据损坏

> etcd 数据损坏和恢复

---

LLMS 索引： [llms.txt](/zh/llms.txt)

---

etcd 内置了自动数据损坏检测机制，以防止成员状态发生不一致。

## 启用数据损坏检测 {#enabling-data-corruption-detection}

数据损坏检测可通过以下方式执行：
* 初始检查，通过 `--experimental-initial-corrupt-check` 标志启用。
* 定期检查包括：
  * 已压缩的修订版本哈希，通过 `--experimental-compact-hash-check-enabled` 标志启用。
  * 最新修订版本哈希，通过 `--experimental-corrupt-check-time` 标志启用。

引导过程中将执行初始检查。
成员将比较其持久化状态与其他成员的状态，若发现不匹配则退出。

两个周期性检查将在已运行的集群中由领导者执行。
领导者将比较其持久化状态与其他成员的状态，若发现不一致则触发 CORRUPT ALARM。
两项检查目的相同，但均建议启用，以在性能与检测时间之间取得平衡。
* 压缩修订版本哈希检查 - 需要定期执行压缩，性能开销极小，可处理缓慢的跟随者。
* 最新修订版本哈希检查 - 性能开销较高，无法处理缓慢的跟随者或频繁的压缩。

### 压缩修订版本哈希检查 {#compacted-revision-hash-check}

启用 `--experimental-compact-hash-check-enabled` 标志后，每分钟执行一次检查。
可使用 `--experimental-compact-hash-check-time` 标志调整检查频率，格式为：`1m` - 每分钟，`1h` - 每小时。
该检查将压缩功能扩展为同时计算校验和，以便在集群成员之间进行比对。
不会引起额外的数据库扫描，因此开销极低，但要求集群定期执行压缩。

### 最新修订版本哈希校验 {#latest-revision-hash-check}

通过 `--experimental-corrupt-check-time` 标志启用，需以如下格式提供执行周期：`1m` —— 每分钟，`1h` —— 每小时。
由于性能开销较高，建议周期为数小时。
运行检查需在指定修订版本下扫描整个 etcd 内容以计算校验和。

## 恢复受损成员 {#restoring-a-corrupted-member}

恢复损坏成员有三种方法：
* 清除成员持久化状态
* 替换成员
* 恢复整个集群

成员恢复后，可移除 CORRUPT ALARM 告警。

### 清除成员持久化状态 {#purge-member-persistent-state}

可按以下步骤清除成员状态：
1. 停止 etcd 实例。
2. 备份 etcd 数据目录。
3. 将 etcd 数据目录中的 `snap` 子目录移出。
6. 使用 `--initial-cluster-state=existing` 启动 `etcd`，并在 `--initial-cluster` 中列出集群成员。

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

### 替换成员 {#replace-member}

可按以下步骤替换成员：
1. 停止 etcd 实例。
2. 备份 etcd 数据目录。
3. 删除数据目录。
4. 运行 `etcdctl member remove` 从集群中移除该成员。
5. 运行 `etcdctl member add` 将其重新添加。
6. 使用 `--initial-cluster-state=existing` 启动 `etcd`，并在 `--initial-cluster` 中列出集群成员。

### 恢复整个集群 {#restore-whole-cluster}

可通过从当前领导者保存快照，并将快照恢复到所有成员来恢复集群。
对领导者执行 `etcdctl snapshot save`，并参照 [恢复集群过程](/zh/docs/etcd/op-guide/recovery/)。
