mdadm 没有注意到 raid0 中的故障磁盘

mdadm 没有注意到 raid0 中的故障磁盘

我有一台带有 mdadm raid0 的服务器:

# mdadm --version
mdadm - v3.1.4 - 31st August 2010
# uname -a
Linux orkan 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux

其中一个磁盘发生故障:

# grep sdf /var/log/kern.log | head
Jan 30 19:08:06 orkan kernel: [163492.873861] sd 2:0:9:0: [sdf] Unhandled error code
Jan 30 19:08:06 orkan kernel: [163492.873869] sd 2:0:9:0: [sdf] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Jan 30 19:08:06 orkan kernel: [163492.873874] sd 2:0:9:0: [sdf] Sense Key : Hardware Error [deferred] 

现在在 dmesg 中我可以看到:

Jan 31 15:59:49 orkan kernel: [238587.307760] sd 2:0:9:0: rejecting I/O to offline device
Jan 31 15:59:49 orkan kernel: [238587.307859] sd 2:0:9:0: rejecting I/O to offline device
Jan 31 16:03:58 orkan kernel: [238836.627865] __ratelimit: 10 callbacks suppressed
Jan 31 16:03:58 orkan kernel: [238836.627872] mdadm: sending ioctl 1261 to a partition!
Jan 31 16:03:58 orkan kernel: [238836.627878] mdadm: sending ioctl 1261 to a partition!
Jan 31 16:04:09 orkan kernel: [238847.215187] mdadm: sending ioctl 1261 to a partition!
Jan 31 16:04:09 orkan kernel: [238847.215195] mdadm: sending ioctl 1261 to a partition!

但是 mdadm 并没有注意到驱动器已经发生故障:

# mdadm -D /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Thu Jan 13 15:19:05 2011
     Raid Level : raid0
     Array Size : 71682176 (68.36 GiB 73.40 GB)
   Raid Devices : 3
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Thu Sep 22 14:37:24 2011
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 64K

           UUID : 7e018643:d6173e01:17ab5d05:f75b494e
         Events : 0.9

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       65        1      active sync   /dev/sde1
       2       8       81        2      active sync   /dev/sdf1

此外,强制从 /dev/md0 读取确实支持 /dev/sdf 已发生故障但 mdadm 未将驱动器标记为故障的理论:

# dd if=/dev/md0 of=/root/md.data bs=512 skip=255 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00367142 s, 139 kB/s

# dd if=/dev/md0 of=/root/md.data bs=512 skip=256 count=1
dd: reading `/dev/md0': Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000359543 s, 0.0 kB/s

# dd if=/dev/md0 of=/root/md.data bs=512 skip=383 count=1
dd: reading `/dev/md0': Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000422959 s, 0.0 kB/s

# dd if=/dev/md0 of=/root/md.data bs=512 skip=384 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000314845 s, 1.6 MB/s

但是尝试访问 /dev/sdf 磁盘失败:

# dd if=/dev/sdf of=/root/sdf.data bs=512 count=1
dd: opening `/dev/sdf': No such device or address

数据对我来说并不那么重要,我只是想了解为什么 mdadm 坚持认为阵列是“状态:干净”

答案1

md(4) 手册页阐明了“清洁”一词的用法(关键部分以斜体显示):

不正常关机

当对 RAID1、RAID4、RAID5、RAID6 或 RAID10 阵列进行更改时,可能会出现短时间内不一致的情况,因为每次更新都需要将至少两个块写入不同的设备,并且这些写入可能不会同时发生。因此,如果具有这些阵列之一的系统在写入操作过程中关闭(例如由于电源故障),则阵列可能不一致。

为了处理这种情况,md 驱动程序在向数组写入任何数据之前将其标记为“脏”,并将其标记为“干净的“当阵列被禁用时,例如在关机时。如果 md 驱动程序在启动时发现阵列脏了,它会继续纠正任何可能的不一致。对于 RAID1,这涉及将第一个驱动器的内容复制到所有其他驱动器上。对于 RAID4、RAID5 和 RAID6,这涉及重新计算每个条带的奇偶校验并确保奇偶校验块具有正确的数据。对于 RAID10,它涉及将每个块的一个副本复制到所有其他块上。此过程称为“重新同步”或“重新同步”,在后台执行。阵列仍然可以使用,但性能可能会降低。

如果 RAID4、RAID5 或 RAID6 阵列在非正常关机后重新启动时性能下降(至少缺少一个驱动器,RAID6 缺少两个驱动器),则无法重新计算奇偶校验,因此数据可能被不可检测地损坏。2.4 md 驱动程序不会向操作员发出此情况的警报。2.6 md 驱动程序将无法在此情况下启动阵列,除非手动干预,但此行为可以通过内核参数覆盖。

RAID 中的一个磁盘发生故障是可能的系统安全且正常地禁用了 RAID(例如,在关机时)。换句话说,磁盘故障发生在 RAID 处于一致、同步状态时。然后 RAID 将被标记为“干净”,并且,当下次启用它并且其中一个磁盘发生故障时,该标志将保留。

答案2

除了显而易见的 - 只有不重视数据的人才会运行 RAID-0 - 除非您运行监视守护程序,否则 mdadm 不会向您发出任何警报: mdadm --monitor /dev/md0

您可以使用以下方法明确检查有问题的设备:mdadm -E /dev/sdf

当然,检测 RAID-0 阵列是否发生故障是毫无意义的:它丢失了,从备份中恢复。

相关内容