测试后重新添加软件 RAID 1 成员后文件系统损坏。为什么?

测试后重新添加软件 RAID 1 成员后文件系统损坏。为什么?

我和一位同事使用 mdadm 设置了一个软件 RAID 1,该软件 RAID 1 由两个物理磁盘组成,虚拟设备上有两个分区。设置过程顺利,直接从其中一个 RAID 磁盘启动时,结果如下:

# cat /proc/mdstat 
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[0] sdb1[1]
      92094464 blocks super 1.2 [2/2] [UU]

md1 : active (auto-read-only) raid1 sda2[0] sdb2[2]
      4069376 blocks super 1.2 [2/2] [UU]

unused devices: <none>

为了测试我们的设置,我们关闭了机器,断开了其中一个磁盘,然后重新启动。系统运行正常,当然处于降级状态:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[1]
      92094464 blocks super 1.2 [2/1] [_U]

md1 : active (auto-read-only) raid1 sda2[2]
      4069376 blocks super 1.2 [2/1] [_U]

unused devices: <none>

接下来,我们再次关闭机器,重新连接断开的磁盘,并断开另一个磁盘。同样,一切顺利,达到以下预期状态:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[0]
      92094464 blocks super 1.2 [2/1] [U_]

md1 : active (auto-read-only) raid1 sda2[0]
      4069376 blocks super 1.2 [2/1] [U_]

unused devices: <none>

最后,我们最后一次关机,重新连接所有设备,但得到的却是这样的:

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md1 : active (auto-read-only) raid1 sdb2[2] sda2[0]
      4069376 blocks super 1.2 [2/2] [UU]

md127 : active raid1 sdb1[1]
      92094464 blocks super 1.2 [2/1] [_U]

unused devices: <none>

如您所见,第一个分区(第二个条目,由于某种原因它们被交换了)处于降级状态(第二个不是,但它只是一个交换分区)。我们对此并不特别担心。毕竟,在模拟磁盘交替故障后,预计这两个分区不再完全相等。我们像这样添加了丢失的分区:

# mdadm --manage /dev/md127 --add /dev/sda1
mdadm: re-added /dev/sda1

我们期望 上的分区与/dev/sda上的分区同步(被 上的分区覆盖)/dev/sdb。但结果却是文件系统损坏(几秒钟内出现大量错误)。


这次经历之后,我从第三个磁盘重新启动,重新初始化文件系统/dev/md127(选择-cmkfs.ext4 以保证万无一失),然后重新启动到现在再次正常运行的 RAID。然后再次关闭,断开一个磁盘,启动,再次关闭,重新连接磁盘,这次我们还让另一个磁盘保持连接,然后启动。现在我们得到了这个:

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sda1[0]
      92094464 blocks super 1.2 [2/1] [U_]

md1 : active (auto-read-only) raid1 sdb2[2] sda2[0]
      4069376 blocks super 1.2 [2/2] [UU]

unused devices: <none>

现在我们担心如果我们只是使用--add上述选项,同样的事情会再次发生。

我有两个问题:

  1. 模拟交替故障后,是什么原因导致文件系统损坏?我猜是与两个都磁盘与第一次断开连接之前的状态不同,并且这以某种方式欺骗了mdadm --add不进行重新同步。正确的命令序列是什么,以告诉 mdadm 使用已安装状态作为权威并将添加的磁盘同步到它?
  2. 在我们目前的情况下(一次模拟故障,然后重新连接,即只有磁盘与断开连接前的状态不同),重新添加丢失设备的正确方法是什么?我是否可以像上面一样使用添加命令,然后它就会重新同步?为什么它没有自动重新同步?

如果有帮助的话,这里是当前的输出mdadm --examine

# mdadm --examine /dev/sda1
/dev/sda1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 726d9204:889a4c89:b7a1bdb9:a77d8130
           Name : testhost:0  (local to host testhost)
  Creation Time : Mon Feb  4 14:39:21 2019
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 184188928 (87.83 GiB 94.30 GB)
     Array Size : 92094464 (87.83 GiB 94.30 GB)
    Data Offset : 131072 sectors
   Super Offset : 8 sectors
   Unused Space : before=130984 sectors, after=0 sectors
          State : clean
    Device UUID : 46077734:6a094293:96f92dc3:0a09706e

    Update Time : Tue Feb  5 13:36:59 2019
  Bad Block Log : 512 entries available at offset 72 sectors
       Checksum : 139d1d09 - correct
         Events : 974


   Device Role : Active device 0
   Array State : A. ('A' == active, '.' == missing, 'R' == replacing)
# mdadm --examine /dev/sdb1
/dev/sdb1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 726d9204:889a4c89:b7a1bdb9:a77d8130
           Name : testhost:0  (local to host testhost)
  Creation Time : Mon Feb  4 14:39:21 2019
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 184188928 (87.83 GiB 94.30 GB)
     Array Size : 92094464 (87.83 GiB 94.30 GB)
    Data Offset : 131072 sectors
   Super Offset : 8 sectors
   Unused Space : before=130984 sectors, after=0 sectors
          State : clean
    Device UUID : dcffbed3:147347dc:b64ebb8d:97ab5956

    Update Time : Tue Feb  5 10:47:41 2019
  Bad Block Log : 512 entries available at offset 72 sectors
       Checksum : e774af76 - correct
         Events : 142


   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

答案1

我发现了问题所在。我在mdadm 的文档

当设备添加到活动阵列时,mdadm 会检查设备中是否有元数据,表明它最近是阵列的成员。如果有,它会尝试“重新添加”该设备。如果自设备移除后没有发生任何变化,或者如果数组有一个写意图位图,它记录了发生的所有变化,则该设备将立即成为阵列的正式成员,并且位图中记录的那些差异将得到解决。

(重点是我的)

自从两个都设备从最初断开连接时起就出现了分歧,它们记录的变化相互不兼容,从而破坏了文件系统。

这种情况的解决方案是mdadm --zero-superblock在添加缺失设备之前先调用它。这将强制进行干净的重建。

第二种情况,只有设备分歧,是大概虽然我没有尝试过,但无害。如果发生实际故障,您必须更换物理驱动器,那么您应该也不会有事,因为首先没有元数据。

相关内容