type
status
date
slug
summary
tags
category
icon
password
Property
Apr 15, 2023 03:22 PM
关键问题:如何得到大型、快速、可靠的磁盘
我们如何构建一个大型、快速和可靠的存储系统?关键技术是什么?不同方法之间的折中是什么?
本章将介绍
廉价冗余磁盘阵列
(Redundant Array of Inexpensive Disks),更多时候称为RAID ,这种技术使用多个磁盘一起构建更快、更大、更可靠的磁盘系统。许多不同的研究人员同时提出了使用多个磁盘来构建更好的存储系统的基本思想。从外部看,RAID 看起来像一个磁盘:一组可以读取或写入的块。在内部,RAID 是一个复杂的庞然大物,由多个磁盘、内存(包括易失性和非易失性)以及一个或多个处理器来管理系统。硬件 RAID 非常像一个计算机系统,专门用于管理一组磁盘。
与单个磁盘相比,RAID 具有许多优点
性能
。并行使用多个磁盘可以大大加快 I/O 时间。
容量
。大型数据集需要大型磁盘。
- RAID 可以提高
可靠性
。在多个磁盘上传输数据(无 RAID 技术)会使数据容易受到单个磁盘丢失的影响。通过某种形式的冗余(redundancy),RAID 可以容许损失一个磁盘并保持运行,就像没有错误一样。
透明地
(transparently),即RAID 对于主机系统看起来就像一个大磁盘。它可以简单地用 RAID替换磁盘,而不需要更换一行软件。操作系统和客户端应用程序无须修改,就可以继续运行。通过这种方式,透明极大地提高了 RAID 的可部署性
(deployability),使用户和管理员可以使用 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 的操作
- 包括 DRAM 这样的
易失性存储器
,在读取和写入时缓冲数据块
- 在某些情况下,还包括
非易失性存储器
,安全地缓冲写入。
- 甚至可能包含
专用的逻辑电路
,来执行奇偶校验计算(在某些 RAID 级别中非常有用,下面会提到)。
在很高的层面上,RAID 是一个
非常专业的计算机系统
:它有一个处理器,内存和磁盘。然而,它不是运行应用程序,而是运行专门用于操作 RAID 的软件。评估 RAID
容量
(capacity)。在给定一组 N 个磁盘的情况下,RAID 的客户端可用的容量有多少?没有冗余,答案显然是 N。
可靠性
(reliability)。给定设计允许有多少磁盘故障?根据我们的故障模型,我们只假设整个磁盘可能会故障。
性能
(performance)。性能有点难以评估,取决于磁盘阵列提供的工作负载。
3 个重要的 RAID 设计:
RAID 0
级(条带化),RAID 1
级(镜像)和 RAID4/5
级(基于奇偶校验的冗余)RAID 0 级:条带化
第一个 RAID 级别实际上不是 RAID 级别,因为没有冗余。但是,RAID 0 级(即条带化,striping)因其更为人所知,可作为性能和容量的优秀上限,所以值得了解。
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 |
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
基本思想:以轮转方式将磁盘阵列的块分布在磁盘上。这种方的目的是在对数组的连续块进行请求时,从阵列中获取最大的
并行性
(例如,在一个大的顺序读取中)。我们将同一行中的块称为条带,因此,上面的块 0、1、2 和 3 在相同的条带中。下面是同一个磁盘里放两个连续逻辑块的情况:
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 | |
0 | 2 | 4 | 6 | 大块大小 |
1 | 3 | 5 | 7 | 2 |
8 | 10 | 12 | 14 | |
9 | 11 | 13 | 15 | ㅤ |
对于逻辑块的访问,RAID 系统会根据映射定位到物理块
性能
映射是个很快的过程,这个时间可以忽略
- 顺序写:好
- 随机写:一般
- 顺序读:一般
- 随机读:一般
RAID 1 级:镜像
第一个超越条带化的 RAID 级别称为 RAID 1 级,即镜像。
对于镜像系统,只需生成系统中每个块的多个副本。每个副本应该放在一个单独的磁盘上。通过这样做,我们可以容许磁盘故障。
在一个典型的镜像系统中,我们将假设对于每个逻辑块,RAID 保留两个物理副本:
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 |
0 | 0 | 1 | 1 |
2 | 2 | 3 | 3 |
4 | 4 | 5 | 5 |
6 | 6 | 7 | 7 |
在这个例子中,磁盘 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 的基础上增加了校验冗余
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 | 磁盘 4 |
0 | 1 | 2 | 3 | P0 |
4 | 5 | 6 | 7 | P1 |
8 | 9 | 10 | 11 | P2 |
12 | 13 | 14 | 15 | P3 |
ㅤ | ㅤ | ㅤ | ㅤ | ㅤ |
任何一行中的 1 的数量必须是偶数(而不是奇数)。这是 RAID 必须保持的
不变性
(invariant),以便奇偶校验正确。要找出该列中肯定存在的值,只需读取该行中的所有其他值(包括 XOR 的奇偶校验位)并重构(reconstruct)正确的答案。这就是重构在基于异或的方案中的工作方式!还要注意如何计算重构值:只要将数据位和奇偶校验位异或,就像开始计算奇偶校验一样。
性能
写之前需要读取要写的块和校验块(如 4 和 P1,奇偶校验,不需要读其他块),修改校验后再写入这两个块,由于校验所在的磁盘为单一磁盘,相当于临界资源,对多个块的修改都需要访问该临界资源,不能并行执行
- 顺序写:一般
- 随机写:很差
- 顺序读:一般
- 随机读:一般
RAID 5 级:旋转奇偶校验
RAID 4 的优化版,将冗余分散在各个块,解决了竞争校验块的问题,提高随机写性能
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 | 磁盘 4 |
0 | 1 | 2 | 3 | P0 |
5 | 6 | 7 | P1 | 4 |
10 | 11 | P2 | 8 | 9 |
15 | P3 | 12 | 13 | 14 |
P4 | 16 | 17 | 18 | 19 |
RAID 比较:总结
RAID-0 | RAID-1 | RAID-4 | RAID-5 | |
容量 | N | N/2 | N−1 | N−1 |
可靠性 | 0 | 1(肯定) | ||
N/2(如果走运) | ||||
吞吐量 | ||||
顺序读 | N · S | (N/2) · S | (N − 1) · S | (N − 1) · S |
顺序写 | N · S | (N/2) · S | (N − 1) · S | (N − 1) · S |
随机读 | N · R | N · R | (N − 1) · R | N · R |
随机写 | N · R | (N/2) · R | 1/2 · R | N/4 · R |
延迟 | ||||
读 | T | T | T | T |
写 | T | T | 2T | 2T |
如果你严格要求
性能
而不关心可靠性,那么 RAID 0
显然是最好的。但是,如果你想要随机 I/O 的性能和可靠性
,RAID 1
是最好的,你付出的代价是容量下降
。如果容量和可靠性
是你的主要目标,那么 RAID 5
胜出,你付出的代价是小写入的性能。最后,如果你总是在按顺序执行 I/O 操作并希望最大化容量,那么 RAID 5 的也是最有意义。参考
上一篇
《Operating System:Three Easy Pieces》第三十九章 插叙:文件和目录
下一篇
《Operating System:Three Easy Pieces》第三十七章 磁盘驱动器
- 作者:GJJ
- 链接:https://blog.gaojj.cn/article/blog-69
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。