优雅处理 MinIO 中的磁盘故障

Gracefully handling disk failures in MinIO

MinIO 以其业界领先的性能、数据持久性和简洁易用而闻名。本博文重点介绍了使 MinIO 成为数据湖和数据密集型应用程序工作负载可靠之家的容错和故障排除机制。

MinIO 使用内置的 擦除编码 来提供数据冗余、容错和可用性。MinIO 部署具有针对多个驱动器故障的内置容错能力。实际上,MinIO 可以丢失多达一半的驱动器和节点,而不会丢失任何数据。擦除编码是 MinIO 的核心,我们鼓励客户使用我们在线的 擦除代码计算器规划他们的部署。

在本文中,我们将主要关注如何管理出现故障的驱动器。我们将尝试将它们恢复到良好状态,或者展示如何完全替换它们的最佳实践,而不会影响现有操作。与硬件 RAID 配置类似,MinIO 允许您用健康驱动器热插拔故障驱动器,然后将它们添加到池中以使其恢复到整体健康状态。

MinIO 从一开始就以弹性为设计理念。它可以在“典型”驱动器故障(例如单个驱动器故障)以及多个驱动器故障(例如多个驱动器故障)的情况下继续运行,只要一次发生的驱动器数量没有超过擦除计算器阈值。重要的是,坏的驱动器要尽快更换,因为如果发生故障的驱动器数量超过配置的奇偶校验级别,则可能会导致不可逆转的数据损坏。

通常,您可以使用简单的 umount 命令从 MinIO 服务器中删除驱动器。您还可以使用其他基本的 Linux 工具(如 iostatiotop、SMART 警告、系统日志和 MinIO 日志中的驱动器错误)进行故障排除和修复,甚至使用 dd 向故障磁盘写入随机字符并验证读写性能。可能不言而喻,但为了完整起见,我们还是要说一下,如果您删除了一个驱动器并将其丢弃,请确保销毁其上的所有数据。从单个节点的单个驱动器中重新构建擦除编码的数据将非常困难,甚至不可能,但我们不希望任何人冒险使用数据。

MinIO 将每个对象划分为数据和奇偶校验分片,并将这些分片分布在单个擦除集中。对于每个唯一的对象命名空间 (BUCKET/PREFIX/[PREFIX/...]/OBJECT.EXTENSION),MinIO 始终为读写操作选择相同的擦除集。这包括同一对象的

最好用一个简单的视觉图来演示。假设您有一个带有 16 个驱动器的单个节点。您可以用 EC: 4 的奇偶校验配置它,这是默认设置,这样最多可以容忍 4 个驱动器发生故障,然后才能读取节点。

EC: 4 配置中,如果两个驱动器发生故障,节点将使用来自数据驱动器和奇偶校验驱动器的数据来服务请求。

使用上述配置,MinIO 支持每个擦除集最多容忍 4 个驱动器故障,并且仍然可以服务写操作。当擦除集处于降级状态时,MinIO 会自动增加降级擦除集的奇偶校验,以达到与健康集相同的级别。但降级集需要尽快恢复到健康状态,如前所述。

通过在软件层管理数据,MinIO 不需要昂贵的硬件和 RAID 控制器,简化了磁盘管理,无需执行重新平衡或使用 RAID CLI 进行驱动器维护。

当驱动器损坏无法修复,并且擦除集中存在一个分片损坏时,一旦将磁盘更换为好的磁盘,MinIO 就可以使用任何数据或奇偶校验分片来修复损坏的分片。

在我们之前的示例中,由于我们将奇偶校验配置为 EC : 4,因此擦除集在任何给定时间最多可以容忍 4 个驱动器发生故障。

但是,在数据损坏的情况下,将使用来自数据驱动器和奇偶校验驱动器的数据来修复对象。此修复过程对最终用户应用程序是透明的,因为它在后台运行,不会影响整个集群的性能。根据修复的数据量,此过程可能需要几分钟到几小时的时间。在磁盘重新填充水合的过程中,它将立即开始用于读写操作,因为新数据正在进来。MinIO 不需要等到修复完成才能使用新驱动器。

以下是我们最近为提高修复速度而做出的改进。

  • 避免修复在磁盘修复开始后上传的新对象。如果集群中存在对新对象的活动上传,这将使修复更快完成。
  • 同时在同一擦除集中修复多个被替换的磁盘。这使得修复过程更智能,避免了每次都要重新扫描进行修复。
  • 我们已对错误后的修复恢复进行了多次修复。
  • 默认情况下分配了更多工作线程,使修复速度更快。

MinIO 的擦除编码算法确保损坏的对象会被捕获并实时修复,其实现是为了速度而设计的。MinIO 在单核 CPU 上轻松达到超过 10 GB/秒的哈希速度。

MinIO 不仅可以承受多个驱动器故障,还可以承受 多个节点和多站点 故障。默认情况下,MinIO 会检测这些有缺陷的慢速驱动器,并将它们从服务器池中的擦除集中移除。之后,这些故障驱动器可以用新的驱动器进行热插拔,MinIO 将从这些驱动器开始修复过程,而不会影响任何应用程序或集群性能。我们将逐步介绍一个简单的早期流程,说明在 MinIO 中更换驱动器是多么容易,这确保了所有恢复到驱动器上的数据的完整性和正确性。

在识别出故障驱动器后,在这种情况下,假设它是 /dev/sdb,我们来更换该驱动器。

卸载故障驱动器设备

umount /dev/sdb

用已知的良好驱动器更换故障驱动器

格式化驱动器并创建一个分区

mkfs.xfs /dev/sdb -L DRIVE1

检查 /etc/fstab 以确保是否需要添加此驱动器作为新驱动器,或者是否需要修改现有条目。这因操作系统和云提供商而异,因此请确保使用与您的驱动器相匹配的正确配置。

cat /etc/fstab

完成适当的更改后,继续安装更换后的驱动器。

mount -a
DrivePerf: ✔

NODE PATH READ WRITE
http://minio1:9000 /disk1 445 MiB/s 150 MiB/s
http://minio1:9000 /disk2 451 MiB/s 150 MiB/s
http://minio3:9000 /disk1 446 MiB/s 149 MiB/s
http://minio3:9000 /disk2 446 MiB/s 149 MiB/s
http://minio2:9000 /disk1 446 MiB/s 149 MiB/s
http://minio2:9000 /disk2 446 MiB/s 149 MiB/s
http://minio4:9000 /disk1 445 MiB/s 149 MiB/s
http://minio4:9000 /disk2 447 MiB/s 149 MiB/s

ObjectPerf: ✔

THROUGHPUT IOPS
PUT 461 MiB/s 7 objs/s
GET 1.1 GiB/s 17 objs/s

MinIO 2023-10-03T18:10:45Z, 4 servers, 8 drives, 64 MiB objects, 6 threads

驱动器安装完毕后,使用 mc admin console 命令获取 MinIO 服务器关于更换驱动器的日志。除此之外,您可以使用 mc admin heal 来监控整体修复过程。MinIO 确保所有驱动器都能快速修复,而不会影响整个系统的性能。

如果您想了解有关 MinIO 中的擦除编码和驱动器修复的更多信息,请参阅我们的 MinIO 擦除代码实验室 培训视频。

SUBNET 是首选

为了提供对客户端系统的全面了解,MinIO 开发了一种名为 HealthCheck 的功能,该功能仅供使用 SUBNET 订阅门户的商业客户使用。


Healthcheck 在您的 MinIO 集群和驱动器上持续运行,并且会持续监控结果,以发现任何故障或性能下降。

您可以通过发出以下命令将磁盘和其他日志发送到 SUBNET

mc support diag minio


● CPU Info ... ✔
● Disk Info ... ✔
● OS Info ... ✔
● Mem Info ... ✔
● Process Info ... ✔
● Server Config ... ✔
● System Errors ... ✔
● System Services ... ✔
● System Config ... ✔
● Admin Info ... ✔


mc: MinIO diagnostics report was successfully uploaded to SUBNET. Please click here to view
 our analysis: https://subnet.min.io/health/1/860

MinIO SUBNET 订阅不仅提供 24/7 支持,帮助您管理现有的系统,还可以帮助您从初始规划、架构、实施到将您的集群部署到生产环境。在规划大型部署(> 1PB)时,我们强烈建议由 MinIO 工程团队审查策略和架构,以确保集群可以轻松扩展,并随着您需求的增长而增长。

有关更多信息,请使用博客右下角的实时聊天与我们的专家联系,以了解有关 SUBNET 体验的更多信息。