前言
内容来源:本文章为阅读OSTEP38.RAID所记录的笔记,文章链接:https://pages.cs.wisc.edu/~remzi/OSTEP/Chinese/38.pdf
本章重点介绍了廉价冗余磁盘阵列(Redundant Array of Inexpensive Disks),简称 RAID,这是一种利用多个磁盘来构建更大、更快、更可靠存储系统的技术。
RAID概述
设计目标:解决单个磁盘在速度(I/O慢)、容量(数据不断增长)和可靠性(磁盘故障)方面的限制。RAID通过并行使用多个磁盘来提高I/O性能,通过冗余来提高可靠性,并提供更大的容量。
透明性:对于上层的文件系统或操作系统来说,RAID看起来就像一个大的、单一的磁盘。这种透明性极大地提高了RAID的可部署性,允许用户无需修改现有软件即可用RAID替换单个磁盘。
内部结构:硬件RAID是一个复杂的专业计算机系统,用于管理一组磁盘,。它包括一个微控制器(运行固件)、DRAM 等易失性存储器(用于缓冲数据块)和非易失性存储器(用于安全地缓冲写入),甚至可能包含专用的逻辑电路来执行奇偶校验计算。
RAID评估与故障模型
评估维度:
- 容量:在给定 N 个磁盘的情况下,客户端可用的容量有多少
- 可靠性:容许多少磁盘故障
- 性能:取决于磁盘阵列提供的工作负载,主要评估单请求延迟和稳态吞吐量
性能工作负载:吞吐量分析通常考虑两种类型的工作负载:顺序(sequential)和随机(random)。磁盘在顺序访问下的传输速率 (S MB/s) 通常远高于随机访问下的传输速率 (R MB/s)
故障模型: RAID 旨在从磁盘故障中恢复。本章假设最简单的故障—停止(fail-stop)模型,即磁盘要么处于工作状态,要么永久丢失,并且故障很容易被检测到。
主要RAID级别介绍
RAID 0:条带化
RAID 0 级通过在系统磁盘上轮转分布数据块来实现并行性,从而提高性能和容量,但不提供冗余,在所有 RAID 级别中,RAID-0 提供了最高的容量 (N) 和最好的性能,但可靠性最差。

如上图所示,这个例子中,每个磁盘上只有1个块(每个大小为4KB),也可以像下图一样,在每个磁盘上放置两个4KB块,此时,RAID阵列的大块大小为8KB,每个条带由4个大块(32KB)组成。
大块大小会影响阵列性能:
- 较小的大块意味着许多文件将跨多个磁盘进行条带化,从而增加了对单个文件的读取和写入的并行性,但是跨多个磁盘访问块的定位时间会增加,因为整个请求的定位时间由所有驱动器上请求的最大定位时间决定
- 较大的大块减少了这种文件内的并行性,但是减少了磁盘访问块的定位时间,例如,如果一个文件放在一个块中并放置在单个磁盘上,则访问它时发生的定位时间将只是单个磁盘的定位时间

RAID 1:镜像
对于镜像系统,我们只需生成系统中每个块的多个副本。当然,每个副本应该放在一个单独的磁盘上。通过这样做,我们可以容许磁盘故障。

从镜像阵列读取块时,RAID有一个选择:它可以读取任一副本。例如,如果对RAID发出逻辑块5的读取,则可以自由地从磁盘2或磁盘3读取它。但是,在写入块时,不存在这样的选择:RAID 必须更新两个副本的数据,以保持可靠性。但请注意,这些写入可以并行进行。例如,对逻辑块5的写入可以同时在磁盘2和3上进行。
RAID 4:奇偶检验
RAID 4 为每一条数据(一个条带)添加一个额外的奇偶校验块,用于存储冗余信息,奇偶校验通常使用简单的异或(XOR)函数进行计算。在数据块中的每一位上执行按位 XOR 运算,并将结果放入奇偶校验块的相应位置。RAID 4 允许容忍 1 个磁盘故障。如果丢失了一个磁盘,RAID 可以通过读取该条带中所有其他块(包括奇偶校验块)并进行异或运算来重构(reconstruct)丢失的数据。

RAID5:旋转校验
为解决小写入问题(至少部分解决),推出了旋转奇偶校验,核心原理和RAID4相同,如下

RAID性能分析
顺序和随机工作负载会导致磁盘的性能特征差异很大,对于顺序访问,磁盘以高效的模式运行,花费很少的时间寻道并等待旋转,大部分时间在传输数据;对于随机访问则恰恰相反,大部分时间花在寻道和等待旋转上。我们在下面的性能分析中,假设磁盘可以在连续工作负载下以S MB/s传输数据,并且在随机工作负载下以R MB/s传输数据
RAID 0
条带化的性能通常很好,从延迟角度来看,单块请求的延迟应该与单个磁盘的延迟几乎相同,从稳态吞吐量的角度来看,我们期望获得系统的全部带宽。因此吞吐量等于N(磁盘数量)乘以S(单个磁盘的顺序带宽)。对于大量随机的I/O,我们可以再次使用所有磁盘,从而获得N×R MB/s
RAID 1
从容量的角度来看,RAID-1价格昂贵。在镜像级别=2的情况下,我们只能获得峰值有用容量的一半。因此,对于N个磁盘,镜像的有用容量为N/2
从可靠性的角度来看,RAID 1可以容许任何一个磁盘的故障,比如在表38.3中,磁盘0和磁盘2都故障了,但没有数据丢失,更一般地说RAID 1最多可以容许N/2个磁盘故障,不过这取决于哪些磁盘故障,故存在一些不确定性,因此,镜像对于处于单个故障来说才是比较好的
最后分析性能:
- 从单个读取请求的延迟角度来看,与RAID 0是相同的,从单个写入来看,由于需要完成两次物理写入,即使这两次写入时并行发生的,还是遭遇两个写入中最差的寻道和旋转延迟,因此略高于RAID 0的延迟。
- 现在分析稳态吞吐量,首先是顺序负载,对于写入,例如在表38.3我想写入逻辑块0,RAID在内部会将其同时写入磁盘0和磁盘1,因此最大带宽是N×S/2;对于读取,虽然读取只需要一个副本,但由于数据在镜像对之间进行条带化,每个磁盘实际上只接收到每隔一个块的请求。当磁盘在跳过的块上旋转时,它不会为客户提供有用的带宽,因此每个磁盘也是N×S/2。对于随机负载,随机读取是镜像RAID的最佳案例。在这种情况下,我们可以在所有磁盘上分配读取数据,从而获得完整的可用带宽。因此,对于随机读取,RAID-1提供N×R MB/S,写入依然需要写入两份,故N×R/2 MB/S
RAID 4
从容量的角度来看,RAID-4 使用1个磁盘作为它所保 护的每组磁盘的奇偶校验信息。因此,RAID组的有用容量是(N−1)。可靠性也很容易理解:RAID-4容许1个磁盘故障,不容许更多。如果丢失多个磁盘,则无法重建丢失的数据。
最后分析性能:
- 顺序读取:可以利用除奇偶校验磁盘以外的所有磁盘,因此可提供(N−1)×S MB/s(简单情况)的峰值有效带宽
- 顺序写入:在这种情况下,如表38.4所示,RAID可以简单计算P0新值(通过在块0、1、2、3上执行XOR),然后将所有块(包括奇偶块)并行写入上面的5个磁盘,因此RAID4是可以支持全条带顺序写入的,有效带宽为(N-1)×S MB/s
- 随机读取:一组1块的随机读取将分布在系统的数据磁盘上,而不是奇偶校验磁盘上。因此,有效性能是:(N−1)×R MB/s
- 随机写入:我们希望在上面的例子中覆盖写入块1。我们可以继续并覆盖它,但这会给我们带来一个问题:奇偶校验块P0将不再准确地反映条带的正确奇偶校验值。在这个例子中,P0也必须更新。我们如何正确并有效地更新它?第一种称为加法奇偶校验,为了计算新奇偶校验块的值,并行读取条带中所有其他数据块(在本例中为块 0、2 和 3),并与新块(1)进行异或,结果是新的校验块。这种技术的问题在于它随磁盘数量而变化,因此在较大的RAID中,需要大量的读取来计算奇偶校验。因此,产生了减法奇偶校验方法,这种情况下,只需要通过将新数据、旧数据和旧校验码三者异或就可以得到新的校验码。假设我们使用减法奇偶校验方法,考虑这样一个场景:几乎同时向 RAID-4 提交 2 个小的请求,写入块 4 和块 13(如表38.4所示),由于这两个请求都必须读取 4 和 13 的奇偶校验块,因此,即使可以并行访问数据磁盘,奇偶校验磁盘也不会实现任何并行,我们将它称为基于奇偶校验的 RAID 的小写入问题。综上,在随机写入情况下,有效带宽仅仅有R/2 MB/s
RAID 5
RAID-5 的大部分分析与 RAID-4 相同。例如,两级的有效容量和容错能力是相同的。 顺序读写性能也是如此。单个请求(无论是读还是写)的延迟也与 RAID-4 相同。
RAID-5 的随机写入性能明显提高,因为它允许跨请求进行并行处理。想象一下写入块 1 和写入块 10。这将变成对磁盘1和磁盘4(对于块1及其奇偶校验)的请求以及对磁盘0和磁盘2(对于块10及其奇偶校验)的请求。因此,它们可以并行进行。事实上,我们通常可以假设,如果有大量的随机请求,我们将能够保持所有磁盘均匀忙碌。如果是这样的话,那么我们用于小写 入的总带宽将是 N×R/4 MB/S
RAID总结

如果对可靠性零要求,仅追求极致速度:RAID 0
如果需要可靠性且看重随机 I/O 性能(尤其是读取),但容量预算充足:RAID 1
如果容量和可靠性是主要目标,且可接受小写入性能损失:RAID 5