重新审视 RAID
当年我还是个新手服务技术员,对系统管理几乎一无所知,而我们被要求必须烂熟于心的为数不多的话题之一就是 RAID——廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks)。它是我们一切存储烦恼的答案。借助 RAID,我们可以将文件系统扩展得更大、获得更好的吞吐量,甚至增加冗余,使我们能够在丢失一块磁盘的情况下幸存下来——尤其在那个年代,磁盘丢失相当频繁地发生。随着 NAS 和 SAN 存储设备的兴起,深入到物理存储层面并对其加以调校以满足相关系统需求的这套技能正在迅速消失。这并非好事。仅仅因为我们将存储卸载到外部设备上,并不会改变这样一个事实:我们仍需从根本上理解我们的存储,并对其进行配置以满足我们系统的特定需求。
在过去五到十年里,似乎有一种误解进入了这一领域,那就是认为 RAID 在某种程度上代表了一种系统备份。事实并非如此。RAID 是一种容错形式。备份与容错在概念上截然不同。备份旨在让你在灾难发生之后能够恢复。容错则旨在从一开始就降低发生灾难的几率。可以把容错想象成在悬崖顶端筑起一道围栏,而把备份想象成在悬崖底部建起一座医院。你绝不会真的希望自己处于既无围栏也无医院的境地,但它们无疑是不同的东西。
一旦我们要为磁盘实施 RAID,无论是本地直连还是部署在像 SAN 这样的远程设备上,如今我们有四种关键的 RAID 方案可供企业选择:RAID 1(镜像)、RAID 5(带奇偶校验的条带化)、RAID 6(带双重奇偶校验的条带化)以及 RAID 10(镜像加条带化)。还有其他类型,比如 RAID 0,只应在你真正理解自己磁盘子系统需求的罕见情形下才使用。RAID 50 和 51 也有人使用,但远不那么常见,而且效果也远没有那么好。十年前,RAID 1 和 RAID 5 很常见,但如今我们有了更多选项。
让我们逐一审视这些选项,并讨论一些基本的数字。在我们的示例中,我们将用 n 表示阵列中的磁盘数量,用 s 表示任意单块磁盘的容量。借助这两者,我们可以表示出一个阵列的可用存储空间,从而便于在存储容量方面进行比较。
RAID 1:在这种 RAID 类型中,磁盘被镜像。你有两块磁盘,它们同时一起完成所有操作,故称“镜像”。镜像极为稳定,因为其过程非常简单,但它要求你购买比完全不使用 RAID 时所需多一倍的磁盘,因为你的第二块磁盘专门用于冗余。其益处在于,你可以确信写入磁盘的每一个比特都被写入了两次以为你提供保护。因此,对于 RAID 1,我们的容量计算为 (n*s/2)。RAID 1 的不足之处在于,相较于非 RAID 磁盘,它所提供的性能提升微乎其微。写入速度与非 RAID 系统相当,而读取速度在大多数情况下几乎快了一倍,因为在读取操作期间,磁盘可以并行访问以提高吞吐量。RAID 1 仅限于两块磁盘的组合。
RAID 5:带单一奇偶校验的条带化。在这种 RAID 类型中,数据以复杂的条带方式跨阵列中所有磁盘写入,并带有一个分布在所有磁盘上的奇偶校验块。通过这样做,RAID 5 能够使用一个由三块或更多磁盘组成的任意大小的阵列,且仅损失相当于单块磁盘的存储容量用于奇偶校验,尽管该奇偶校验是分布式的,并不单独存在于任何一块物理磁盘上。RAID 5 经常被采用,是因为它在大型阵列中存储容量损失小,因而具有成本效益。与镜像不同,带奇偶校验的条带化要求对跨磁盘的每一个写入条带执行一次计算,这会产生一定的开销。因此,其吞吐量并不总是一个一目了然的计算结果,而是在很大程度上取决于执行奇偶校验计算的系统的运算能力。计算 RAID 5 的容量相当容易,因为它就是 ((n-1)*s)。一个 RAID 5 阵列能够在阵列中任意单块磁盘丢失的情况下幸存。
RAID 6:带双重奇偶校验的冗余条带化。RAID 6 与 RAID 5 几乎完全相同,但每个条带使用两个奇偶校验块而非一个,以提供针对磁盘故障的额外保护。RAID 6 是 RAID 家族中较新的成员,是在其他级别已经标准化数年之后才加入的。RAID 6 的特别之处在于,它允许阵列中任意两块磁盘发生故障而不会遭受数据丢失。但为了容纳这额外一层冗余,一个 RAID 6 阵列会损失相当于阵列中两块磁盘的存储容量,并且要求至少四块磁盘。我们可以用 ((n-2)*s) 来计算一个 RAID 6 阵列的容量。
RAID 10:镜像加条带化。从技术上讲,RAID 10 是一种混合 RAID 类型,它由一组 RAID 1 镜像组成,这些镜像存在于一个无奇偶校验的条带(RAID 0)之中。许多供应商在谈及阵列中仅有两块磁盘的情形时会使用 RAID 10(或 RAID 1+0)这一术语,但从技术上讲那是 RAID 1,因为条带化要等到阵列中至少有四块磁盘时才会发生。在 RAID 10 中,磁盘必须成对添加,因此一个阵列中只能存在偶数块磁盘。RAID 10 能够在丢失多达全部磁盘半数的情况下幸存,但每一对中最多只能丢失一块。RAID 10 不涉及奇偶校验计算,因而相较于 RAID 5 或 RAID 6 具有性能优势,且驱动该阵列所需的运算能力更少。RAID 10 提供了所有常见 RAID 类型中最佳的读取性能,因为阵列中所有磁盘都可以在读取操作中被同时使用,尽管其写入性能要低得多。RAID 10 的容量计算与 RAID 1 完全相同,即 (n*s/2)。
在当今的企业中,无论实施的是软件 RAID 还是硬件 RAID,IT 部门很少会有切实的需要去考虑这里提到的四种之外的任何磁盘配置。传统上,在 RAID 阵列决策中最大的关切是围绕可用容量展开的。这是因为当时磁盘既昂贵又容量小。如今磁盘容量如此之大,以致存储容量很少成为问题——至少不像仅仅几年前那样,而且成本已经下降到这样的程度,以致为更好的磁盘冗余而采购所需的额外磁盘通常已无足轻重。当容量极为宝贵时,RAID 5 是一个受欢迎的选择,因为相较于其他阵列类型,它损失的存储容量最少,而且在大型阵列中其存储损失微不足道。
如今我们通常有其他方面的关切,主要是数据安全性和性能。多花一点钱来确保数据保护,理应是一个不言而喻的选择。RAID 5 的不足之处在于只能丢失一块磁盘。在一个仅有三个成员的阵列中,这只比 RAID 1 所提供的保护稍微危险一点。我们能够在三块磁盘中任意丢失一块的情况下幸存。与丢失两块磁盘中的任意一块相比,这并不太可怕。但若是一个大型阵列呢,比如十六块磁盘。只能安全地丢失十六块磁盘中的一块,这应当让我们更彻底地质疑我们的可靠性。
这正是 RAID 6 介入以填补这一空白之处。RAID 6 在大型阵列中使用时,引入的存储容量和性能损失非常小,同时提供了能够丢失任意两块磁盘的保障。带奇偶校验的条带化阵营的拥护者经常援引这些数字,以使管理层相信 RAID 5/6 在存储子系统中能够提供足够的“物有所值”,但其中还有其他因素在起作用。
在有关 RAID 可靠性的讨论中,有一个问题几乎被完全忽视了——而这本身就是一个太少被讨论的话题——那就是奇偶校验计算可靠性的问题。在 RAID 1 或 RAID 10 中,并不存在为创建带奇偶校验的条带而进行的“计算”。数据只是以一种稳定的方式写入。当一块磁盘发生故障时,它的搭档会接管负载,磁盘性能会略有下降,直到搭档被更换。不存在会影响现有磁盘成员的重建过程。带奇偶校验的条带则并非如此。
带奇偶校验的 RAID 阵列具有一些操作,涉及计算磁盘上有什么以及应当有什么。虽然这一计算非常简单,但它提供了一个出错的可乘之机。从理论上讲,一个采用 RAID 1 或 RAID 10 的阵列控制器若发生故障,可能会将坏数据写到磁盘内容之上,但并不存在控制器会自行对磁盘进行更改的过程,因此这种情况极不可能发生,因为除了创建镜像之外从不会有“重建”过程。
当带奇偶校验的阵列执行重建操作时,它们会执行一个复杂的过程,逐步遍历阵列的全部内容,并将缺失的数据写回到被替换的磁盘上。就其本身而言,这相对简单,本不应引起担忧。我和其他人亲眼所见的是一种略有不同的情形,它涉及由于连接器松动而失去连通性的磁盘。磁盘在服务器中放置的过程中,随着时间推移,常常会“晃动”松脱,尤其是在一个始终开机的系统中服役数年之后。
在极端情形下可能发生的是,当阵列控制器认为一块或多块磁盘相继发生故障并被重新上线进行重建时,磁盘上的好数据可能会被坏的奇偶校验数据覆盖。在这种情况下,磁盘本身并没有发生故障,也没有数据丢失。理论上所需要做的,仅仅是将这些磁盘重新插好。在热插拔系统上,磁盘重建的管理往往是基于故障磁盘的移除与替换而自动进行的。因此,这个丢失并替换磁盘的过程可能会在没有任何人为干预的情况下发生——而一个重建过程便可能就此开始。在此过程中,磁盘系统处于风险之中,而一旦同样的事件再次发生,磁盘阵列就可能基于磁盘的状态,开始将坏数据条带化地写到磁盘上,覆盖掉完好的文件系统。对于一名服务器管理员而言,目睹一套没有任何磁盘发生故障的系统因一次不必要的重建操作而丢失整个阵列,是最令人沮丧的景象之一。
从理论上讲,这种情形本不应发生,并且已有防护措施来加以防范,但一个底层磁盘控制器对于一块磁盘当前及先前状态、以及驻留在该磁盘上数据质量的判定,并不像看上去那么简单,而且差错确实有可能发生。虽然这种情形不太可能出现,但它确实会发生,并且为 RAID 5 和 RAID 6 系统增添了一种几乎无法计算的风险。除了根据一个磁盘池中阵列所能幸存的磁盘丢失数量计算出的传统风险之外,我们还必须考虑奇偶校验失败的风险。随着磁盘变得越来越可靠,奇偶校验失败这一风险事件的重要性也变得越来越大。
此外,RAID 5 和 RAID 6 的奇偶校验会因奇偶校验计算而引入系统开销,这一计算通常由专用的 RAID 硬件来处理。这一计算会在磁盘子系统中引入延迟,而该延迟无论在硬件还是软件中都因实现方式不同而差异极大,这使得无法在各个 RAID 级别之间陈述彼此对比的性能数字,因为每一种实现都将是独一无二的。
如今 RAID 选择方面可能最大的问题在于,存储效率和磁盘丢失幸存能力的衡量指标如此容易获取,反而掩盖了可靠性与性能的全局图景,因为后者那些统计数据几乎完全无从获得。指标的危险之一在于,人们会聚焦于那些容易衡量的因素,而忽视那些无法轻易衡量的因素,无论后者具有何等的潜在影响。
虽然所有现代 RAID 级别都有其用武之地,但至关重要的是要结合具体情境来考量它们,并理解风险的全部范畴。我们应当努力推动我们的行业从默认采用 RAID 5 转向默认采用 RAID 10。磁盘很廉价,而数据丢失代价高昂。
[编者注:自本文最初撰写以来的这些年里,重建操作期间 URE(不可恢复读取错误,Unrecoverable Read Errors)风险的上升,已使得奇偶校验阵列的主要风险从上文所列的那些转变为与 URE 相关的风险。]
