升级(软件) RAID 1 容量

升级(软件) RAID 1 容量

我正在将软件 RAID 1 阵列 ( /dev/md0) 从 2TB 驱动器 (sdasdb) 升级到 4TB (sdcsdd)。简单直接;ext3,单个分区,无 MBR,无 LVM。最后,我希望有两个/dev/mdX设备,一个带有原始阵列,另一个带有新阵列,两个设备都具有相同的数据。据我所知,有两个选项:

选项1:

  1. 备份现有阵列
  2. 卸载现有阵列
  3. 插入一个 4TB 磁盘,并将其添加到阵列
    mdadm --manage /dev/md0 --add /dev/sdc1
  4. 让其中一个 2TB 磁盘发生故障,然后等待阵列重建
    mdadm --manage /dev/md0 --fail /dev/sda1
    mdadm --manage /dev/md0 --remove /dev/sda1
  5. 插入剩余的 4TB 磁盘,并将其添加到阵列
    mdadm --manage /dev/md0 --add /dev/sdd1
  6. 使剩余的 2TB 磁盘发生故障,等待阵列重建
    mdadm --manage /dev/md0 --fail /dev/sdb1
    mdadm --manage /dev/md0 --remove /dev/sdb1
  7. 我该怎么做才能在新号码下重新激活 2TB 阵列/dev/mdX?我可以简单地输入:
    mdadm create /dev/md1 --assume-clean /dev/sda1 /dev/sdb1

优点:保证数据镜像,mdX可以卸载设备以避免不一致 缺点
:必须同步两次(慢)

选项 2:

  1. 使用 4TB 磁盘创建新阵列:
    mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
  2. 创建文件系统/dev/md1(与使用的相同/dev/md0
  3. /dev/md1
  4. 使用以下方式之一复制文件:
    tar -C /mnt/md0 --atime-preserve -clSf - . | tar -C /mnt/md1 -xvf -
    --or--
    rsync -avHhx --progress /mnt/md0 /mnt/md1

优点:只需同步一次
缺点:无法保证备份的准确性(除了用于 tar 或 rsync 的标志之外)

哪种方法更可取?为什么?有没有更好的方法[1]?

[1] 我已经阅读了有关使用的内容dd,但mdX复制后调整大小似乎是一个问题,而且我仍然需要/dev/mdX为其中一个数组创建一个新的。

更新 最后我选择了方案 2,因为它无疑是最安全、最“干净”的方案。我还采纳了以下评论/建议,并附上了一些重要注意事项:

  1. fdisk(目前)对于超过 2TB 的分区无法可靠地工作,建议parted使用分区表gpt
  2. 使用哈希来验证 rsync 传输是个好主意。不幸的是,dd这并不合适,因为它读取所有的卷,包括零。因此,根据定义,2TB 和 4TB 驱动器的哈希值将有所不同。此外,dd必须读取所有 2TB 数据才能提供哈希值,并且无法处理目录,这排除了检查单个关键文件夹的可能性。有些程序(md5sumdmd5deep)会递归地对目录进行哈希处理,但这种彻底性不值得花费时间来读取和哈希 2TB 的数据。相反,我编写了一个粗略的脚本来diff输出ls -lAR两个卷(幸运的是,它们的块大小相同),并且只对报告大小不同的任何文件进行哈希处理。最后,检查 2TB 只花了几分钟。

答案1

选项1这确实不是一个好选择,在将新磁盘包含到 md0 后,您仍然必须扩展 ext3 文件系统,与使用 dd 时选项 2 相同。只不过它需要更长的时间,并且出错的可能性很大。

如果一定要走这条路,你应该大致做以下事情:

使用 fdisk 创建 raid 分区(0xDA 或 0xFD)

fdisk /dev/sdc
fdisk /dev/sdd

将新磁盘添加到阵列

mdadm --fail /dev/md0 /dev/sda1
mdadm --remove /dev/md0 /dev/sda1
mdadm --add /dev/md0 /dev/sdc1

等待重新同步完成,然后添加另一个

mdadm --fail /dev/md0 /dev/sdb1
mdadm --remove /dev/md0 /dev/sdb1
mdadm --add /dev/md0 /dev/sdd1

等待重新同步完成,然后增大 md0。请记住,重新同步期间磁盘很容易发生故障,这种情况比大多数人想象的更常见,因为磁盘承受着最大的压力。

mdadm --grow /dev/md0 --size=max --backup-file=/root/mnt/grow_md0.bak
mdadm --detail --scan >> /etc/mdadm.conf

您不需要备份文件选项,但它可以保护您免受意外故障的影响,例如操作期间断电。它需要位于不同的物理磁盘上(重新格式化 + 重新安装其中一个旧磁盘或闪存驱动器),否则会失去目的。

先对 md0 进行良好的检查,然后可以扩展 ext3 fs

umount /mount/point-md0
fsck /dev/md0
resize2fs /dev/md0
mount -t ext3 /dev/md0 /mount/point-md0

这种方法的唯一潜在优势是,如果您愿意承担一些风险,您可以在不让 md0 脱机的情况下做到这一点。resize2fs 实际上可以在线扩大您的 fs(但不会缩小),在这种情况下,您只需要在没有 umount-fsck-mount 序列的情况下执行操作。

要重新激活旧阵列,您必须使用--assemble,--create可能会破坏/销毁现有数据。

mdadm --assemble --force /dev/md1 /dev/sda1 /dev/sdb1

选项 2绝对是“更干净”的解决方案。出错的几率要小得多,因为你总是至少有一个完全冗余的阵列。

使用 fdisk 创建 raid 分区(0xDA 或 0xFD)

fdisk /dev/sdc
fdisk /dev/sdd

制作 md1

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1

创建文件系统并挂载

mkfs.ext3 -L some-label /dev/md1
mount -t ext3 /dev/md1 /mount/point-md1

使 md0 为只读,rsync 应该可以保证文件完整性,同时还能清理途中的所有碎片。

mount -o remount,r /dev/md0 /mount/point-md0
rsync -axHAXS --delete --progress /mount/point-md0 /mount/point-md1

更新 mdadm.conf

mdadm --detail --scan > /etc/mdadm.conf

别忘了更新 fstab!


与本主题相关的是:

  • rsync 将仅复制文件,而 mdadm resync 也将复制“空”的未定义空间。

  • 除非您从 RAID1 启动(这种情况下您还必须更新引导加载程序),否则使用 RAID1 的理由很少,如果阵列中有两个以上的物理磁盘,RAID10 将为您提供相同的保护但性能更佳。

  • LVM 实际上可以帮助您进行迁移和备份。例如,在选项 2 中,您无需在复制文件之前将其挂载为只读,而这可能需要很长时间才能半脱机,您可以创建 LVM 快照,两次传递 rsync,然后只需几秒钟的停机时间即可完成迁移。

  • 如果我可以将所有四个物理磁盘都放在盒子里,我会在每个磁盘上创建三个 RAID 分区。一个小型 RAID1 用于 /boot,一个大小合适的 LVM+RAID10 用于高性能部分(例如数据库),一个 LVM+RAID5/6 用于存储。

相关内容