Skip to content

对象检查和自动恢复

概述

RustFS 架构与自愈设计

单服务器多磁盘架构

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

自愈设计原则

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

对象自愈原理

校验与纠删

RustFS 在对象写入阶段,将对象分成 k 个数据分片和 m 个冗余分片,根据指定的纠删参数分布存储于 n=k+m 块设备上。读取时,若发现有分片损坏或丢失,可从其他完好分片重建。

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

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

  • 轻量级校验 对象元数据及分片大小进行比较,发现损坏及时标。
  • 深度校验 按位读取分片数据并校验校验和,可以检测并修复隐藏的坏块或 bit rot 问题。

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

自愈流程

读取时在线自愈

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

  1. 若所有数据分片完好,则直接返回数据。
  2. 若有分片丢失或损坏,系统会根据冗余分片计算出缺失分片并修复后,再返回完整对象给客户端。 此机制与 MinIO 的读取时自愈流程一致,能够在不影响客户端请求的前提下透明修复数。

背景扫描自愈

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

  • 对象扫描器定期(可配置频率)运行轻量级校验;
  • 若发现损坏,立即触发自愈重建流程。 默认情况下不进行深度 bit rot 检查,以降低资源开销,可按需开启深度校验功能。

手动触发自愈

管理员可通过命令行工具执行全量自愈:

bash
rc admin heal start --all

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

使用示例

bash
# 查看当前自愈状态
rc admin heal status
# 启动指定桶(bucket)的自愈
rc admin heal start --bucket photos
# 停止正在进行的自愈任务
rc admin heal stop

总结

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

Released under the Apache License 2.0.