假设一个硬件RAID 1带磁盘的控制器A和乙已脱机,并且两个磁盘上的文件均被更改乙(全部处于离线状态)。当 RAID 控制器重新打开,并且用户请求更改的文件时,会发生什么?我假设大多数 RAID 1 控制器在尝试读取该文件之前不会检测到任何错误。
RAID 控制器是否会识别文件大小/日期/签名的差异并因此报告错误,或者它是否会传递该文件的 2 个磁盘内容,而不了解这些变化?
操作系统会检测到任何错误吗?
软件 RAID 1 控制器的行为会有什么不同吗?
最后,在任何 RAID 1 阵列中否磁盘,操作系统或控制器实际上从哪个磁盘读取数据?全部 N?一些 RAID 控制器是否总是使用磁盘 0,他们会随机选择一个磁盘,还是他们有权访问文件系统并检查完整性(即使磁盘已加密)?
答案1
“他们是否有权访问文件系统并检查完整性(即使磁盘已加密)”?不。RAID 控制器不知道文件– 它只是假装是一个磁盘控制器,它只处理块(扇区)。而且由于两个磁盘上的各个扇区都已正确写入,因此是在块级别未检测到任何错误。
我不知道是否有关于硬件 RAID 控制器如何处理镜像不匹配的情况的信息。不过,Linux 的长期维护者 NeilBrown姆拉伊德软件 RAID 功能 – 已发布这条 LWN 评论解释 mdraid 如何处理它:
[...] 如果 RAID1 中的两个设备不包含相同的数据,或者 RAID4/5/6 中的数据总和与奇偶校验块不匹配,则这是不一致,而不是损坏。
最可能的解释是,当出现问题(例如断电)时,阵列中的多个设备正在写入数据,并且一些写入成功,而其他写入失败。哪个成功,哪个失败,都无关紧要。在这种情况下,两个块都没有错。我需要再说一遍。两个块都是正确的。它们只是在不同的时间点是正确的。
这里没有损坏,只是不一致。
每个块要么包含新数据,要么包含旧数据,从某种意义上说,两者都是正确的。
(如果一个块被半写入设备,如果设备没有足够大的电容器,这种情况是可能的,那么你会得到一个读取错误,因为 CRC 不正确。当你得到一个 CRC 错误时,md/raid 知道数据是错误的 - 甚至无法读取数据)。对于 RAID1,选择使用哪个设备以及哪个设备的数据被替换真的无关紧要。md 会任意选择设备列表中最早的设备。对于
奇偶校验阵列,使用数据并忽略奇偶校验是有意义的,因为使用奇偶校验不会告诉您它与哪个其他设备不一致。(如果您有理由相信奇偶校验可能与数据不一致,并且其中一个数据块丢失 - 设备故障 - 那么您既不能使用日期也不能使用奇偶校验,并且会出现“写入漏洞”)。
那么操作系统会检测到任何错误吗?这取决于磁盘上使用的文件系统,以及不一致的扇区是属于文件还是文件系统自己的元数据。如果元数据扇区存在不一致,则更有可能被检测到 - 但在大多数情况下,它会被报告为一般文件系统损坏,而不是 RAID 不一致。
对于文件来说,这种情况不太可能发生,因为大多数文件系统根本不对文件内容进行校验——它们从磁盘读取的内容就是您得到的。只有少数例外,例如 Btrfs、ZFS 或 ReFS 会进行校验。
其中一些(Btrfs、ZFS)实际上有自己的磁盘镜像功能,这比硬件 RAID 有优势,因为文件系统知道哪个磁盘有坏数据,可以通过从另一个磁盘读取来自动修复文件。但是,使用硬件 RAID,他们无法向 RAID 控制器请求“另一个版本”,因此无法进行修复。
软件 RAID 1 控制器的表现会有所不同吗?可能会(参见上面引用的 LWN 评论),但还有另一个重要的区别。
对于软件 RAID(以及文件系统镜像),磁盘本身带有属于镜像集的信息。因此,如果您将一个磁盘移到其他地方,它仍会被识别为不完整的 RAID 1 阵列的一部分,并且通常软件首先不允许对其进行写入 - 除非您拆分镜像,否则它将保持只读状态。