【2021/7/19更新】【梳理】简明操作系统原理 附录五 RAID(docx)

配套教材:
Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau Andrea C. Arpaci-Dusseau Peter Reiher
参考书目:
1、计算机操作系统(第4版) 汤小丹 梁红兵 哲凤屏 汤子瀛 编著 西安电子科技大学出版社

在线阅读:
http://pages.cs.wisc.edu/~remzi/OSTEP/
University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的
————————————————————————————————————————
这是专业必修课《操作系统原理》的复习指引。
需要掌握的概念在文档中以蓝色标识,并用可读性更好的字体显示 Linux 命令和代码。代码部分语法高亮。
文档下载地址:
链接:https://pan.baidu.com/s/1-s76n4y0wutH08sHkmk-Qw
提取码:0000

附录五 RAID

我们总是希望硬盘能够更大、更快。一张4K的BD(蓝光光盘),最大容量至少为66 GB;有的盘还更大。把这些电影抓到硬盘里,只需要几十部,一块5 TB的移动硬盘就差不多要满了;也许你还下载了很多数字音乐,它们甚至是Hi-Res或DSD规格的;你还在B站或者YouTube下载了很多很有趣的视频;你还会拿相机或摄像机拍摄很多高质量的照片和录像;你写了很多小说和歌曲,画了很多漫画……这些无不对存储容量、速率和可靠性提出了高要求。
廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks,RAID)一词,由UC Berkeley的一组研究人员在1980年代末引入。这个时间前后,许多研究者也不约而同地产生了相似的思想。
从外部看,RAID是一块磁盘,可以作为整体进行读写。但RAID实际上具有多个磁盘,还可以有内存,以及专门管理这些磁盘的处理器。硬RAID已经很接近一个计算机系统,只不过其主要任务是管理磁盘。

为计算机添加新的功能时,应该尽量做到透明,也就是说:基本不用对已有的部分做出多少改动,就可以让新功能正常运行。RAID是一个非常好的例子,因为你基本上完全可以把RAID当作一大块磁盘来用,在操作系统层面上几乎不需要进行什么更改。把一块磁盘换成一个RAID,不用改动一行代码;在RAID安装完毕后,原有的操作系统和应用程序可以直接继续运行。透明增强了硬件的可部署性(deployability),用户无需担心软件不与新硬件兼容。

当文件系统向RAID发起一个(逻辑)I / O请求时,RAID本身要确定,需要访问的内容位于哪些磁盘,然后向相应的磁盘发起(物理)I / O。RAID的实现是很复杂的:微控制器需要对磁盘正确操作;DRAM负责暂存常用的数据块;有时还要对数据进行校验。

评价一个RAID的常见指标有:
(1)容量。同样容量的磁盘,实现不同的RAID后,剩余的可用容量是不同的。
(2)可靠性。这个RAID系统最多能容忍多少磁盘同时损坏?
(3)性能。性能的重要性就不用多说了。

RAID 0将数据分散存储在各个磁盘上。假设将一个文件分成很多份,由4块硬盘组建RAID 0,那么它的分布是这样的:

可以看出,数据按照RR(round-robin)的方式分配到各个磁盘。在上表中,横跨一整行的每部分数据称为一个条带(stripe)。RAID将数据按照块(chunk)划分,同一块被写入一个磁盘。如果将块大小(chunk size)扩大两倍,数据的分布就变成这样:

块大小为2的整数次方倍,一般为32 KB或64 KB,其它值亦可。
块大小是影响RAID性能的重要因素。块大小较小时,文件被打散成更多份。于是,在访问单个文件的时候,需要访问的部分具有更大的几率位于更多的磁盘,使得并发度更高。但是,如果要在文件中定位,也需要更多的时间。块大小较大时,情况相反:访问单个文件的时候,需要访问的部分具有更大的几率位于更少的磁盘,甚至都位于同一个磁盘,使得并发度更低,乃至和单个磁盘的读写性能没有区别;但如果要在文件中定位,则需要更少的时间。块大小需要根据应用场景和硬盘本身的特点来决定,不存在一个普遍适用的值。
下面我们从刚才的三个指标入手,来评估RAID 0。
在容量上,RAID 0做得很完美:RAID 0的总容量是各个硬盘的容量之和。
在性能上,RAID 0也很优秀:RAID 0的读写速率,最高可以达到各个磁盘的读写速率之和。当然,数据不大于块大小的时候,它只能落在一个磁盘上,读写性能就没有提升了。使用不同容量的磁盘来组成 RAID-0时,由于数据是一直等量依序放置到不同磁盘中,当小容量的磁盘用完后,所有的数据都将被写入到剩余的磁盘去。此时的性能也会变差。
但是,RAID 0不具备任何冗余。如果组成RAID 0中的任何一块磁盘损坏,基本就意味着存储在这个阵列上的全部数据都丢失了。因为所有文件都是被尽可能高度分散并存储的,只有在非损坏磁盘上的那些不大于块大小的小文件能够逃过一劫。
在读写的时候,各块硬盘的工作状态不一定相同,有的盘可能恰好在这时具有更大的寻道时间和旋转延迟。这部分延迟会导致RAID的实际读写速率要比理论上慢一点。

RAID 1将数据镜像(mirror)存储,每个磁盘都是另一块磁盘的镜像:

当然,这只是其中一种数据组织方式。你还可以在RAID 1的基础上将数据条带化存储。RAID 10(RAID 1+0)先将数据复制为镜像,再进行条带存储;而RAID 01(RAID 0+1)先条带化,再镜像化。
读取数据时,RAID 1可以从多个磁盘镜像中读取;而写入的时候,必须向每个镜像盘统一写入相同内容,以确保冗余性。因此,RAID 1能提升读取性能,最大读取速率为各个磁盘的读取速率之和,但不能提升写入性能。在顺序写入时,如果组建RAID 1的磁盘的(顺序或随机)写入性能存在差异,则写入速率受到写入性能最差的磁盘的影响。使用机械硬盘组建RAID 1时,若进行随机读取,则比较容易接近性能峰值;若进行顺序读取,则在将读取任务平分给各个磁盘时,磁盘经常需要跳过不属于自己负责的那些块(等待它们旋转并远离磁头),使得读写速率明显低于各个磁盘的读写速率之和。使用固态硬盘(参见第15章)时,不存在此问题。
由于RAID 1是完全的镜像,因此可用容量为总容量除以副本数量。一般地,同样的数据只存储2份;只有十分关键的数据,才会启用多个镜像存储。以2份副本为例,RAID 1最多可以容忍一半的盘损坏。当然,前提是没有任何2块互为镜像的盘同时损坏。RAID 1最少可以容忍1块磁盘损坏。点背的时候,虽然只坏了2块盘,但坏的正好是互为镜像的盘,那这部分数据就确确实实丢失了。

RAID 4则带有奇偶校验。相比完全镜像的RAID 1,RAID 4存储同样内容需要花费的磁盘数量少得多,但冗余度就没有那么高。

数据依然是条带分布的,每个条带都配有专门的一块磁盘作为校验盘。
校验位的数据是通过奇偶校验得出的。如果有n个二进制位参与奇偶校验,则从左往右共做(n-1)次异或运算。由异或的性质得:参与运算的位中,若1的个数是奇数,则校验位为1;若1的个数是偶数,则校验位为0。校验时,每块磁盘对应块中的对应位一同进行异或,结果写在校验盘中对应的位。
下图以4块盘各自的位于磁盘最前面的一个数据块的前4位为例。在4磁盘1校验盘的结构下,可以看出数据块是在各个非校验磁盘中交错分布的;图中展示的四个数据块的第0、1、2、3位分别有3、1、1、2个1,校验位为1、1、1、0。

在非校验磁盘中,数据的组织方式与RAID 0一样。而校验盘不负责数据的存储,因此RAID 4的可用容量是非校验磁盘的总容量之和。如果校验盘损坏,则可以通过非校验盘重新计算校验结果,恢复校验盘中的数据。RAID 4最多允许非校验盘中损坏1块,这1块的数据可以由其它非校验盘和校验盘中的信息重构出来:校验位描述了参与异或运算的1是奇数个还是偶数个。而参与运算的位数又是已知的,所以可以直接推断出缺失的数据。但如果非校验盘损坏了超过1块,就无法重构数据了。
下面分析RAID 4的性能。对顺序读取,其情况与RAID 0类似,最高速率为各个非校验磁盘的读取速率之和。但是如果要读取的内容正好都落在同一块磁盘,性能就没有提升。在顺序写入的时候,写入的同时需要修改相应的校验位,但位运算比磁盘的机械动作快得多,而且对校验盘的读写与对非校验盘的读写相对独立,不会拖慢数据读写,所以最高速率也能达到各个非校验盘的写入速率之和。
在随机读取时,其性能也与RAID 0类似,最高速率为各个非校验磁盘的读取速率之和。当然,数据不大于块大小的时候,它就只能落在一个磁盘上,读写性能就没有提升了。但在随机写入时,情况就比较棘手了:由于写入数据较小,因此有很多或者全部需要进行写入的条带中,不是所有的位置都会被写入。但写入新数据可能会导致校验位改变,因此在写入某一条带上的块时,需要一并读取同一条带上其它数据块的未修改数据,并重新计算新的校验码。当非校验盘的块数很多时,造成的性能影响也非常大。
有一种方式可以减小这种性能影响。在写入一个数据块之前,把这一块的旧数据读出来,然后比对各个位要写入的数据是否与这一位的原数据不同。如果不同,就意味着对应的校验位要改变。否则,保持不变。基本上,改动数据后,校验块里都是有位要改变的,也就是整个校验块要写入新值。于是,写入一个块的数据,在非校验盘上需要的操作就是一次读和一次写。因此,随机写入的性能显著低于单盘的随机写入性能。如果使用写入速率不同的磁盘组建RAID 4,自然也会受到速率更慢的磁盘的影响。

为了(至少部分)解决奇偶校验式RAID的小写入问题(small-write problem),RAID 5应运而生。RAID 5的校验数据的分布是这样的:

RAID 5的很多地方和RAID 4很像。RAID 5同样只允许1块盘失效,顺序读写性能和RAID 4是一样的。RAID 5的随机读取性能要好一点,因为在校验数据占有的比例相同的情况下,可以多用一块盘进行读写(校验数据不再由专门的一块不参与有效数据的读写的磁盘进行存储)。如果随机请求非常多,则可以利用到所有的磁盘,提升更明显。相比RAID 4,RAID 5的随机写入性能的增长令人印象深刻。RAID 5的随机写操作可以并发。如果使用相同的磁盘构建RAID 5,其随机写入的速率是:单盘随机写入性能×磁盘块数÷4,除以因子4是因为:奇偶校验RAID的每个写操作实际上都要进行4个操作:一次是写入数据本身,一次是读写入位置的旧数据,一次是读所属的校验块,一次是写入新的校验块。
RAID-5基本上与RAID-4相同,而在少数情况下更好,所以它几乎完全取代了市场上的RAID-4。唯一的例外是已知总是执行顺序写入的场景,这时基本不需要考虑小写入问题。在这些情况下,有时会使用RAID-4,因为它的构建稍微简单一些。

还有其它级别的RAID,比如RAID 2、RAID 3和RAID 6等。RAID 6最多允许2块盘损坏。在RAID中的磁盘发生故障时,RAID控制器必须立刻探测到,并发出告警。用户接到警报后,需要及时进行重建。有时候,RAID系统会有1个热备盘(hot spare disk)。如果RAID里的其中1块盘坏了,这个热备盘就会顶替RAID里的那个坏盘,同时把坏盘上面的数据原样做出来,并存储在热备盘中。存储完毕后,RAID系统允许同时损坏的盘数就多了1块。此外,还可以用软件方式实现RAID。虽然这更便宜,但可能会面临一致更新(consistent-update)等问题。

RAID通过如下的公式来定位数据块所在的磁盘和盘内位置(设数据块的逻辑块号为A):

Disk = A % number_of_disks
Offset = A / number_of_disks

设想在多个磁盘写入数据的过程中突然断电、系统出现致命故障的情况,这会导致数据的不正确(包括不同副本的不一致)。为了解决这个问题,RAID硬件中一般都有一小块非易失性RAM(可以通过单独的电池供电实现令RAM不断电)。上面保存了写入日志。在系统从失败中恢复后,根据保存的写入日志,可以继续写操作,直到数据重新变得一致。

猜你喜欢

转载自blog.csdn.net/COFACTOR/article/details/118914291