《Operating Systems: Three Easy Pieces》学习笔记(三十) 廉价冗余磁盘阵列(RAID)
简介
本章将介绍廉价冗余磁盘阵列
(Redundant Array of Inexpensive Disks),更多时候称为 RAID
,这种技术使用多个磁盘一起构建更快、更大、更可靠的磁盘系统。
优点:
- 性能。
并行
使用多个磁盘可以大大加快 I/O 时间。 - 容量。将多个磁盘
合并
为逻辑上的一个单磁盘。 - 可靠性。在多个磁盘上传输数据(无 RAID 技术)会使数据容易受到单个磁盘丢失的影响。通过某种形式的
冗余
(redundancy),RAID 可以容许损失一个磁盘并保持运行,就像没有错误一样。 - 透明。RAID 接口和普通硬盘接口相同,无需修改已有软件即可迁移。
接口和 RAID 内部
对于文件系统,RAID 看起来像是一个很大的、快速的、并且可靠的磁盘。就像使用单个磁盘一样,它将自己展现为线性的块数组
,每个块都可以由文件系统(或其他客户端)读取或写入。
RAID 内部包括一个微控制器
,运行固件以指导 RAID 的操作。 它还包括 DRAM
这样的易失性存储器,在读取和写入时缓冲
数据块。在某些情况下,还包括非易失性存储器,安全地缓冲写入。它甚至可能包含专用的逻辑电路
,来执行奇偶校验
评估 RAID
容量
(capacity)。在给定一组 N 个磁盘的情况下,RAID 的客户端可用的容量有多少?没有冗余,答案显然是 N。可靠性
(reliability)。给定设计允许有多少磁盘故障?根据我们的故障模型,我们只假设整个磁盘可能会故障。性能
(performance)。性能有点难以评估,取决于磁盘阵列提供的工作负载。
3 个重要的 RAID 设计:RAID 0
级(条带化),RAID 1
级(镜像)和 RAID4/5
级(基于奇偶校验的冗余)
RAID 0 级:条带化
无冗余,高性能,低可靠
下面是在不同磁盘里依次放连续逻辑块的情况:
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 |
---|---|---|---|
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
表格中的格子表示物理块,序号表示逻辑块序号,比如写入 4 个连续块(如 0,1,2,3)的数据,就能同时
并发
的往 4 个磁盘写入,写入速度提升
下面是同一个磁盘里放两个连续逻辑块的情况:
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 | |
---|---|---|---|---|
0 | 2 | 4 | 6 | 大块大小 |
1 | 3 | 5 | 7 | 2 |
8 | 10 | 12 | 14 | |
9 | 11 | 13 | 15 |
对于逻辑块的访问,RAID 系统会根据映射定位到物理块,这个映射关系还是比较简单的,上面两个例子看也看得出来
性能
映射是个很快的过程,这个时间可以忽略
- 顺序写:好
- 随机写:一般
- 顺序读:一般
- 随机读:一般
RAID 1 级:镜像
冗余,低性能,高可靠
示例,两个磁盘存同一份数据:
磁盘 0 | 磁盘 1 | 磁盘 2 | 磁盘 3 |
---|---|---|---|
0 | 0 | 1 | 1 |
2 | 2 | 3 | 3 |
4 | 4 | 5 | 5 |
6 | 6 | 7 | 7 |
写入时需要同时向两个磁盘写入相同的数据,读取时可以从两个磁盘中的任意一个磁盘中读取
性能
虽然并行写入,但受限于最慢的那块硬盘速度。且占用两个硬盘的带宽,影响其他写入
- 顺序写:差
- 随机写:差
- 顺序读:一般
- 随机读:一般
RAID 4 级:通过奇偶校验节省空间
在 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 |
可以使用奇偶校验实现数据恢复
性能
写之前需要读取要写的块和校验块(如 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 的也是最有意义。