如何恢复数据并重建失败的软件 RAID - 第 8 部分
在本 RAID 系列的前几篇文章中,您从零开始成为 RAID 英雄。我们回顾了几种软件 RAID 配置,并解释了每种配置的要点,以及您根据具体情况倾向于使用其中一种配置的原因。
在本指南中,我们将讨论如何在发生磁盘故障时重建软件 RAID 阵列而不丢失数据。为简洁起见,我们将仅考虑 RAID 1 设置 - 但概念和命令同样适用于所有情况。
RAID测试场景
在继续操作之前,请确保您已按照本系列第 3 部分中提供的说明设置 RAID 1 阵列:如何在 Linux 中设置 RAID 1(镜像)。
我们目前的情况唯一的变化是:
1) CentOS (v7) 版本与该文章中使用的版本 (v6.5) 不同,并且
2) /dev/sdb 和 /dev/sdc 的不同磁盘大小(各 8 GB)。
此外,如果在强制模式下启用SELinux,则需要将相应的标签添加到要挂载 RAID 设备的目录中。否则,您在尝试安装时会遇到此警告消息:
您可以通过运行以下命令来修复此问题:
restorecon -R /mnt/raid1
设置 RAID 监控
存储设备发生故障的原因有多种(尽管 SSD 大大降低了发生这种情况的可能性),但无论原因如何,您都可以确定问题随时可能发生,并且您需要准备好更换故障的设备部分并确保数据的可用性和完整性。
首先是一句忠告。即使您可以检查 /proc/mdstat 来检查 RAID 的状态,也有一种更好且节省时间的方法,即在监视器 + 扫描中运行 mdadm模式,它将通过电子邮件向预定义的收件人发送警报。
要进行此设置,请在 /etc/mdadm.conf 中添加以下行:
MAILADDR user@<domain or localhost>
就我而言:
MAILADDR gacanepa@localhost
要在监视 + 扫描模式下运行 mdadm,请以 root 身份添加以下 crontab 条目:
@reboot /sbin/mdadm --monitor --scan --oneshot
默认情况下,mdadm 将每 60 秒检查一次 RAID 阵列,并在发现问题时发送警报。您可以通过将 --delay
选项添加到上面的 crontab 条目以及秒数(例如,--delay
1800 表示 30 分钟)来修改此行为。
最后,确保您安装了邮件用户代理 (MUA),例如 mutt 或 mailx。否则,您将不会收到任何警报。
稍后我们将看到 mdadm 发送的警报是什么样的。
模拟并更换出现故障的 RAID 存储设备
为了模拟 RAID 阵列中某一存储设备的问题,我们将使用 --manage
和 --set-faulty
选项,如下所示:
mdadm --manage --set-faulty /dev/md0 /dev/sdc1
这将导致 /dev/sdc1 被标记为错误,正如我们在 /proc/mdstat 中看到的:
更重要的是,让我们看看我们是否收到了包含相同警告的电子邮件警报:
在这种情况下,您需要从软件 RAID 阵列中删除该设备:
mdadm /dev/md0 --remove /dev/sdc1
然后,您可以将其从计算机上物理移除并用备件替换(/dev/sdd,其中先前已创建 fd 类型的分区):
mdadm --manage /dev/md0 --add /dev/sdd1
幸运的是,系统将自动开始使用我们刚刚添加的部分重建阵列。我们可以通过将 /dev/sdb1 标记为错误,将其从阵列中删除,并确保文件 howtoing.txt 仍然可以在 / 访问来进行测试。 mnt/raid1:
mdadm --detail /dev/md0
mount | grep raid1
ls -l /mnt/raid1 | grep tecmint
cat /mnt/raid1/tecmint.txt
上图清楚地表明,将/dev/sdd1添加到阵列中替换/dev/sdc1后,系统会自动执行数据的重建,无需干预就我们而言。
虽然不是严格要求,但最好在手边准备一个备用设备,这样就可以快速完成用良好驱动器更换故障设备的过程。为此,我们重新添加 /dev/sdb1 和 /dev/sdc1:
mdadm --manage /dev/md0 --add /dev/sdb1
mdadm --manage /dev/md0 --add /dev/sdc1
从冗余丢失中恢复
正如前面所解释的,当一个磁盘出现故障时,mdadm将自动重建数据。但是如果阵列中的 2 个磁盘出现故障会发生什么情况?让我们通过将 /dev/sdb1 和 /dev/sdd1 标记为错误来模拟这种情况:
umount /mnt/raid1
mdadm --manage --set-faulty /dev/md0 /dev/sdb1
mdadm --stop /dev/md0
mdadm --manage --set-faulty /dev/md0 /dev/sdd1
尝试以与此时创建数组相同的方式重新创建数组(或使用 --assume-clean
选项)可能会导致数据丢失,因此应将其作为最后的手段。
例如,让我们尝试将 /dev/sdb1 中的数据恢复到类似的磁盘分区 (/dev/sde1 – 请注意,这要求您创建一个分区在继续之前,在 /dev/sde 中输入 fd),使用 ddrescue:
ddrescue -r 2 /dev/sdb1 /dev/sde1
请注意,到目前为止,我们还没有触及 RAID 阵列中的 /dev/sdb 或 /dev/sdd 分区。
现在让我们使用 /dev/sde1 和 /dev/sdf1 重建阵列:
mdadm --create /dev/md0 --level=mirror --raid-devices=2 /dev/sd[e-f]1
请注意,在实际情况中,您通常会使用与原始阵列相同的设备名称,即在故障磁盘已更换为新磁盘。
在本文中,我选择使用额外的设备来使用全新磁盘重新创建阵列,并避免与原始故障驱动器混淆。
当询问是否继续写入数组时,输入Y并按Enter。阵列应该启动,您应该能够通过以下方式观察其进度:
watch -n 1 cat /proc/mdstat
该过程完成后,您应该能够访问 RAID 的内容:
概括
在本文中,我们回顾了如何从 RAID 故障和冗余丢失中恢复。但是,您需要记住,该技术是一种存储解决方案,不会取代备份。
本指南中解释的原则适用于所有 RAID 设置,以及我们将在本系列的下一篇也是最后一篇指南(RAID 管理)中介绍的概念。
如果您对本文有任何疑问,请随时使用下面的评论表给我们留言。我们期待您的回音!