![RAID如何处理不一致的数据?](https://linux22.com/image/683420/RAID%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E4%B8%8D%E4%B8%80%E8%87%B4%E7%9A%84%E6%95%B0%E6%8D%AE%EF%BC%9F.png)
RAID 1 和 RAID 5(以及它们的兄弟 10 和 50)分别通过镜像和奇偶校验实现数据冗余。这允许 RAID 阵列在磁盘上的某个扇区(或整个磁盘)无法读取时仍能访问数据。RAID 6(或 60)使用额外的校验来允许双重故障。
但是 RAID 阵列如何处理那些并非完全无法读取但明显不一致的数据呢?
如果发生某种错误,导致磁盘上某个条带上的数据发生更改,但更改未传播到其他磁盘,则整个条带将变得不一致。如果在镜像集中,一个磁盘显示“此位为 0”,而另一个磁盘显示“此位为 1”,RAID 控制器如何知道哪一个是正确的?同样的推理可以应用于 RAID-5 条带,但增加了您无法轻易知道的复杂性哪个扇区在条带中实际上是错误的。另外,RAID 6 是否可以通过双重检查缓解此问题,或者当数据实际上是可读的但某处错误时,它是否仍然难以从数据损坏中恢复,尤其是当 RAID 6 阵列往往有很多磁盘时?
理论上可以通过校验和解决这个问题,以确保哪个数据(或奇偶校验)的副本是正确的;但是否有任何 RAID 控制器真正实现了这种校验和(这当然会占用额外的空间)?还是需要在操作系统级别处理,大多数文件系统都可以并且会对其内容进行校验和?如果是这样,他们如何告诉 RAID 控制器“条带 Z 上磁盘 Y 上扇区 X 上的数据是错误的”,而 RAID 控制器的一般方法是抽象的尽可能地远离底层存储层操作系统?
答案1
RAID VOLUMES WITH PARITY STRIPE
在我们使用的 Areca 控制器(以及所有现代硬件 RAID 控制器)上,一致性检查期间控制器可以检测出损坏是来自奇偶校验数据、磁盘上的物理数据还是两者。大多数控制器使用奇偶校验数据和磁盘上数据的简单校验和位来实现这一点。
如果奇偶校验数据损坏,当您运行一致性检查并重新读取物理磁盘以获取正确的位并重写奇偶校验条带时,控制器会注意到此问题。用户不会看到任何问题,因为他们在打开文件时正在读取磁盘上的数据。重新保存导致损坏的奇偶校验条带被重写的任何内容也将解决此问题。
如果发生相反的情况,即磁盘上的实际数据发生位翻转,则控制器将在一致性检查期间查看奇偶校验条带,以查看其是否已更改。在这种情况下,控制器将覆盖磁盘上的数据以匹配奇偶校验数据,它可以确认奇偶校验数据未发生更改/良好。在运行一致性检查并更正错误之前,用户将收到 CRC 错误或损坏的文件,具体取决于数据是什么。
由于特定磁盘数据的奇偶校验数据永远不会与实际数据存储在同一驱动器上,因此单个驱动器故障不会导致任何数据损坏问题。或者 RAID6 的两个磁盘等。
一致性检查可尽可能保证数据的准确性,如果损坏的数据在卷中停留的时间过长,则可能会写入奇偶校验数据,这意味着文件已彻底损坏,需要从备份中恢复。如果驱动器处于故障前状态,在一致性检查期间显示错误,请立即更换驱动器,而不是等待控制器将其标记为故障。我们每天对较小的卷进行一致性检查,每周对较大的卷进行一致性检查。
RAID VOLUMES WITHOUT PARITY STRIPE (EX. RAID1)
硬盘控制器/固件可能能够纠正该问题。如果这不可能,RAID 控制器将很难修复该问题。在这种情况下,您可能必须单独读取驱动器才能恢复数据。
GENERALLY SPEAKING
按照 RAID 卡制造商建议的间隔运行一致性检查。如果您真的担心损坏,您还可以在 RAID 卷上堆叠弹性文件系统。现代弹性文件系统可以纠正许多这些数据完整性问题,在 RAID6 上堆叠弹性 FS 将为您提供出色的数据正常运行时间,而不会损坏。即使同时发生 2 个驱动器故障,您仍然可以使用 FS 奇偶校验数据,以避免向用户显示损坏的数据。
答案2
您有效地描述了一个磁盘写入(或读取)错误的情况。RAID 控制器没有实用的方法来防止这种情况(例如写入和读回会降低您的性能)。它必须依靠磁盘能够检测到这种错误,并使用不同的块或退出卷 - 导致 RAID 降级。
如果您考虑单磁盘的情况,那么防止不一致写入(或读取)的唯一保护就是磁盘本身。RAID 以此为基础,但没有引入额外的保护措施。
注意:根据我的经验,XFS 对阵列中的错误磁盘反应非常灵敏。因此,至少我的非低端控制器和操作系统能够识别但不能够防止这种不一致(已知有故障的磁盘被强制添加到卷中)。