我和一位同事使用 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
(选择-c
mkfs.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
上述选项,同样的事情会再次发生。
我有两个问题:
- 模拟交替故障后,是什么原因导致文件系统损坏?我猜是与两个都磁盘与第一次断开连接之前的状态不同,并且这以某种方式欺骗了
mdadm --add
不进行重新同步。正确的命令序列是什么,以告诉 mdadm 使用已安装状态作为权威并将添加的磁盘同步到它? - 在我们目前的情况下(一次模拟故障,然后重新连接,即只有一磁盘与断开连接前的状态不同),重新添加丢失设备的正确方法是什么?我是否可以像上面一样使用添加命令,然后它就会重新同步?为什么它没有自动重新同步?
如果有帮助的话,这里是当前的输出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
在添加缺失设备之前先调用它。这将强制进行干净的重建。
第二种情况,只有一设备分歧,是大概虽然我没有尝试过,但无害。如果发生实际故障,您必须更换物理驱动器,那么您应该也不会有事,因为首先没有元数据。