RAID(廉价磁盘冗余阵列)最初的承诺是它将使用廉价磁盘提供快速、可靠的存储。重点在于廉价,但不知为何我们最终却得到这种结果。为什么呢?

  RAID-5(以及其他数据/奇偶校验方案,比如 RAID-4、RAID-6、奇偶和行对角奇偶校验)从未完全履行过 RAID的承诺,并且也无法履行,这是因为存在一种称为 RAID-5 写漏洞的致命缺陷。不管何时更新 RAID存储条,还必须更新校验,以便所有磁盘异或为 0,正是这个等式使您能在磁盘故障时重构数据。问题在于无法以原子方式更新两个或多个磁盘,所以RAID 存储条可能在崩溃或电源断电时被损坏。

  为了认清这个问题,假设您在写入数据块之后、但在写入相应校验块之前断电。现在,此存储条的数据和奇偶校验就不一致,而且它们将永远保持不一致(除非在某个时候使用一个全存储条写操作覆盖了旧数据)。因此,如果磁盘故障,RAID重构过程将在您下一次读取此存储条上的任何块时生成垃圾。更糟的是,它这样做使没有任何提示,它根本不知道提供给您的是损坏的数据。

  为解决此问题,出现过一些仅用于软件的应急方案,但它们的速度非常慢,所以软件 RAID 已经在市场中消亡。当前的 RAID 产品全部在硬件中执行 RAID 逻辑,这样它们可以使用 NVRAM 来应对断电。这确实有用,但成本很高。

  现有 RAID 方案还存在一个糟糕的性能问题。当执行部分存储条写操作时,也就是说,当更新的数据少于单个 RAID 存储条包含的数据时,RAID系统必须读取旧数据和奇偶校验来计算新奇偶校验。这是一个巨大的性能损失。全存储条写操作异步执行所有写操作,而部分存储条写操作必须在同步读操作之后才能启动写操作。

  又一次,昂贵的硬件提供了一种解决方案:RAID 阵列可以在等待磁盘读操作完成时,在 NVRAM中缓冲部分存储条写操作,这样读延迟就可以对用户隐藏。当然,这种方法只在 NVRAM缓冲器用完之前有效。没问题!您的存储供应商会说。只要再多掏些现金,多买些 NVRAM 就好了。没有您的钱包不能解决的问题。

  部分存储条写操作在事务文件系统(比如ZFS)中又提出了另一个问题。部分存储条写操作必然会修改有效数据,这违反了确保事务语义这一规则。(如果在完全存储条写时断电,则没什么问题,同理,如果您在 ZFS 中的其他任何写操作期间断电也没什么问题:但您正在写入的块没有一个是有效的。)
  但愿我们不用执行这些烦人的部分存储条写操作……


  进入 RAID-Z 的世界。
  RAID-Z是一种数据/奇偶校验方案,比如 RAID-5,但它使用动态的存储条宽度。每个块是自己的 RAID-Z 存储条,不管块大小是多少。这意味着,每个RAID-Z 写操作是一个全存储条写操作。当与 ZFS 的“写复制”事务语义相结合时,这完全消除了 RAID 写漏洞。RAID-Z 还比传统的RAID 快,因为它从来不用执行读-改-写。
  哇,哇,哇 —— 就这样?可变存储条宽度?天啊,这也太简单了。如果这真是一个好注意的话,那为什么并非人人都这样做呢?


  这里棘手的地方在于 RAID-Z 重构。因为存储条的大小各不相同,所有根本没有像“所有磁盘都异或为0”这样简单的公式。您必须遍历文件系统元数据来确定 RAID-Z 几何。注意,如果文件系统和 RAID阵列是相互独立的产品的话,这将无法办到,这就是为什么今天的存储市场没有 RAID-Z这样的东西。要解决这个问题,您真正需要的是一个集成数据逻辑和物理结构的视图。

  等等,您说:这是不是太慢了?遍历所有元数据的成本不是很高吗?实际上,这是一个折衷方案。如果您的存储池几乎已满,那么它确实会比较慢。但如果不是这样,则元数据驱动的重构事实上比较快,因为它只复制有效数据;而不浪费时间复制未分配的磁盘空间。


  但更重要的是,遍历元数据意味着 ZFS 可以按照它的 256 位校验和验证每个块。传统 RAID 产品做不到这一点;它们只是盲目地一起异或数据。
  RAID-Z带给我们最酷的一件事是:自愈数据。除了处理全磁盘故障之外,RAID-Z 还可以检测并更正无提示的数据损坏。不管何时读取 RAID-Z块,ZFS 都会将其与校验和进行比较。如果数据磁盘没有返回正确的答案,ZFS读取奇偶校验,然后执行组合重构以确定哪个磁盘返回了坏数据。然后,ZFS 修复损坏的磁盘,并向应用程序返回好数据。ZFS 还通过 SolarisFMA 报告事故,以便系统管理员知道其中一个磁盘无提示地发生了故障。


  最后,注意 RAID-Z 不需要任何特殊的硬件。它不需要 NVRAM 进行更正,不需要写缓冲来获取好的性能。使用 RAID-Z,ZFS 很好地履行了最初的 RAID 承诺:它使用廉价的商品磁盘提供了快速、可靠的存储。
  
  
  有关 RAID-Z 检测并更正片状硬盘上无提示数据损坏的真实示例,请参阅 Eric Lowe's SATA saga。
  当前的 RAID-Z 算法是单奇偶校验,但 RAID-Z 概念适合任何 RAID 类型。双奇偶校验版本正在筹备中。
  同行编程人员将感激的最后一件事是:整个 RAID-Z 实现只有 599 行。