如何找出多磁盘mdadm RAID1中的哪个磁盘触发了重build?

我正在使用mdadm来处理几个RAID1镜像。 md7是一个由3个旋转磁盘组成的N路镜像(全部标记为主要写入)和一个SSD:

md7 : active raid1 sdd1[0] sde5[3](W) sdf5[4](W) sdc1[1](W) 234428416 blocks [4/4] [UUUU] md6 : active raid1 sdf6[0] sde6[1] 1220988096 blocks [2/2] [UU] md2 : active raid1 sdb6[0] sda6[1] 282229824 blocks [2/2] [UU] md1 : active raid1 sdb2[0] sda2[1] 19534976 blocks [2/2] [UU] md0 : active raid1 sdb1[0] sda1[1] 192640 blocks [2/2] [UU] 

整个系统在过去的2周内已经挂了3次,需要重启。 就目前而言,我假设系统挂起与我的md问题无关,尽pipe我不能完全打破这种可能性。 每次我们重新启动,md7需要重build,但我不知道如何从日志告诉哪个磁盘触发重build。 我以为iostat可以帮助我,而RAID仍在重build:

 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 43.39 1038.34 558.83 223108 120075 sdb 66.88 1445.47 648.86 310588 139420 sdc 36.42 12.99 22256.81 2792 4782320 sdd 190.75 23227.78 331.14 4990954 71152 md0 2.11 21.39 0.23 4596 50 md1 173.72 1855.87 522.14 398770 112192 md2 11.68 65.84 27.59 14146 5928 md6 27.42 149.83 69.51 32194 14936 sde 75.83 70.81 22326.91 15214 4797384 sdf 79.31 99.41 22326.91 21360 4797384 sr0 0.04 2.61 0.00 560 0 md7 202.31 1287.41 331.07 276626 71136 

…但在我看来,像md7正在使用sdd来重build该RAID中的所有其他磁盘。 我想也许这只是因为sdd是一个固态硬盘,所有其他的磁盘标记为大多数,但在这种情况下,它应该只重build一个不同步的磁盘(除非所有的旋转磁盘刚刚出现同步,这似乎不太可能)。

另一个理论是,所有的旋转磁盘在重新启动时总是不同步,因为SSD的写入速度非常快,以至于有时间完成写入块而其他人仍在写入,那么系统恰好locking在其他磁盘完成写入该块之前?

那么,如何判断哪个磁盘触发了重新同步呢? 事实上,我有一个具有混合SSD和旋转磁盘的n路镜像,可能是因为所有旋转的磁盘总是在这些死机之一后重build,或者md驱动程序保证不考虑写入一个块在一个磁盘上,直到它成功写入所有磁盘?

正如Michael指出的那样,挂起和随之而来的不干净的关机是你看到RAID重build的原因。 内核md驱动程序重build不清洁的数组,以确保它们真正同步,因为挂起或崩溃或powerloss不能保证哪些写入实际刷新到磁盘。

现在,为什么sdd正在使用,首先要了解的是,在不洁净的关机中,与单个成员设备相反,实际的数组被标记为脏。 在上面链接的手册页中,关于RAID-1的内容如下:

如果md驱动程序在启动时发现一个数组是脏的,它将继续纠正任何可能的不一致。 对于RAID1,这涉及将第一个驱动器的内容复制到所有其他驱动器上。

在你的例子中, md7arrays在驱动器sdcsddsdesdf上有分区,但是如果你看看你的mdstat输出:

md7:active raid1 sdd1 [0] sde53 sdf54 sdc11

请注意第一个分区标有[0]是如何在sdd ,即sdd1 。 这就是sdd被使用的原因 – 这是md7的第一个驱动器。

我知道(至lesslinux)raid的作用就像是一个文件系统用于这些目的 – 如果系统在使用时崩溃,则需要在重启时检查。 因此,系统崩溃的原因可能不是arrays中的任何磁盘。