RAID 1和RAID 5(及其兄弟10和50)分别通过镜像和奇偶校验来实现数据冗余。 这允许RAIDarrays在磁盘(或整个磁盘)上的扇区变得不可读时仍然访问数据。 RAID 6(或60)使用额外的检查来允许出现双重故障。
但是,RAIDarrays如何处理不完全不可读的数据,却显然不一致呢?
如果出现一些错误,例如磁盘上的条带数据被改变,但是这个改变不会传播到另一个磁盘上,那么整个条带就会变得不一致。 如果在一个镜像集中,一个磁盘表示“这个位是0”,而另一个磁盘表示“这个位是1”,RAID控制器怎么知道哪一个是对的? 同样的推理可以应用到RAID-5条带,增加了复杂性,你不能容易地知道在条带中哪个扇区实际上是错误的。 此外,RAID 6是否可以通过双重caching来缓解这个问题,或者当数据实际可读时,它仍然可以从数据损坏中恢复,但在某些地方是错误的,特别是当RAID 6arrays倾向于拥有大量磁盘时?
这在理论上可以通过校验和来解决,以确保哪个数据副本(或奇偶校验)是正确的; 但是任何RAID控制器实际上是否实现了这种校验和(这当然会占用额外的空间)? 或者是否需要在操作系统级别进行处理,大多数文件系统可以并将对其内容进行校验? 如果是这种情况,那么RAID控制器的一般方法是如何从底层存储层抽象操作系统,如何告诉RAID控制器“在条带Z上的磁盘Y上的扇区X上的数据是错误的”可能?
您可以有效地描述一个磁盘写入(或读取)错误的情况。 RAID控制器没有实用的方法(例如写入和回读会导致性能下降),以防止出现这种情况。 它必须依靠磁盘能够检测到这种错误,并使用不同的块或保留卷 – 导致RAID的降级。
如果您考虑单磁盘情况,唯一的防止不一致写入(或读取)的保护是磁盘本身。 RAIDbuild立在此基础之上,但并没有引入额外的保障措施。
NB我从经验中知道,XFS对数组中的错误磁盘做出相当明智的反应。 因此,至less我的非低端控制器和操作系统确实认识到了这种不一致性(一种已知的故障磁盘被强制添加到卷中)。
RAID VOLUMES WITH PARITY STRIPE
在我们使用的Areca控制器(以及所有现代化的硬件RAID控制器)上,控制器可以实际检测是否存在奇偶数据或物理数据。 由于计算奇偶校验数据的方式,控制器可以判断奇偶校验数据是否发生了变化,而不将其与磁盘上的数据进行比较。
在奇偶校验数据被破坏的情况下,当您运行一致性检查并重新读取物理磁盘的正确位并重新写入奇偶校验条时,控制器将会注意到这个问题。
由于特定数据的奇偶校验数据永远不会与实际的驱动器上的数据存储在同一个驱动器上,因此不会引起任何问题。 但是,如果你有更多的驱动器失败,那么你的奇偶校验级别,你应该预期重大数据丢失
如果发生相反的情况,并且在实际的磁盘数据中有一点点翻转,那么控制器会查看奇偶校验条带(在音量检查过程中),看它是否发生了变化。 在这种情况下,控制器将覆盖磁盘上的数据以匹配奇偶校验数据,它可以确认不变/良好。
RAID VOLUMES WITHOUT PARITY STRIPE (EX. RAID1)
硬盘驱动器控制器/固件可能能够解决问题。 如果这是不可能的RAID控制器将很难解决这个问题。 在这种情况下,您可能需要单独读取驱动器才能恢复数据。
GENERALLY SPEAKING
如果您真的担心这个问题,您还可以在RAID卷上堆叠一个弹性文件系统。 现代弹性文件系统可以纠正许多这些数据完整性问题,并且通过RAID6堆叠弹性FS将为您提供出色的数据正常运行时间,而不会发生损坏。 即使同时发生2个驱动器故障,您仍然可以使用FS校验数据来避免向用户提供损坏的数据。