我有一台 Debian 主机,配置为 NAS,使用 6 个磁盘,采用 RAID 5 设置。当前配置如下:
# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Mar 12 11:42:23 2021
Raid Level : raid5
Array Size : 19534424640 (18.19 TiB 20.00 TB)
Used Dev Size : 3906884928 (3.64 TiB 4.00 TB)
Raid Devices : 6
Total Devices : 6
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Sat Jan 18 17:44:06 2025
State : clean
Active Devices : 6
Working Devices : 6
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
Consistency Policy : bitmap
Name : data:0
UUID : 2265a382:cb20817f:de0f543b:a830605c
Events : 547472
Number Major Minor RaidDevice State
9 8 33 0 active sync /dev/sdc1
8 8 17 1 active sync /dev/sdb1
10 8 81 2 active sync /dev/sdf1
11 8 97 3 active sync /dev/sdg1
6 8 65 4 active sync /dev/sde1
7 8 49 5 active sync /dev/sdd1
sdb
和sdd
都是 8 TB 磁盘,所有其他 RAID 成员都是 4 TB。我现在想用新的 16 TB 磁盘替换这四个 4 TB 磁盘,将当前的 RAID5 设置转换为 RAID6,并将使用的设备大小增加到 8 TB(新的最大值,直到我可以用 16 TB 磁盘替换剩余的两个 8 TB 磁盘)。
我现在正在寻找一种可以安全完成此操作且不会丢失数据并尽可能省事的方法。在操作期间,停机时间是可以接受的,但数据丢失则不行。由于所有 SATA 插槽目前都在使用中,因此我无法在旧磁盘仍在线时添加新磁盘。我必须一个接一个地更换。因此,我认为先将现有的 RAID5 转换为 RAID6,然后逐个更换磁盘是明智的。这将在重建过程中增加另一层冗余。
在网上查找后,我想出了以下程序。有人可以确认这是最明智的方法吗?或者我遗漏了哪些步骤/考虑到我的限制(就地升级),是否有更简单的方法来实现这一点。
我目前的计划:
- 从 /mnt/md0 备份所有数据
- 验证备份完整性
- 卸载 /mnt/md0
- 将 /dev/md0 上的文件系统缩小到尽可能小的大小,请参阅https://access.redhat.com/articles/1196333了解具体步骤
e2fsck -f /dev/md0
检查文件系统,-f 强制检查即使干净resize2fs -P /dev/md0
估计最小尺寸resize2fs -p -M /dev/md0
缩小到最小尺寸(-M)并打印进度(-p)e2fsck -f /dev/md0
再次检查文件系统以确保其干净
- 检查文件系统的实际新大小:
dumpe2fs -h /dev/md0 |& awk -F: '/Block count/{count=$2} /Block size/{size=$2} END{print count*size}'
- RAID5 阵列中的一个 8TB 磁盘发生故障:
我们让一个 8TB 的磁盘失效,因为这可以保证当我们稍后重新添加它时,mdadm 不会因为某种原因认为驱动器太小mdadm /dev/md0 --fail /dev/sdd
- 通过尝试运行此命令并检查错误消息来估计 RAID5 阵列的新大小:
mdadm --grow /dev/md0 --raid-devices=5
- 验证文件系统是否足够小。然后缩小块设备:
mdadm --grow /dev/md0 --array-size [new_size]
- 将 RAID5 阵列从 6 个磁盘缩减为 5 个磁盘
mdadm --grow /dev/md0 --raid-devices=5 --backup-file=/root/md0_raid5_shrink.bak
- 等待 RAID5 完成重建
- 将删除的磁盘添加为热备用磁盘
mdadm --add /dev/md0 /dev/sdd
- 将 RAID5 阵列扩展为具有 6 个磁盘的 RAID6
mdadm --grow /dev/md0 --raid-devices 6 --level 6 --backup-file=/root/md0_raid5_to_raid6.bak
- 等待 RAID6 完成重建
- 用 16TB 磁盘逐个替换每个 4TB 磁盘,每次都等待 RAID6 完成重建,这应该可以让我们在迁移过程中保持冗余
mdadm --fail /dev/md0 /dev/sdX
mdadm --remove /dev/md0 /dev/sdX
- 关机并更换磁盘
mdadm --add /dev/md0 /dev/sdX
- 等待 RAID6 完成重建
- 将 RAID6 阵列扩大到最大大小(上限为两个 8TB 磁盘)
mdadm --grow /dev/md0 --size=max
- 将 /dev/md0 上的文件系统扩大到最大大小
resize2fs /dev/md0
- 重新挂载 /mnt/md0
我的问题如下:
- 这是将 RAID5 阵列升级到 RAID6 的推荐方法吗?
- 因为我想避免问是/否的问题:如果我的程序有意义,有什么方法可以改进它以避免数据丢失/必须从备份中恢复的风险?有没有更快的方法可以做到这一点?
- 我有一个自动生成的配置文件
/etc/mdadm/mdadm.conf
,我是否必须以任何方式更改它,它会自动发生吗,或者这与整个过程无关?
更多背景/其他信息:
- /dev/md0 上的文件系统是 ext4。
- 系统根目录 / 位于 /dev/sda 上,不受迁移影响
- 大多数指南都提到先添加新的备用磁盘,然后从 RAID5 迁移到 RAID6。在这种情况下,这(不容易)实现,因为所有 SATA 插槽都已在使用中。