我正在使用 mdadm 进行多个 RAID1 镜像。md7 是一个 N 路镜像,由 3 个旋转磁盘(均标记为主要写入)和一个 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]
在过去的两周里,整个系统挂起了 3 次,需要硬重置。目前,我假设系统挂起与我的 md 问题无关,尽管我不能完全排除这种可能性。每次我们重新启动时,md7 都需要重建,但我不知道如何从日志中判断哪个磁盘触发了重建。我认为 iostat 可能能够在 RAID 仍在重建时帮助我:
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 重建该 RAID 中的所有其他磁盘。我认为这可能只是因为 sdd 是 SSD,而所有其他磁盘都标记为写入为主,但在这种情况下,它应该只重建一个不同步的磁盘(除非所有旋转磁盘恰好不同步,这在我看来不太可能)。
我的另一个理论是,所有旋转磁盘在重新启动时总是不同步,这仅仅是因为 SSD 的写入速度非常快,以至于它有时间完成写入一个块,而其他磁盘仍在写入,然后系统恰好在其他磁盘完成写入该块之前锁定?
那么,我如何知道哪个磁盘触发了重新同步?我有一个混合了 SSD 和旋转磁盘的 n 路镜像,这是否可能导致所有旋转磁盘在其中一个冻结后总是重建,或者 md 驱动程序是否保证一个块在成功写入所有磁盘之前不被视为写入一个磁盘?
答案1
正如 Michael 在上面指出的那样,挂起以及随之而来的不正常关机是您看到 RAID 重建的原因。内核 md 驱动程序重建未清理的阵列,以确保它们真正同步,因为挂起、崩溃或断电无法保证哪些写入实际上被刷新到磁盘。
现在,至于为什么sdd
要使用它,首先要了解的是,在非正常关机中,实际阵列(而不是单个成员设备)被标记为脏。在我上面链接的手册页中,对 RAID-1 有以下说明:
如果 md 驱动程序在启动时发现阵列脏了,它会继续纠正任何可能的不一致。对于 RAID1,这涉及将第一个驱动器的内容复制到所有其他驱动器上。
在您的示例中,阵列在驱动器、、&md7
上有分区,但如果您查看输出:sdc
sdd
sde
sdf
mdstat
md7:活动 raid1 sdd1[0] sde53 sdf54 sdc11
请注意,第一个分区标有[0]
,位于 上sdd
,即。这就是被使用的sdd1
原因——它是 中的第一个驱动器。sdd
md7
答案2
我理解(至少在 Linux 中)RAID 的工作方式类似于文件系统,用于这些目的 - 如果系统在使用时崩溃,则需要在重新启动时进行检查。因此,系统崩溃的原因可能不是任何阵列中的磁盘。