我将 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]
整个系统在过去 2 周内挂了 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 驱动程序是否保证块不被认为是写入的在一个磁盘上,直到成功写入所有磁盘?
我知道(至少是 linux)raid 的工作方式类似于用于这些目的的文件系统 - 如果系统在使用时崩溃,则需要在重新启动时对其进行检查。所以系统崩溃的原因可能不是阵列中的任何磁盘。
正如 Michael 在上面指出的那样,挂起和随之而来的不正常关机是您看到 RAID 重建的原因。内核 md 驱动程序重建不干净的数组以确保它们真正同步,因为挂起、崩溃或 powerloss 不能保证哪些写入实际上被刷新到磁盘。
现在,至于为什么
sdd
被使用,首先要了解的是,在不干净的关闭中,实际的阵列,而不是单个成员设备,被标记为脏。在我上面链接的联机帮助页中,以下内容是关于 RAID-1 的:在您的示例中,该数组在 drives , , &
md7
上有分区,但是如果您查看输出:sdc
sdd
sde
sdf
mdstat
请注意标有 a 的第一个分区是如何在
[0]
上的sdd
,即sdd1
。这sdd
就是被使用的原因——它是md7
.