文档

对象扫描器

概览

MinIO 使用内置扫描器检查对象是否需要自愈,并执行任何已计划的对象操作。 这类操作可能包括:

扫描器在两个层级执行这些功能:集群层级和存储桶层级。 在集群层级,扫描器会将所有存储桶划分为多个组,并一次扫描其中一组。 扫描器会先处理自上次扫描以来新增的存储桶,然后再以随机顺序扫描其他存储桶。 在完成所有存储桶组的检查后,扫描器会重新开始新一轮扫描。

在存储桶层级,扫描器会对存储桶内条目分组,并从该存储桶中选择部分条目进行扫描。 扫描器会根据对象名称的哈希值来选择要扫描的对象。 在 16 轮扫描的周期内,MinIO 会检查命名空间中的每个对象。 对于自上次扫描以来确认新增的任何前缀,MinIO 会执行完整扫描。

扫描时长

影响一次扫描完成时间的因素有很多。

其中包括:

  • 提供给 MinIO 的驱动器类型

  • 可用吞吐量和 iops

  • 对象数量和大小

  • MinIO Server 上的其他活动

例如,默认情况下,MinIO 会暂停扫描器,以便将 I/O 资源让给读写请求。 这会拉长扫描完成所需的时间。

MinIO 在每次扫描之间的等待时间,会按本次扫描操作耗时乘以一个系数来计算。 默认情况下,该系数为 10.0,表示 MinIO 会在一次扫描完成后等待相当于该操作耗时 10 倍的时间,再开始下一次扫描。 这个系数会根据配置的 扫描器速度设置 发生变化。

扫描器性能

影响扫描器性能的因素有很多。 其中包括:

  • 可用节点资源

  • 集群规模

  • 纠删码集合数量相对于驱动器数量的关系

  • 存储桶层级结构的复杂度(对象和前缀)

例如,在相同硬件和工作负载条件下,一个从 100TB 数据增长到 200TB 数据的集群,扫描完整个存储桶和对象命名空间所需的时间会更长。 同样地,单个包含 16 块驱动器的纠删码集合,其扫描耗时会长于把相同数量驱动器拆分为两个 8 驱动器纠删码集合的情况。

MinIO 将扫描器视为后台任务,并会暂停它以优先完成集群中的读写请求。 随着集群规模或工作负载增长,为保证普通 S3 操作的优先级,扫描器会更频繁地让出资源,因此其性能会下降。

你可以使用 MINIO_SCANNER_SPEED 环境变量或 scanner speed 配置项, 调整 MinIO 在扫描器性能与读写操作之间的平衡方式。

扫描器指标

MinIO 提供了若干 与扫描器相关的指标

使用 mc admin scanner info 可以查看扫描器当前状态,以及距离上次完整扫描所经过的时间。 这有助于理解扫描器操作提供的各项指标。

扫描器指标(包括 usage 指标)反映的是最近一次完成的扫描结果。 自上次扫描以来发生的 PUTDELETE 操作,不会在 usage 中体现,直到受影响的存储桶完成下一次扫描。

输出类似如下:

Overall Statistics
------------------
Last full scan time:   0d0h14m; Estimated 2885.28/month
Current cycle:         70464; Started: 2024-04-19 20:02:34.568479139 +0000 UTC
Active drives:         2

Last Minute Statistics
----------------------
Objects Scanned:       620 objects; Avg: 124.929µs; Rate: 892800/day
Versions Scanned:      620 versions; Avg: 2.801µs; Rate: 892800/day
Versions Heal Checked: 0 versions; Avg: 0ms
Read Metadata:         621 objects; Avg: 88.416µs, Size:
ILM checks:            656 versions; Avg: 663ns
Check Replication:     656 versions; Avg: 1.061µs
Verify Deleted:        0 folders; Avg: 0ms
Yield:                 3.086s total; Avg: 4.705ms/obj