比较 RAID 10 与 RAID 01
这两种 RAID 级别常常引起极大的混淆,部分原因是它们被错误地互换使用,而往往只是因为人们对它们理解不足。
首先应当指出,两者都可以带加号或不带加号书写:RAID 10 即 RAID 1+0,RAID 01 即 RAID 0+1。奇怪的是,RAID 10 几乎从不带加号书写,而 RAID 01 几乎从不省略加号书写。存储工程师普遍认为加号从不应被使用,因为它是多余的。
这两种 RAID 级别都是“复合”级别,由两种不同的简单 RAID 类型组合而成。两者都是基于镜像、无奇偶校验的复合或嵌套 RAID。两者具有本质上完全相同的性能特征——开销和延迟很小,读取速度为 NX,写入速度为 (NX)/2,其中 N 为阵列中的驱动器数量,X 为阵列中单个驱动器的性能。
区分这两种 RAID 级别的关键在于它们如何处理磁盘故障。简要概述是:在几乎所有合理的场景下,RAID 10 都极其安全。然而,随着阵列规模的增大,RAID 01 会迅速变得相当危险。
在 RAID 10 中,任何单个驱动器的丢失都只会导致 RAID 0 条带内部某一个 RAID 1 组的降级。条带层面不会出现降级,只有那一个单独的 RAID 1 镜像会降级。所有其他镜像均不受影响。这意味着,我们唯一增加的风险是那一个驱动器现在没有冗余地运行、得不到保护。所有其他镜像组仍然保有完整的保护。因此我们暴露的只是一个未受保护的驱动器——就像你在台式机中会预期的那样。
在已降级的 RAID 10 中进行阵列修复是可能的最快修复场景。更换故障驱动器后,所发生的只是该单个镜像被重建——这是一个简单的复制操作,发生在 RAID 1 层、位于 RAID 0 条带之下。这意味着,如果整个阵列处于空闲状态,镜像过程可以全速进行,而整个阵列甚至毫不知情。磁盘到磁盘的镜像极其快速、高效且可靠。这是理想的恢复场景。即使多个镜像同时降级并同时修复,也不会产生额外影响,因为一个镜像的重建不会影响其他镜像。RAID 10 的风险和修复影响都具有极佳的扩展性。
另一方面,RAID 01 在丢失单个驱动器时会立即丢失整个 RAID 0 条带。在典型的 RAID 01 镜像中有两个 RAID 0 条带。这意味着整个阵列的一半已经失效。如果我们谈论的是一个八驱动器的 RAID 01 阵列,那么单个驱动器的故障会使四个驱动器瞬间无法使用并实际上失效(硬件无需更换,但这些驱动器上的数据已经过时,必须重建才能可用)。因此从风险角度看,我们可以将其视为整个条带的故障。
单个磁盘故障后所剩下的,只是一个单独的、未受保护的 RAID 0 条带。这比同等的 RAID 10 故障危险得多,因为不再是只有一个孤立的硬盘处于风险之中,而是现在至少有两个、甚至可能有更多磁盘处于风险之中,而每一个暴露于此风险的驱动器都会大幅放大风险。
举例来说,在可能的最小 RAID 10 或 01 阵列中我们有四个驱动器。在 RAID 10 中,如果一个驱动器发生故障,我们的风险在于其配对的另一个驱动器在我们重建阵列之前也发生故障。我们只需担心那一个驱动器,RAID 10 组中所有其他驱动器仍然受到保护且安全。只有这一个值得担忧。在 RAID 01 中,当第一个驱动器发生故障时,它在其 RAID 0 组中的配对驱动器会瞬间变得毫无用处并实际上失效,因为它在阵列中已无法运行。所剩下的是两个没有任何保护、仅运行 RAID 0 的驱动器,于是我们承担了与 RAID 10 相同的风险,但是两倍。每个驱动器都承担着此前那一个驱动器所承担的相同风险。这使得我们的风险在最好情况下也要高得多。
但为了举一个更具戏剧性的例子,让我们看看一个大型的二十四驱动器 RAID 10 与 RAID 01 阵列。同样,在 RAID 10 中,如果一个驱动器发生故障,除了它的那一个配对驱动器之外,所有其他驱动器仍然受到保护。阵列规模的增加几乎没有带来额外风险。我们仍然只担心那一个孤立驱动器的故障。与此相对,RAID 01 则会有其中一个 RAID 0 阵列失效,一个驱动器的故障就会一次性带走十二块磁盘,使另外十二块磁盘在没有任何形式保护的 RAID 0 中运行。显然,十二个驱动器中有一个发生故障的几率,要远远高于单个驱动器发生故障的几率。
这还不是全部情况。单个 RAID 10 磁盘的恢复很快,它是从一个驱动器到另一个驱动器的直接复制操作。它占用的资源极少,所需时间仅为单个驱动器完整地读取并写入自身所需的时间。RAID 01 就没有这么幸运了。与只重建整个阵列的一小部分、且该部分不会随阵列增大而增长的 RAID 10 不同——四驱动器 RAID 10 与四十驱动器 RAID 10 在故障后恢复的时间是相同的——RAID 01 必须重建整个父阵列的一整半。在四驱动器阵列的情况下,这是 RAID 10 重建工作量的两倍;而在二十四驱动器阵列的情况下,则是十二倍的重建工作量。因此 RAID 01 的重建执行时间更长,而在此期间又承受着显著更高的风险。
有一个相当顽固的误区认为 RAID 01 和 RAID 10 具有不同的性能特征,但事实并非如此。两者都使用普通的条带化和镜像,这实际上是几乎无开销的操作,几乎不需要任何处理开销。两者都能从连接到它们的每个磁盘设备获得完整的读取性能,而每一种都会因镜像操作而损失一半的写入性能(假设是双向镜像,这也是两种阵列类型唯一常见的用法)。根本没有任何因素能使 RAID 01 或 RAID 10 比另一种更快或更慢。两者都极其快速。
由于这两种阵列类型的特征,显而易见,在单个阵列控制器内部,两者之中唯一应当存在的类型是 RAID 10。RAID 01 是不必要地危险,且不带来任何优势。它们使用相同的容量开销,具有相同的性能,实现成本相同,但 RAID 10 的可靠性要高得多。
那么 RAID 01 为何还会存在呢?部分是出于无知或混淆而存在。许多人在实现自己的复合 RAID 阵列时选择 RAID 01,是因为他们听过它更快的误区,并且如同对待 RAID 的通常情形那样,没有去探究它为何会更快,也忘了去考察它的可靠性及其他因素。RAID 01 在本地阵列上真正的实现,只是出于失误。
然而,当我们把 RAID 带到网络层时,就有了新的因素需要考虑,RAID 01 可能变得重要,它那罕见的表亲 RAID 61 也是如此。我们通过网络 RAID 记法来标注 RAID 的本地层和网络层各自存在于何处。因此在此情况下,我们指的是 RAID 0(1) 或 RAID 6(1)。括号表示 RAID 1 镜像——即 RAID 栈中“最高”的部分——是通过网络连接实现的,而非位于本地 RAID 控制器之上。
这在 RAID 0(1) 中会是什么样子呢?如果你有两台服务器,每台都有一个标准的 RAID 0 阵列,并且你希望它们彼此同步以作为单一、可靠的阵列运行,你可以使用诸如 DRBD(在 Linux 上)或 HAST(在 FreeBSD 上)这样的技术,用每台服务器上的本地存储构建一个网络 RAID 1 阵列。显然这有很大的性能开销,因为 RAID 1 阵列必须通过高延迟、低带宽的局域网连接保持同步。RAID 0(1) 就是这种配置的记法。如果每个本地 RAID 0 阵列都被替换为更可靠的 RAID 6,我们就会将整个配置写作 RAID 6(1)。
为什么当 RAID 01 处于网络之上时我们接受它的风险,而在本地时却不接受呢?这是因为网络链路的本质。在 RAID 10 的情况下,我们依赖 RAID 栈中底层的 RAID 1 部分来提供保护,而 RAID 0 位于其上。如果我们在网络层级复制这种结构,例如 RAID 1(0),那么最终得到的是每个主机拥有单个镜像,仅代表阵列数据的一部分。如果阵列中任何节点发生任何状况,或者网络连接发生故障,阵列就会立即被摧毁,每个节点都将只剩下毫无用处、不完整的数据。正是节点故障的高风险本质以及网络连接层面的风险,使得网络环境下的 RAID 决策极为不同。这本身就成为一个复杂的主题。
总而言之,在使用普通 RAID 阵列控制器,或使用本地存储和软件 RAID 时,请专一地使用 RAID 10,绝不要使用 RAID 01。
