我有一台 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 插槽都已在使用中。
答案“按照书上说的”:制作并验证备份,销毁当前 raid,根据需要创建新 raid,恢复,然后就大功告成了。考虑到重新同步时间,这很可能也是更快的方法。
mdadm.conf
对你的问题的回答是:不,使用 mdadm 时你不需要手动调整。我质疑的不是事实,而是结论。因为 mdadm 非常灵活,可以管理包含通过不同接口连接的磁盘的阵列。这允许您使用临时外部存储(例如 USB 驱动器)来协助磁盘更换过程,即使所有内部 SATA 插槽当前都在使用中。所以您有多种选择。
关于你目前的计划:总体来说,不。正如开头所说,我一般不会这样做。但我的担忧暂时消失了,假设按照你描述的方法,那么……
第 1 点和第 2 点(先备份,然后验证):非常好,始终正确启动。已批准。
第 2、3、4 点:(卸载并缩小文件系统):我认为这些步骤不是必需的,因为它们
mdadm
独立于 fs 运行。RAID 重建过程处理数据块和奇偶校验,而不管 fs 如何在那些块之上组织。如果您有适当的备份并且您的 RAID 阵列处于稳定状态,您可以继续逐个更换磁盘,而无需缩小或接触 fs。所以您可以跳过这些步骤。第 5 点:永不失败,无需移除。为什么?因为这很重要,可以确保 mdadm 了解磁盘不再是阵列的一部分,并且不应再期望将其用于数据存储或冗余。更正:
--grow
选项可用于增加设备数量,但不能缩小。据我所知,mdadm 不支持此功能。(如果我在这一点上错了,请纠正我)如果你真的 真的 真的 想进行就地替换,那么:
在开始之前,请自行搜索 Raid5 和 Raid6 的不同重建时间,然后快速计算一下是否真的想投入这么多时间。(您已被警告)
如果您仍然想这样做,并且接受重建时间:
然后对磁盘重复以下步骤
sd[c|e|f|g]
,基本上是将每个 4TB 磁盘逐个替换为 16TB 磁盘:(在第一次运行中替换
sdX1
为,在第二次运行中替换为,依此类推......)sdc1
sde1
sdX
关闭电源,用新的 16 TB 磁盘替换旧的 4 TB 磁盘,然后打开电源。等待重建完成,然后再继续下一个磁盘。将所有 4TB 磁盘替换为 16TB 磁盘并重建阵列后,继续执行后续步骤。
为了设定正确的期望,必须非常清楚和准确地说明这个 raid 转换点:从 Raid5 到 Raid6 的转换在技术上可以正常工作,并且您最终也会处于干净的 Raid6 状态。但是,Raid6 仍将处于降级状态,直到您添加备用磁盘。我理解您无法添加磁盘作为备用磁盘,因为您的系统中的所有席位都已满。所以这可能(很可能)不是您想要达到的。
提示 提示 提示:在处理真实数据之前,先在安全的空间中测试想法。mdadm 非常灵活,支持任何类型的块设备,包括从文件创建的虚拟设备。
这种灵活性使您可以在受控环境中测试任何程序,然后再在实际数据上实施。以下是如何复制当前设置进行测试:
以下是消除它的方法: