
不当重建是客户在尝试自行解决阵列问题时经常犯的错误。这个问题足够复杂,足以让数据恢复工程师感到困惑。重要的是要确切了解数据发生了什么变化,以及这如何影响成功恢复数据的机会。
我们将探讨最流行的级别——RAID-5。我们将考虑初始化、正确重建和错误重建的过程是如何为其执行的。此外,我们还将讨论在不当重建后是否有可能恢复数据。
RAID-5 的不当重建可能有很多种情况,在本文中,我们将只限于其中一种——即新旧配置相同的情况。这是实践中的常见情况,也是最容易解释和从中恢复数据的。一旦我们研究了这种情况,我们就可以在接下来的文章中转向更复杂的案例。
我们假设您已经学习了上一篇关于 RAID-1 的文章,并理解我们所说的初始化、重建以及"不当重建"问题的本质。因此,让我们直接探讨这些过程在 RAID-5 中的具体情况。

正确重建与不当重建的区别
RAID-5 中的冗余
让我们考虑一个三驱动器的 RAID-5 LS(左同步)方案:

三驱动器 RAID-5 LS 的模板。
每行都有一个存储其他块 XOR 结果的块:
C0 = A0 xor B0,
B1 = A1 xor C1,
A2 = B2 xor C2
数据被分成块。每行包含数据块。然而,有一个特殊的块存储了为该行中所有数据块计算出的 XOR 操作结果。我们将此块称为"XOR 块"。RAID-5 有多种方案,但就本文而言,它们之间的差异并不重要。
有了 XOR 块,我们可以恢复任何一个故障成员的数据。例如,如果块 C0 = A0 xor B0,那么:
-
A0 = B0 xor C0
-
B0 = A0 xor C0
-
C0 = A0 xor B0 (根据定义)。
对于其他行也是如此——任何成员都可以使用 XOR 操作和其余成员来恢复。同样的规则适用于具有更多成员的 RAID-5。
这使我们得出任何正常运行的 RAID-5 的一个特性:XOR 块必须是有效的。数据块的 XOR 结果必须等于存储在 XOR 块中的值。
RAID-5 初始化
如果我们取任意驱动器并尝试创建 RAID-5,我们不能确定 XOR 块是有效的。因此,RAID-5 阵列需要初始化。
我们如何使 XOR 块有效?显而易见的解决方案是计算数据块的 XOR 并将结果写入相应的 XOR 块。大多数 RAID 控制器都是这样做的。

RAID 5 初始化
执行 XOR 块计算和更新:
A0 XOR B0 -> C0
A1 XOR C1 -> B1
B2 XOR C2 -> A2
也就是说,在初始化期间,所有成员上的数据都会被部分更新。
降级后的重建
如果其中一个成员发生故障,RAID-5 会降级——数据仍然可用(缺失驱动器的数据是动态计算的),但不再保证可靠性。
要恢复阵列的特性,必须用新驱动器更换故障驱动器。仅仅将新驱动器添加到阵列中就足够了吗?不。新驱动器不包含正确的数据或有效的 XOR 块。必须执行重建,这是一个将正确数据写入新驱动器的过程。如何获取正确的数据?很简单——计算旧成员的 XOR。

RAID-5 重建(恢复成员 C):
对成员 A 和 B 的数据进行 XOR 运算,并将结果写入 NewC
A0 xor B0 -> NewC
A1 xor B1 -> NewC
A2 xor B2 -> NewC
这意味着:在正确重建期间,只有新驱动器会被更新。
不当重建
让我们看看当执行了初始化而不是(正确的)重建时,数据是如何变化的。RAID-5 有很多参数,为简单起见,我们假设所有参数都没有改变。

在 RAID-5 中使用新成员进行初始化:
执行 XOR 块重新计算:
A0 xor B0 -> NewC0 (正确)
A1 xor NewC1 -> B1 (错误)
B2 xor NewC2 -> A2 (错误)
初始化将重新计算并更新所有 XOR 块。在这种情况下:
-
新驱动器上的数据块将保持不变,即它们将继续存储无用的数据。
-
旧驱动器上的 XOR 块将基于错误的数据重新计算,因此它们将是错误的。
损坏分析
让我们了解这些损坏如何影响逻辑 RAID 镜像——组装后的 RAID 上的数据会是什么样子。

由驱动器 A、B 和 NewC 组装的 RAID 数据。
每 6 个块包含 2 个坏块。
对于三盘 RAID-5,每 6 个块一组将有 4 个好块和 2 个坏块。从技术上讲,这只有 33.3% 的损坏。而对于 10 个驱动器的 RAID-5,我们只会得到 10% 的损坏。这听起来还不算太糟!但残酷的事实是,客户需要的是健康的文件,而不是扇区。而未被损坏的文件将非常少。
让我们为我们的例子计算一下:如果块大小是 64 KB,那么 6 个块只有 384 KB。几乎所有常见的文件,如存档、照片和文档,都远大于这个大小,也就是说,它们几乎肯定会被损坏。
是否有可能在没有故障驱动器的情况下恢复数据?
让我们看看是否有办法在没有旧的故障驱动器 C 的情况下恢复数据。
我们已经发现,在包含成员 A、B 和 NewC 的配置中,数据将被损坏。这不是一个可行的方案。
如果我们尝试从冗余中恢复驱动器 C 的数据呢?不幸的是,在重新初始化期间,XOR 块被重新计算,现在 A xor B = NewC。这意味着,如果我们用 A、B 和虚拟盘(缺失驱动器的占位符)组装一个阵列,我们将得到与用 A、B 和 NewC 组装阵列完全相同的数据。
结论:没有原始 C 盘,不可能完全恢复数据。
是否可以使用损坏驱动器的镜像来恢复数据?
假设驱动器 C 的损坏不是致命的,并且我们设法使用 PC-3000 对数据进行了复制。这个副本会帮助我们吗?

驱动器 A、B 和镜像 C 上的数据
只有 A 和 B 上的 XOR 块损坏了
在重新初始化是以相同配置执行的情况下,情况相当简单:
-
A 和 B 上的数据块是有效的
-
A 和 B 上的 XOR 块是无效的
-
C 上的数据块和 XOR 是有效的
还有一个额外的因素需要考虑——阵列可以存储有关配置的元数据。驱动器 A、B 上的元数据可能与驱动器 C 上的元数据冲突。
所以我们拥有所有的数据块,但存在 XOR 和元数据问题。

从驱动器 A、B 和 C 的镜像组装的 RAID 数据。
所有数据块都是正确的——有可能获得没有任何损坏的 RAID 数据。
使用 PC-3000 RAID 系统,我们可以轻松获得正确的阵列数据,并保持所有用户文件完好无损。无论是元数据冲突还是 XOR 问题都无法阻止我们。
可以使用原始控制器访问数据吗?不幸的是,我们不能保证这一点,也不能保证这对数据是安全的。由于元数据冲突,控制器可能只构建一个由驱动器 A、B 和虚拟盘组成的阵列(我们在上面讨论过这种配置不正确),或者它可能建议重建阵列:A xor B -> C,而这个过程将损坏数据。如果您想使用原始控制器,请务必制作所有驱动器的副本!
结论:在 PC-3000 RAID 系统中,我们可以组装一个用户数据完好的 RAID。使用原始控制器访问数据可能是危险的。
结论
在本文中,我们探讨了 RAID-5,这是最流行的 RAID 级别。不幸的是,这个级别也受到不当重建问题的影响——即启动了初始化而不是正确重建的情况。当客户尝试自行重新获取数据访问权限时,经常会犯这个错误。
在本文中,我们仅限于新配置与旧配置匹配的情况。我们通过这个例子探讨了:
-
RAID-5 是一个在每一行存储特殊 XOR 块的级别,这使其能够承受任何一个成员的故障。
-
在 RAID-5 初始化期间,通常会计算并写入 XOR 块。也就是说,阵列的每个成员都会被部分更新。
-
在(正确)重建期间,故障成员的数据被恢复并写入新驱动器。数据是使用 XOR 块恢复的。因此,在正确重建期间,只有新驱动器被更新。
-
在不当重建期间,由于 XOR 重新计算,旧成员被错误数据部分更新。
-
如果故障成员永久损坏,将无法完全恢复 RAID 数据。所有中型和大型文件都将包含错误。
-
如果可以对损坏成员的数据进行复制,则可以使用 PC-3000 RAID 系统恢复 RAID 数据。
-
使用原始控制器进行数据恢复可能是危险的。
我们没有考虑新配置与旧配置不同的情况。那里的损坏更为复杂,但在许多情况下数据恢复仍然是可能的。我们将在后续文章中探讨一些例子。