RAID1 与其他 RAID 级别的 Linux 软件 RAID 稳健性

Wax*_*ead 4 linux raid redundancy mdadm

我有一个 RAID5 阵列正在运行,现在还有一个我昨天设置的 raid1。由于 RAID5 计算奇偶校验,因此它应该能够捕获一个磁盘上的静默数据损坏。但是对于 RAID1,磁盘只是镜像。我想得越多,我认为 RAID1 实际上是相当危险的。当然它可以使我免于磁盘故障,但在保护磁盘上的数据方面可能没有那么好(实际上谁对我更重要)。

  1. Linux 软件 RAID 如何在磁盘上实际存储 RAID1 类型的数据?
  2. 它如何知道哪个主轴提供损坏的数据(如果磁盘(子系统)没有报告任何错误)

如果 RAID1 真的没有给我数据保护而是磁盘保护,我可以用 mdadm 做一些技巧来创建两个磁盘“类似 RAID5”的设置吗?例如,容量松散但仍为数据保留冗余?

Ste*_*day 6

由于 raid5 计算奇偶校验,因此它应该能够捕获一个磁盘上的静默数据损坏。

不。可以用随机数据完全抹掉一个扇区,RAID5 连一根睫毛都没有。RAID1 也有同样的问题。

一般来说,RAID 不提供实时数据完整性检查。它提供的是面对一个(或多个,具有某些 RAID 级别)驱动器故障时的容错能力。这是两件非常不同的事情。

如果您正在寻找捕获文件损坏的方法,则需要文件系统支持。RAID 不这样做。至少,不是靠自己。

要回答您的具体问题:

RAID1 被简单地实现为两个(或更多)相同的镜像。当镜像不同意扇区的内容时,就发生了损坏。问题是,RAID 系统通常不会意识到这一点,因为当它被要求检索给定扇区时,它通常不会读取所有镜像。为了效率,它可能只安排一个磁盘来读取它(希望是磁头当前离它最近的那个)。

假设在“清理”操作期间,当 RAID 系统被明确要求验证其所有数据的一致性时,就会发现不一致。如何解决这种不一致的问题没有简单的答案。请注意,此问题同样影响 RAID5 和 RAID1,以及其他 RAID 级别。

在 RAID1 中,不一致表现为包含不同数据的两个镜像扇区。RAID 系统如何决定哪个扇区代表正确的数据?嗯,这是一个实现细节,老实说我不知道​​Linux系统是如何实现的。但问题是根本性的:镜像扇区是不同的,可能没有迹象表明它们为什么会变成那样。因此,RAID 系统所能做的最好的事情就是抛硬币:随机选择一个作为“正确”数据。

在三盘RAID5中,会以三组扇区的奇偶校验扇区不正确的形式出现不一致。问题是:这 3 个扇区中哪个是错误的?同样,没有明显的答案。三者中的任何一个都可能腐败,而且可能无法知道。如果您必须从其他 2 个扇区中选择一个要重新计算的扇区,则您有三分之一的机会选择实际损坏的扇区。这表明 RAID1 在这个意义上实际上比 RAID5“更安全”。RAID1 有 50% 的选错扇区,而 RAID5 有 67% 的选错机会。

总而言之:RAID 并非旨在捕捉发生的磁盘错误。RAID 在整个驱动器出现故障时提供容错能力。而已。

  • 正如我所说,RAID 系统通常无法检测静默磁盘损坏。当 RAID5 读取一个扇区时,出于效率和性能的原因,它只读取满足请求所需的内容(忽略预读缓存)。我想可以创建一个 RAID5 来验证每个读取请求的磁盘奇偶校验,但这会大大减慢速度,因为它基本上需要为每个请求的读取执行 2 次物理读取。如果您只验证一小部分读取,那么您将不可避免地错过一些静默损坏的实例。 (2认同)

rob*_*rob 6

RAID5 不会捕获磁盘上的静默数据损坏;您需要一个具有块级校验和的文件系统,例如 ZFS 或 BTRFS,以防止出现这种情况。由于奇偶校验计算,RAID5 的性能也不如 RAID1。对于任何类型的奇偶校验 RAID,您都应该注意解决 RAID5 写入漏洞,例如,在断电情况下,这可能会导致数据损坏。

Linux 软件 RAID1 有一个有趣的优势,您可以根据需要创建任意数量的镜像——因此,如果正常运行时间是您的第一要务,您可以配置一个 8 磁盘 RAID1,以维护 7 个冗余副本。

使用 RAID1 发生数据损坏的可能性与使用单个磁盘(没有 RAID)差不多。

如果您真的担心数据损坏,您应该使用校验和文件系统或定期将未更改的数据与多个备份进行比较。一个流行的 ZFS 成功故事讲述了一个人的计算机正在悄悄破坏他的数据的故事,直到他开始使用 ZFS 时他才知道这一点。经过一番排查,他发现原因是电源有问题。

您还应该考虑到硬盘驱动器不是唯一可能损坏数据的地方。例如,如果您不使用 ECC RAM(以及不仅兼容而且支持 ECC 的企业级主板),宇宙射线可能会在内存中翻转一点。根据我们谈论的数据类型,它甚至可能无关紧要。如果是视频或音乐文件,播放文件时不会注意到位翻转。

当您深入了解问题的实质时,静默数据损坏完全与概率有关。你的数据被破坏的概率不是很高;否则我们都会不断诅咒我们的数据再次被破坏。(每个人可能会保留多个备份,甚至是所有内容的硬拷贝,因为他们不相信计算机会保留一份好的副本。)您甚至会注意到数据损坏的可能性更低。大多数人完全不知道静默数据损坏的概念,他们过得很好。还值得注意的是,即使是许多企业级磁盘存储系统也无法在文件系统级别防止静默数据损坏。但是,如果您根本不是赌徒,那么您可能想在企业级硬件(ECC RAM、


Beo*_*e42 4

聚焦实际问题...

即使 RAID 5 也无法纠正静默位衰减,但它可以在数据清理期间检测到它。尽管它能够纠正磁盘报告为具有不可恢复的读取错误(URE)的单个块。请注意,并非会读取 RAID5 条带中的所有驱动器来进行正常数据读取,因此,如果未使用的磁盘上的条带中存在错误,则在执行数据清理之前不会检测到该错误。任何标准 RAID 的静默位失效检测只能在数据清理期间进行。在重建故障磁盘期间,RAID 5 甚至无法做到这一点,这是当今 RAID 5 最令人担忧的问题。

  1. Linux mdadm RAID 1 与几乎所有 RAID 1 实现一样,只是将相同的数据复制/镜像到多个磁盘上。它不添加纠错或检测数据。如果您从任何 RAID 1 中取出一个磁盘并在另一台 PC 上使用它,它很可能只是像普通的单个磁盘一样工作。Linux mdadm 在磁盘的开头添加了一些阵列描述,以便它可以知道哪些分区属于哪个阵列,因此 mdadm 会知道它是 RAID 1,但无论如何都可以挂载和使用单个磁盘。
  2. 所有 RAID 1 控制器,无论是软件还是硬件,都依赖于 HDD 使用自己的错误检测和纠正方法。请参阅这篇维基百科文章,了解有关 HDD 如何执行此操作的一些信息,特别注意纠错编码 (ECC)的使用。

这就是磁盘系统将大多数位损坏报告为不可纠正的读取错误 (URE) 给 mdadm 的原因。但是,您的数据仍然存在风险,不会导致磁盘报告任何错误,例如

  • 如果在写入过程中出现磁头定位错误,则附近的某个随机扇区将被数据覆盖并纠正该块的 ECC 数据。读取实际写入的块将报告它读取该块很好,即使事实并非如此。
  • 服务器在将数据写入阵列中的所有磁盘之前断电,则该条带中的某些块将与其他块不一致。

以及其他类型的错误,例如 ServerFault 页面上描述的错误,硬盘驱动器上的位腐烂是否是一个真正的问题?对此我们能做些什么呢?

至少具有 3 个磁盘的 RAID 6 和 RAID 1 阵列是唯一有可能检测和纠正某些形式的静默位失效的标准 RAID 级别,这些静默位失效不会被各个磁盘报告为错误,尽管我不知道如果 mdadm 实现了所需的代码。通过使用前向纠错式投票系统。

  • 对于 RAID 6 - 仅当错误位于奇偶校验块之一时。这是由于数据、奇偶校验 1 和奇偶校验 2 之间可能进行 3 路投票。如果奇偶校验块 1 或 2 表示存在错误,但其他 2 个没有,则该奇偶校验块基本上可以被否决。如果错误出现在其中一个数据块中,它无法纠正问题的原因是它无法知道哪个数据块有错误,除非是3 磁盘 raid 6,这通常是不允许的。我怀疑任何实现,包括 mdadm,都会为这种晦涩的纠正方案而烦恼,并只是将其报告为错误。
  • 对于具有 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 级别,您需要在损坏和测试读取之间执行数据清理。