下一页 上一页 目录

6. 检测、查询和测试

本 HOWTO 已弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

本节介绍软件 RAID 系统的日常使用,包括与阵列通信和进行调整。

请注意,在处理 md 设备时,您应始终记住您正在操作整个文件系统。因此,尽管可能存在一些冗余来保证您的文件安全,但您必须谨慎操作。

6.1 检测驱动器故障

这没什么神秘的。只需快速查看标准日志和状态文件即可注意到驱动器故障。

无论发生什么,/var/log/messages 总是会充斥着大量的错误消息。但是,当涉及到磁盘崩溃时,会报告大量的内核错误。给受虐狂们看一些令人讨厌的例子:

   kernel: scsi0 channel 0 : resetting for second half of retries. 
   kernel: SCSI bus is being reset for host 0 channel 0. 
   kernel: scsi0: Sending Bus Device Reset CCB #2666 to Target 0 
   kernel: scsi0: Bus Device Reset CCB #2666 to Target 0 Completed 
   kernel: scsi : aborting command due to timeout : pid 2649, scsi0, channel 0, id 0, lun 0 Write (6) 18 33 11 24 00 
   kernel: scsi0: Aborting CCB #2669 to Target 0 
   kernel: SCSI host 0 channel 0 reset (pid 2644) timed out - trying harder 
   kernel: SCSI bus is being reset for host 0 channel 0. 
   kernel: scsi0: CCB #2669 to Target 0 Aborted 
   kernel: scsi0: Resetting BusLogic BT-958 due to Target 0 
   kernel: scsi0: *** BusLogic BT-958 Initialized Successfully *** 
大多数情况下,磁盘故障看起来像这样:
   kernel: sidisk I/O error: dev 08:01, sector 1590410 
   kernel: SCSI disk error : host 0 channel 0 id 0 lun 0 return code = 28000002 
或者这样
   kernel: hde: read_intr: error=0x10 { SectorIdNotFound }, CHS=31563/14/35, sector=0
   kernel: hde: read_intr: status=0x59 { DriveReady SeekComplete DataRequest Error }
而且,正如预期的那样,经典的 /proc/mdstat 输出也将显示问题:
   Personalities : [linear] [raid0] [raid1] [translucent]
   read_ahead not set
   md7 : active raid1 sdc9[0] sdd5[8] 32000 blocks [2/1] [U_]
在本节后面,我们将学习如何使用 mdadm 监控 RAID,以便我们可以接收关于磁盘故障的警报报告。现在是时候了解更多关于 /proc/mdstat 的解释了。

6.2 查询阵列状态

您可以随时查看 /proc/mdstat。这没什么坏处。让我们学习如何读取该文件。例如,

              Personalities : [raid1]
              read_ahead 1024 sectors
              md5 : active raid1 sdb5[1] sda5[0]
                    4200896 blocks [2/2] [UU]

              md6 : active raid1 sdb6[1] sda6[0]
                    2104384 blocks [2/2] [UU]

              md7 : active raid1 sdb7[1] sda7[0]
                    2104384 blocks [2/2] [UU]

              md2 : active raid1 sdc7[1] sdd8[2] sde5[0]
                    1052160 blocks [2/2] [UU]

              unused devices: none
要识别备用设备,首先查找行上的 [#/#] 值。第一个数字是已定义的完整 raid 设备的数量。假设它是 “n”。每个设备后面的 raid 角色编号 [#] 指示其在 raid 集中的角色或功能。任何角色编号为 “n” 或更高的设备都是备用磁盘。0,1,..,n-1 用于工作阵列。

此外,如果发生故障,故障设备将在 [#] 后标记为 (F)。替换此设备的备用设备将是角色编号为 n 或更高且未标记 (F) 的最低编号设备。一旦重新同步操作完成,设备的角色编号将交换。

设备在 /proc/mdstat 输出中出现的顺序没有任何意义。

最后,请记住,您可以随时使用 raidtools 或 mdadm 来检查阵列。

        mdadm --detail /dev/mdx
        lsraid -a /dev/mdx
这些命令将清晰地显示备用磁盘和故障磁盘。

6.3 模拟驱动器故障

如果您计划使用 RAID 来获得容错能力,您可能还需要测试您的设置,以查看它是否真的有效。那么,如何模拟磁盘故障呢?

简而言之,您无法模拟,除非您用消防斧劈开您想要“模拟”故障的驱动器。您永远无法知道驱动器发生故障时会发生什么。它可能会在电气上将其连接的总线一起带走,导致该总线上的所有驱动器都无法访问。我从未听说过这种情况发生,但这完全有可能。驱动器也可能只是向 SCSI/IDE 层报告读/写故障,这反过来使 RAID 层优雅地处理这种情况。幸运的是,这通常是事情的走向。

请记住,您必须运行 RAID-{1,4,5},您的阵列才能在磁盘故障中幸存下来。当设备丢失时,Linear 或 RAID-0 将完全失败。

通过硬件强制故障

如果您想模拟驱动器故障,您可以直接拔出驱动器。您应该在断电的情况下执行此操作。如果您有兴趣测试在磁盘数量少于通常数量的情况下,您的数据是否可以幸存下来,那么在这里当热插拔牛仔是毫无意义的。关闭系统,拔下磁盘,然后再次启动。

查看系统日志,并查看 /proc/mdstat 以了解 RAID 的运行状况。它工作了吗?

如果您查看 /proc/mdstat,故障磁盘应标记为 (F)。此外,mdadm 用户应看到设备状态为 faulty

当您再次重新连接磁盘时(当然,请记住,断电状态),您可以使用 raidhotadd 命令将“新”设备再次添加到 RAID。

通过软件强制故障

较新版本的 raidtools 附带 raidsetfaulty 命令。通过使用 raidsetfaulty,您可以模拟驱动器故障,而无需拔出任何东西。

只需运行命令

    raidsetfaulty /dev/md1 /dev/sdc2
应该足以使阵列 /dev/md1 的磁盘 /dev/sdc2 发生故障。如果您使用的是 mdadm,只需键入
    mdadm --manage --set-faulty /dev/md1 /dev/sdc2
现在事情开始变得有趣起来。首先,您应该在系统的日志中看到类似于第一行的内容。如果您配置了备用磁盘,则会出现类似于第二行的内容。
    kernel: raid1: Disk failure on sdc2, disabling device. 
    kernel: md1: resyncing spare disk sdb7 to replace failed disk
检查 /proc/mdstat 输出将显示降级的阵列。如果存在可用的备用磁盘,则应该已经开始重建。

最新 raidtools 中的另一个新实用程序是 lsraid。尝试使用

    lsraid -a /dev/md1
mdadm 用户可以运行命令
    mdadm --detail /dev/md1
并欣赏结果。

现在您已经了解了设备发生故障时的情况。让我们修复问题。

首先,我们将从阵列中删除故障磁盘。运行命令

    raidhotremove /dev/md1 /dev/sdc2
mdadm 用户可以运行命令
    mdadm /dev/md1 -r /dev/sdc2
请注意,raidhotremove 无法从正在运行的阵列中拔出磁盘。出于显而易见的原因,只有崩溃的磁盘才能从阵列中热移除(运行 raidstop 和卸载设备无济于事)。

现在我们有一个 /dev/md1,它刚刚丢失了一个设备。这可能是降级的 RAID 或许是处于重建过程中的系统。我们等到恢复结束后再将一切恢复正常。

因此,当我们把 /dev/sdc2 送回家时,旅程结束了。

    raidhotadd /dev/md1 /dev/sdc2
与往常一样,您可以使用 mdadm 而不是 raidtools。这应该是命令
    mdadm /dev/md1 -a /dev/sdc2
当浪子回头回到阵列时,我们将看到它在必要时成为 /dev/md1 的活跃成员。如果不是,它将被标记为备用磁盘。这就是简化的管理。

6.4 模拟数据损坏

RAID(无论是硬件 RAID 还是软件 RAID)都假定,如果对磁盘的写入未返回错误,则写入成功。因此,如果您的磁盘在不返回错误的情况下损坏数据,您的数据被损坏。这当然不太可能发生,但这是有可能的,并且会导致文件系统损坏。

RAID 不能也不应该防止介质上的数据损坏。因此,故意损坏磁盘上的数据(例如使用 dd)以查看 RAID 系统将如何处理也是没有任何意义的。最有可能的是(除非您损坏了 RAID 超级块),RAID 层永远不会发现损坏,但 RAID 设备上的文件系统将被损坏。

这就是事情应该运作的方式。RAID 不是数据完整性的保证,它只是允许您在磁盘发生故障时保留数据(当然,对于 RAID 级别高于或等于 1 的情况)。

6.5 监控 RAID 阵列

您可以使用 follow-monitor 模式将 mdadm 作为守护程序运行。如果需要,这将使 mdadm 在阵列遇到错误或故障时向系统管理员发送电子邮件警报。此外,follow 模式可用于在磁盘发生故障时触发应急命令,例如通过移除并重新插入故障磁盘来给予其第二次机会,从而自动解决非致命故障。

让我们看一个基本示例。运行

   mdadm --monitor --mail=root@localhost --delay=1800 /dev/md2
应该会释放一个 mdadm 守护程序来监控 /dev/md2。delay 参数意味着轮询将以 1800 秒的间隔进行。最后,关键事件和致命错误应通过电子邮件发送给系统管理员。这就是简化的 RAID 监控。

最后,--program--alert 参数指定在检测到事件时要运行的程序。

请注意,一旦 mdadm 守护程序确定有阵列需要监控,它将永远不会退出,因此通常应在后台运行。请记住,您正在运行的是守护程序,而不是 shell 命令。

使用 mdadm 监控 RAID 阵列既简单又有效。但是,这种监控存在一些根本性问题 - 例如,如果 mdadm 守护程序停止了会发生什么?为了克服这个问题,应该寻找“真正的”监控解决方案。有许多免费软件、开源和商业解决方案可用于 Linux 上的软件 RAID 监控。在 FreshMeat 上搜索应该会返回很多匹配项。


下一页 上一页 目录