← 返回首页
读书笔记

《Operating System:Three Easy Pieces》第三十八章 廉价冗余磁盘阵列(RAID)

💡
关键问题:如何得到大型、快速、可靠的磁盘 我们如何构建一个大型、快速和可靠的存储系统?关键技术是什么?不同方法之间的折中是什么?

本章将介绍廉价冗余磁盘阵列(Redundant Array of Inexpensive Disks),更多时候称为RAID ,这种技术使用多个磁盘一起构建更快、更大、更可靠的磁盘系统。许多不同的研究人员同时提出了使用多个磁盘来构建更好的存储系统的基本思想。

从外部看,RAID 看起来像一个磁盘:一组可以读取或写入的块。在内部,RAID 是一个复杂的庞然大物,由多个磁盘、内存(包括易失性和非易失性)以及一个或多个处理器来管理系统。硬件 RAID 非常像一个计算机系统,专门用于管理一组磁盘。

与单个磁盘相比,RAID 具有许多优点

我们现在来讨论一些 RAID 的重要方面。从接口、故障模型开始,然后讨论如何在 3个重要的方面评估 RAID 设计:容量、可靠性和性能。然后我们讨论一些对 RAID 设计和实现很重要的其他问题。

接口和 RAID 内部

对于上面的文件系统,RAID 看起来像是一个很大的、(我们希望是)快速的、并且(希望是)可靠的磁盘。就像使用单个磁盘一样,它将自己展现为线性的块数组,每个块都可以由文件系统(或其他客户端)读取或写入。

当文件系统向 RAID 发出逻辑 I/O 请求时,RAID 内部必须计算要访问的磁盘(或多个磁盘)以完成请求,然后发出一个或多个物理 I/O 来执行此操作。这些物理 I/O 的确切性质取决于 RAID 级别。

举一个简单的例子,考虑一个 RAID,它保留每个块的两个副本(每个都在一个单独的磁盘上)。当写入这种镜像(mirrored)RAID系统时,RAID 必须为它发出的每一个逻辑 I/O 执行两个物理 I/O。

RAID 系统通常构建为单独的硬件盒,并通过标准连接(例如,SCSI 或 SATA)接入主机。RAID在内部相当复杂:

在很高的层面上,RAID 是一个非常专业的计算机系统:它有一个处理器,内存和磁盘。然而,它不是运行应用程序,而是运行专门用于操作 RAID 的软件。

评估 RAID

3 个重要的 RAID 设计:RAID 0 级(条带化),RAID 1 级(镜像)和 RAID4/5 级(基于奇偶校验的冗余)

RAID 0 级:条带化

第一个 RAID 级别实际上不是 RAID 级别,因为没有冗余。但是,RAID 0 级(即条带化,striping)因其更为人所知,可作为性能和容量的优秀上限,所以值得了解。

基本思想:以轮转方式将磁盘阵列的块分布在磁盘上。这种方的目的是在对数组的连续块进行请求时,从阵列中获取最大的并行性(例如,在一个大的顺序读取中)。我们将同一行中的块称为条带,因此,上面的块 0、1、2 和 3 在相同的条带中。

下面是同一个磁盘里放两个连续逻辑块的情况:

对于逻辑块的访问,RAID 系统会根据映射定位到物理块

性能

映射是个很快的过程,这个时间可以忽略

RAID 1 级:镜像

第一个超越条带化的 RAID 级别称为 RAID 1 级,即镜像。

对于镜像系统,只需生成系统中每个块的多个副本。每个副本应该放在一个单独的磁盘上。通过这样做,我们可以容许磁盘故障。 在一个典型的镜像系统中,我们将假设对于每个逻辑块,RAID 保留两个物理副本:

在这个例子中,磁盘 0 和磁盘 1 具有相同的内容,而磁盘 2 和磁盘 3 也具有相同的内容。数据在这些镜像对之间条带化。实际上,你可能已经注意到有多种不同的方法可以在磁盘上放置块副本。上面的安排是常见的安排,有时称为 RAID-10(或 RAID 1+0),因为它使用镜像对(RAID-1),然后在其上使用条带化(RAID-0)。

另一种常见安排是 RAID-01(或 RAID 0+1),它包含两个大型条带化(RAID-0)阵列,然后是镜像(RAID-1)。目前,我们的讨论只是假设上面布局的镜像。

从镜像阵列读取块时,RAID 可以读取任一副本。

在写入块时,RAID 必须更新两个副本的数据,以保持可靠性。

性能

虽然并行写入,但受限于最慢的那块硬盘速度。且占用两个硬盘的带宽,影响其他写入

RAID 4 级:通过奇偶校验节省空间

基于奇偶校验的方法试图使用较少的容量,从而克服由镜像系统付出的巨大空间损失。不过,这样 做的代价是——性能。 这是 5 个磁盘的 RAID-4 系统的例子(见表 38.4)。对于每一条数据,我们都添加了一个奇偶校验(parity)块,用于存储该条块的冗余信息。例如,奇偶校验块 P1 具有从块 4、5、6 和 7 计算出的冗余信息。

在 RAID 0 的基础上增加了校验冗余

任何一行中的 1 的数量必须是偶数(而不是奇数)。这是 RAID 必须保持的不变性(invariant),以便奇偶校验正确。

要找出该列中肯定存在的值,只需读取该行中的所有其他值(包括 XOR 的奇偶校验位)并重构(reconstruct)正确的答案。这就是重构在基于异或的方案中的工作方式!还要注意如何计算重构值:只要将数据位和奇偶校验位异或,就像开始计算奇偶校验一样。

性能

写之前需要读取要写的块和校验块(如 4 和 P1,奇偶校验,不需要读其他块),修改校验后再写入这两个块,由于校验所在的磁盘为单一磁盘,相当于临界资源,对多个块的修改都需要访问该临界资源,不能并行执行

RAID 5 级:旋转奇偶校验

RAID 4 的优化版,将冗余分散在各个块,解决了竞争校验块的问题,提高随机写性能

RAID 比较:总结

如果你严格要求性能而不关心可靠性,那么 RAID 0 显然是最好的。但是,如果你想要随机 I/O 的性能和可靠性RAID 1 是最好的,你付出的代价是容量下降。如果容量和可靠性是你的主要目标,那么 RAID 5 胜出,你付出的代价是小写入的性能。最后,如果你总是在按顺序执行 I/O 操作并希望最大化容量,那么 RAID 5 的也是最有意义。

参考

本文由 GJJ 创作,内容来源于 Notion 数据库,随时可在 Notion 中编辑更新。 本站由 DeepSeek-v4-flash 辅助构建,项目参考 NotionNext

← 返回首页
61
文章
6
标签
3
分类
962
运行天数