ZFS RAIDZ 技术解析

来源:互联网 发布:纤莉秀大码女装淘宝 编辑:程序博客网 时间:2024/06/08 05:40

RAID(廉价磁盘冗余阵列)最初的承诺是它将使用廉价磁盘提供快速、可靠的存储。重点在于廉价,但不知为何 我 们最终却得到这种结果。为什么呢?
(以及其他数据/奇偶校验方案,比如 RAID-4RAID-6、奇偶和行对角奇偶校验)从未完全履行过 RAID的承诺,并且也无法履行,这是因为存在一种称为 RAID-5写漏洞的致命缺陷。不管何时更新 RAID存储条,还必须更新校验,以便所有磁盘异或为 0,正是这个等式使您能在磁盘故障时 重构数据。问题在于无法以原子方 式更新两个或多个磁盘,所以RAID存 储条可能在崩溃或电源断 电时被损坏。

为了认清这个问题,假设您在写入数据块之后、但在写入 相应校验块之前断电。现在,此存储条的数据和奇偶校验就不一致,而且它们将永远保持不一致(除非在某个时候使用一个全存储条写操作覆盖了旧数据)。因此,如果磁盘故障,RAID重构过程将在您下一次读取此存储条上的任何块时生成垃圾。更糟的 是,它这样做使没有任何提示,它根本不知道提供给您的是损坏的数据。
为解决此问题,出现过一些仅用于软件的应急方案,但它们的速度非常慢,所以软件RAID已经在市场中消亡。当前的 RAID 产品全部在硬件中执行 RAID 逻辑,这样它们可以使用NVRAM来应对断电。这确实有用,但成本很高。


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

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

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

进入 RAID-Z 的世界。

Q0  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块,ZFS都会将其与校验和进行 比较。如果数据磁盘没有返回正确的答案,ZFS读取奇偶校验,然后执行组合重构以确定哪个磁盘返回了坏数据。然后,ZFS修复损坏的磁盘,并向应用程序返回好数据。ZFS 还通过 SolarisFMA报告事故,以便系统管理员知道其中一个磁盘无提示地发生了故障。

最后,注意RAID-Z 不需要任何特殊的硬件。它不需要NVRAM进行更正,不需要写缓冲来获取好的性能。使用 RAID-ZZFS很好地履行了最初的 RAID 承诺:它使用廉价的商品磁盘提供了快速、可靠的存储。

有关 RAID-Z 检测并更正片状硬盘上无提示数据损坏 的真实示例,请参阅Eric Lowe's SATA saga
当前的 RAID-Z 算法是单奇偶校验,但 RAID-Z 概念适合任何 RAID 类型。双奇偶校验版本正在筹备中。


同行编程人员将感激的最后一件事是:整个RAID-Z实现只有 599行。

 

 

原创粉丝点击