跳到内容

对象检测与自动恢复

RustFS 架构与自愈设计

单服务器多磁盘架构

RustFS 采用单服务器多磁盘设计,将多个磁盘组织成一个逻辑存储池,提供对象存储服务。每个对象在写入时会被分割成多个数据分片和冗余分片,并分布在不同的磁盘上,以提高可靠性和性能。

自愈设计原则

  1. 数据完整性校验:结合校验和机制,确保对象分片数据在读取时的一致性,例如 ZFS 在读取时会校验每个数据块的校验和,并在校验失败时进行修复。
  2. 分片冗余与纠删码:通过纠删码技术生成冗余分片。当部分数据分片丢失或损坏时,可以使用冗余分片重建原始对象。
  3. 多级自愈触发机制:包括读取时的在线自愈、后台扫描自愈以及手动触发自愈,以平衡性能和数据可靠性。

对象自愈原理

校验与纠删码

在对象写入阶段,RustFS 会根据指定的纠删参数,将对象分割成 k 个数据分片和 m 个冗余分片,并分布在 n=k+m 个块设备上。在读取时,如果检测到分片损坏或丢失,可以通过其他完整的分片进行重建。

数据校验与修复(Scrub & Repair)

RustFS 会定期对存储池执行轻量级校验(light scrub)和深度校验(deep scrub)。

  • 轻量级校验:比较对象元数据和分片大小,在发现损坏时进行标记。
  • 深度校验:逐比特读取分片数据并验证校验和,检测并修复隐藏的坏块或位腐烂问题。

当数据扫描发现不一致时,RustFS 会自动调用修复(Repair)流程,利用冗余分片重建损坏的分片,并将修复后的分片写回原始磁盘或备份磁盘,从而确保下一次访问时的数据完整性。

自愈过程

读取时的在线自愈

每次客户端执行 GETHEAD 请求时,RustFS 首先会检查对应对象的全部数据分片。

  1. 如果所有数据分片都完好无损,则直接返回数据。
  2. 如果分片丢失或损坏,系统会根据冗余分片计算出缺失的分片,进行修复,然后将完整对象返回给客户端。此机制与 MinIO 的读取时自愈过程一致,实现了透明的数据修复,而不影响客户端请求。

后台扫描自愈

RustFS 内置对象扫描器,通过哈希方法遍历存储池中 1/1024 的对象进行完整性检查。

  • 对象扫描器会定期执行轻量级校验(可配置频率);
  • 若发现损坏,将立即触发自愈重建过程。默认情况下,为降低资源开销,不执行深度位腐烂检查,但可根据需要启用深度校验。

手动触发自愈

管理员可以通过命令行工具执行全量的自愈操作。

bash
rc admin heal start --all

此操作会扫描整个存储池,并对所有对象执行完整的校验和修复,会消耗大量资源,因此应在低峰期谨慎使用。

使用示例

bash
# View current self-healing status
rc admin heal status
# Start self-healing for specified bucket
rc admin heal start --bucket photos
# Stop ongoing self-healing tasks
rc admin heal stop

总结

RustFS 的对象自愈结合了 MinIO、Ceph 和 ZFS 等系统的成熟设计。通过多层级触发的校验和修复流程,能够有效应对单机多盘和多机多盘环境中出现的分片损坏、磁盘故障以及位腐烂等问题,确保对象存储的高可靠性和高可用性。

根据 Apache 许可证 2.0 发布。