RAID的基本设计思想就是把多个相对便宜的硬盘组合起来,成为一个磁盘阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。所以RAID还有另一个定义:廉价磁盘阵列。但是随着硬盘技术的发展,和RAID诞生之初相比现在单个硬盘的容量、性能已经有了很大的改进,数据的单位存储成本的计价单位也已经由MB提升为GB,现在大家似乎不再提起这个定义。
虽然磁盘本身越来越廉价,但是出于对性能和数据安全性的最求,大家似乎已经在心理上默许了磁盘阵列产品的高昂成本,现有的各种RAID方案都违背了最初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 都会将其与校验和进行比较(check-summary)。如果数据磁盘没有返回正确的答案,ZFS读取奇偶校验,然后执行组合重构以确定哪个磁盘返回了坏数据。然后,ZFS 修复损坏的磁盘,并向应用程序返回好数据。ZFS 还通过 SolarisFMA 报告事故,以便系统管理员知道其中一个磁盘无提示地发生了故障。
最后,注意 RAID-Z 不需要任何特殊的硬件。它不需要 NVRAM 进行更正,不需要写缓冲来获取好的性能。使用 RAID-Z,ZFS 很好地履行了最初的 RAID 承诺:它使用廉价的商品磁盘提供了快速、可靠的存储。
通过调整ZFS的recordsize ,我们可以对ZFS的磁盘IO进行优化,以减少check-summary造成的磁盘性能负面影响。
同时,ZFS 的混合存储池技术本身也是一套较现有方案更廉价的兼具高性能和高存储容量的存储架构解决方案。