我有一个正在运行的 RAID5 阵列,现在还有一个我昨天设置的 raid1。由于 RAID5 计算奇偶校验,它应该能够捕获一个磁盘上的静默数据损坏。但是对于 RAID1,磁盘只是镜像。我越想越觉得 RAID1 实际上非常危险。当然,它可以让我免于磁盘故障,但在保护磁盘上的数据方面可能不那么好(这对我来说实际上更重要)。
- Linux 软件 RAID 实际上如何在磁盘上存储 RAID1 类型的数据?
- 它如何知道哪个主轴给出了损坏的数据(如果磁盘(子系统)没有报告任何错误)
如果 RAID1 确实没有为我提供数据保护而是磁盘保护,我可以使用 mdadm 来创建双磁盘“类似 RAID5”的设置吗?例如,减少容量但仍保持数据冗余?
答案1
关注实际问题...
即使 RAID 5 也无法纠正静默位腐烂,但它可以在数据清理期间检测到它。虽然它可以纠正磁盘报告为具有不可恢复读取错误 (URE) 的单个块。请注意,并非 RAID5 条带中的所有驱动器都会被读取以进行正常数据读取,因此如果未使用磁盘上的条带中存在错误,则在您执行数据清理之前将无法检测到它。任何标准 RAID 的静默位腐烂检测只能在数据清理期间发生。RAID 5 甚至无法在重建故障磁盘期间做到这一点,这是目前 RAID 5 最令人担忧的问题。
- Linux mdadm RAID 1 与几乎所有 RAID 1 实现一样,只是将相同的数据复制/镜像到多个磁盘上。它不添加任何错误更正或检测数据。如果您从任何 RAID 1 中取出磁盘并将其用于另一台 PC,它很可能只是作为普通的单个磁盘工作。Linux mdadm 在磁盘的开头添加了一些阵列描述,以便它可以知道哪些分区属于哪个阵列,因此 mdadm 会知道它是 RAID 1,但无论如何都可以挂载和使用单个磁盘。
- 所有 RAID 1 控制器(无论是软件还是硬件)都依赖于 HDD 使用自己的错误检测和纠正方法这一事实。请参阅这篇维基百科文章有关硬盘如何做到这一点的信息,特别注意使用错误纠正编码 (ECC)。
这就是为什么大多数位腐烂会被磁盘系统报告为不可纠正的读取错误 (URE) 给 mdadm。但是,仍然存在一些风险,这些风险不会导致磁盘报告任何错误,例如
- 如果在写入过程中发生磁头定位错误,则某个随机的邻近扇区将被数据和该块的正确 ECC 数据覆盖。读取实际写入的块将报告它读取该块正常,即使事实并非如此。
- 如果服务器在将数据写入阵列中的所有磁盘之前断电,则该条带中的某些块将与其他块不一致。
以及其他类型的错误,如 ServerFault 页面上描述的错误硬盘上的位衰减是真正的问题吗?可以做些什么来解决这个问题?
至少有 3 个磁盘的 RAID 6 和 RAID 1 阵列是唯一能够检测和纠正某些形式的静默位衰减(单个磁盘未报告为错误)的标准 RAID 级别,方法是使用前向纠错式投票系统。虽然我不知道 mdadm 是否实现了所需的代码 mdadm 不会执行此操作,仅当光盘报告错误时,mdadm 才有效。
如果突袭控制器确实实施了该投票式系统,则只能纠正位腐烂:
- 对于 RAID 6 - 仅当错误发生在其中一个奇偶校验块中时。这是因为数据、奇偶校验 1 和奇偶校验 2 之间可能存在 3 种投票方式。如果奇偶校验块 1 或 2 表示有错误,而其他 2 个没有,则奇偶校验块基本上可以被投票否决。如果错误发生在其中一个数据块中,它无法纠正问题的原因是它无法知道哪个数据块有错误,除非它是3 磁盘 raid 6,这通常是不允许的。我怀疑是否有任何实现会费心使用这种模糊的更正方案并将其报告为错误。
- 对于具有 3 个或更多活动的、据称已经同步的磁盘的 RAID 1,它可以进行简单多数表决。不过,我不知道是否有任何 RAID 实现会考虑这种逻辑,因为没有多少人使用 3+ 磁盘 RAID 1。如果它确实实现了所需的逻辑,那么 RAID 1
- 通常有 3 个磁盘,具有静默位腐烂的块可以自动更正,但如果是在重建期间则不行,因为这会将活动同步磁盘的数量减少到 2 个。
- 即使在重建 1 个故障磁盘时,4 磁盘 raid 1 也可以自动纠正具有单个坏块的任何条带。
- 5 个磁盘可以自动纠正具有 2 个静默坏块的条带,但是,如果在重建 1 个或 2 个同时发生故障的磁盘期间发现该坏块,则该坏块数会减少到 1 个。
仅供参考,我注意到 Synology DS1813+ 设备对数据和系统分区都使用 mdadm,并且它在所有 8 个磁盘上使用 RAID 1 作为系统分区。
您可能已经注意到,这在很大程度上依赖于磁盘能够将坏数据报告为错误。虽然每个人都说使用 ZFS 来解决这个问题。但我相信不再相信,ZFS 的主要数据完整性改进是它提供了更频繁的数据清理,因为它在每次读取时都会检查镜像/奇偶校验,以及独立的块级奇偶校验(这意味着许多无声损坏的块不再是无声的,如果可能的话会得到纠正),并且它可能实现上述静默数据损坏的逻辑。
要测试特定系统是否可以检测和/或纠正静默数据损坏,请使用 Linux dd 命令将随机数据写入阵列中的一个分区,然后测试数据在阵列上是否仍然完好。警告不要在包含要保留的数据的系统上执行此测试,因为您的系统可能会失败。对于标准 RAID 级别,您需要在损坏和测试读取之间执行数据清理。
编辑:此后,我在一组廉价的 USB 棒上测试了 mdadm 与 ZFS,这些 USB 棒几乎没有内置错误检测功能。3 棒 mdadm RAID1 阵列严重故障,数据丢失严重,即使每天进行两次数据清理也是如此。而使用相同布局的 ZFS 阵列运行正常,即使我故意使用上次使用 mdadm 测试时已知的坏 USB 棒。这凸显了与 mdadm 相比,ZFS 的优势远远超出了频繁检查数据。
答案2
由于raid5计算奇偶校验,它应该能够捕获一个磁盘上的静默数据损坏。
不会。你可以完全抹去一个带有随机数据的扇区,而 RAID5 对此毫不在意。RAID1 也有同样的问题。
一般来说,RAID 不提供实时数据完整性检查。它提供的是当一个(或多个,在某些 RAID 级别)驱动器发生故障时的容错能力。这是两个截然不同的东西。
如果您正在寻找某种方法来捕获文件损坏,则需要文件系统支持。RAID 无法做到这一点。至少,它本身无法做到这一点。
回答您的具体问题:
RAID1 的实现方式很简单,就是两个(或更多)相同的镜像。当镜像对某个扇区的内容不一致时,就表示发生了损坏。问题是,RAID 系统通常无法意识到这一点,因为当系统被要求检索给定扇区时,它通常不会读取所有镜像。为了提高效率,它很可能只安排一个磁盘来读取它(希望是磁头当前最靠近它的磁盘)。
假设在“清理”操作期间,当明确要求 RAID 系统验证其所有数据的一致性时,发现了不一致。如何解决这种不一致的问题没有简单的答案。请注意,这个问题对 RAID5 和 RAID1 以及其他 RAID 级别的影响相同。
在 RAID1 中,不一致表现为两个镜像扇区包含不同的数据。RAID 系统如何确定哪个扇区代表正确的数据?好吧,这是一个实现细节,老实说,我不知道 Linux 系统究竟是如何实现的。但问题很根本:镜像扇区不同,而且可能没有任何迹象表明它们为什么会变成这样。因此,RAID 系统能做的最好的事情就是抛硬币:随机选择一个作为“正确”的数据。
在 3 磁盘 RAID5 中,不一致以三个扇区的形式出现,其中奇偶校验扇区不正确。问题是:这三个扇区中的哪一个是错误的?同样,没有明显的答案。这三个扇区中的任何一个都可能是损坏的,而且可能无法知道。如果您必须选择一个扇区来从其他两个扇区重新计算,则您有三分之一的机会选择实际上已损坏的扇区。这表明 RAID1 实际上比 RAID5“更安全”,从这个意义上说。RAID1 选择错误扇区的概率为 50%,而 RAID5 选择错误扇区的概率为 67%。
总结一下:RAID 并非设计用于在磁盘错误发生时捕获它们。RAID 在整个驱动器发生故障时提供容错功能。仅此而已。
答案3
RAID5 不会捕获磁盘上的静默数据损坏;您需要一个具有块级校验和的文件系统(例如 ZFS 或 BTRFS)来防止这种情况。由于其奇偶校验计算,RAID5 的性能也不如 RAID1。对于任何类型的奇偶校验 RAID,您都应注意解决 RAID5 写入漏洞,例如,在发生断电时可能会造成数据损坏。
Linux 软件 RAID1 有一个有趣的优势,那就是您可以根据需要创建任意数量的镜像 - 因此,如果正常运行时间是您的首要任务,那么您可以配置一个维护 7 个冗余副本的 8 磁盘 RAID1。
使用 RAID1 的数据损坏可能性与使用单个磁盘(没有 RAID)相当。
如果您真的担心数据损坏,则应该使用校验和文件系统或定期将未更改的数据与多个备份进行比较。一个流行的 ZFS 成功案例讲述了一个人的计算机正在悄无声息地损坏他的数据,而他直到开始使用 ZFS 才知道这一点。经过一些故障排除后,他发现原因是电源故障。
您还应该考虑到硬盘并不是数据可能被破坏的唯一地方。例如,如果您不使用 ECC RAM(以及不仅兼容而且启用 ECC 的企业级主板),宇宙射线可能会翻转内存中的位。根据我们讨论的数据类型,这可能甚至无关紧要。如果是视频或音乐文件,播放文件时不会注意到位翻转。
深入研究问题的核心,你会发现静默数据损坏完全是概率问题。数据损坏的概率并不高;否则我们都会不断诅咒数据再次损坏。(每个人可能都会保留所有数据的多个备份,甚至硬拷贝,因为他们不相信计算机会保留一份好的副本。)你甚至会注意到数据损坏的可能性甚至更低。大多数人完全不知道静默数据损坏的概念,他们对此习以为常。还值得注意的是,即使是许多企业级磁盘存储系统也无法在文件系统级别防止静默数据损坏。但如果你根本不喜欢赌博,你可能想在企业级硬件(ECC RAM、电池供电的磁盘控制器等)上投入一些资金,然后改用 ZFS 或 BTRFS。
答案4
如果损坏是由硬盘造成的,那么 raid1 和 raid5 都无法保护您免受静默位损坏的影响。
想想看:使用 raid1 和 raid5 很容易检测到数据已损坏,但无法确定哪个磁盘获得了好数据,哪个磁盘获得了坏数据。
但请记住:硬盘上的静默位损坏发生得非常少(硬盘在所有块上都有自己的内部校验和),并且 raid 并不能消除备份的需要。
如果您需要在静默磁盘损坏的情况下生存,请使用 raid6 之类的东西,或者对所有文件进行校验的文件系统。