RAID(Redundant Arrays of Inexpensive Disks)翻译过来就是廉价的、具有冗余功能的磁盘阵列。其原理是通过软件或硬件将多块容量较小的硬盘或分区组合成一个容量较大的磁盘组。这个容量较大的磁盘组的读/写性能更好,更重要的是具有磁盘容错功能。什么是磁盘容错呢?从字面上理解,冗余就是多余的、重复的。在磁盘阵列中,冗余是指由多块硬盘组成一个磁盘组,在这个磁盘组中,数据存储在多块硬盘的不同地方,这样即使某块硬盘出现问题,数据也不会丢失,也就是磁盘数据具有了保护功能。组成RAID的可以是几块硬盘,也可以是几个分区,而硬盘更加容易理解,所以我们在讲解原理时使用硬盘举例,但是大家要知道,不同的分区也可以组成RAID。
常见的RAID有这样几种级别。
RAID 0也叫Stripe或Striping(带区卷),是RAID级别中读/写性能最好的。RAID 0最好由相同容量的两块或两块以上的硬盘组成,每块硬盘的品牌与型号最好也一致,这样性能最佳。在这种模式下,会先把硬盘分隔成大小相等的区块,当有数据需要写入硬盘中时,会把数据也划分成大小相等的区块,然后分别写入各块硬盘中。这样就相当于把一个文件分成几部分,同时写入不同的硬盘中,数据的读/写速度就会非常快。比如,由两块等容量的硬盘组成RAID 0,有一个大小为100MB的文件要写入此RAID中,那么,在每块硬盘中会写入50MB的数据,速度当然更快。
从理论上讲,由几块硬盘组成RAID 0,比如,由3块硬盘组成RAID 0,数据的写入速度就是同样的数据向一块硬盘中写入速度的3倍。RAID 0示意图如图1-13所示。
图1-13 RAID 0示意图
解释一下这张示意图。我们准备了3块硬盘,组成了RAID 0,每块硬盘都划分了大小相等的区块。当有数据写入RAID 0中时,首先把数据按照区块大小进行分割,然后把数据依次写入不同的硬盘中。每块硬盘负责的数据写入量都是整体数据的1/3,当然写入时间也只有原始时间的1/3。所以,从理论上讲,由几块硬盘组成RAID 0,数据的写入速度就是只写入一块硬盘中速度的几倍。
RAID 0的优点如下:
● 由两块或两块以上的硬盘组成,每块硬盘的容量最好一致。
● 通过把数据分割成大小相等的区块,分别存入不同的硬盘中,加快了数据的读/写速度。数据的读/写性能是几种RAID中最好的。
● 由多块硬盘合并成RAID 0,几块小容量的硬盘组成了更大容量的硬盘,而且没有容量损失。RAID 0的总容量就是几块硬盘的容量之和。
RAID 0也有一个明显的缺点,那就是没有磁盘容错功能,RAID 0中的任何一块硬盘损坏,RAID 0中保存的所有数据都将丢失。也就是说,由几块硬盘组成RAID 0,数据的损毁概率是只写入一块硬盘中数据损毁概率的几倍。
我们刚刚说了,组成RAID 0的硬盘的容量最好是相同的。如果只有两块容量不同的硬盘,难道就不能组成RAID 0了吗?答案是可以的。假设有两块硬盘,其中一块硬盘的容量是100GB,另一块硬盘的容量是200GB。由这两块硬盘组成RAID 0,那么,当最初的200GB数据被写入时,是被分别存放在两块硬盘当中的;但是,当数据量大于200GB之后,第一块硬盘就写满了,以后的数据就只能被写入第二块硬盘中,读/写性能也就随之下降了。
一般不建议企业用户使用RAID 0,因为数据的损毁概率更高。如果对数据的读/写性能要求非常高,但对数据的安全要求不高,那么使用RAID 0非常合适。
RAID 1也叫Mirror或Mirroring(镜像卷),由两块硬盘组成。两块硬盘的容量最好一致,否则总容量以容量小的那块硬盘为主。RAID 1具有磁盘容错功能,因为这种模式是把同一份数据同时写入两块硬盘中的。比如,有两块硬盘,组成了RAID 1,当有数据写入时,相同的数据既被写入硬盘1中,也被写入硬盘2中,当然分区的容量就只有两块硬盘总容量的50%了。这就相当于给数据做了备份,所以,任何一块硬盘损坏,数据都可以在另一块硬盘中找回。RAID 1示意图如图1-14所示。
图1-14 RAID 1示意图
虽然RAID 1具有了磁盘容错功能,但是硬盘的容量却减少了50%,因为两块硬盘中保存的数据是一样的,所以两块硬盘中实际上只保存了一块硬盘中所保存的数据,这也是我们把RAID 1称作镜像卷的原因。
RAID 1的优点如下:
● 只能由两块硬盘组成,每块硬盘的容量最好一致。
● 具有磁盘容错功能,任何一块硬盘出现故障,数据都不会丢失。
● 数据的读取性能虽然不如RAID 0,但是比单一硬盘要好,因为数据有两份备份在不同的硬盘上,当多个进程读取同一数据时,RAID会自动分配读取进程。
RAID 1的缺点也同样明显。
● RAID 1的容量只有两块硬盘总容量的50%,因为每块硬盘中保存的数据都一样。
● 数据写入性能较差,因为相同的数据会被写入两块硬盘中,相当于写入数据的总容量变大了。虽然CPU的速度足够快,但是负责数据写入的南桥芯片只有一个。
我们发现,RAID 0虽然数据读/写性能非常好,但是没有磁盘容错功能;RAID 1虽然具有磁盘容错功能,但是数据写入速度实在太慢了(尤其是软RAID)。那么,能不能把RAID 0和RAID 1组合起来使用呢?当然可以,这样既拥有了RAID 0非常好的数据读/写性能,又拥有了RAID 1的磁盘容错功能。
先用两块硬盘组成RAID 1,再用两块硬盘组成另一个RAID 1,最后把这两个RAID 1组成RAID 0,这种RAID方法称作RAID 10。如果先组成RAID 0,再组成RAID 1,那么这种RAID方法称作RAID 01。通过示意图来看看RAID 10的存储过程,如图1-15所示。
图1-15 RAID 10的存储过程示意图
我们把硬盘1和硬盘2组成了第一个RAID 1,把硬盘3和硬盘4组成了第二个RAID 1,把这两个RAID 1组成了RAID 0。因为先组成RAID 1,再组成RAID 0,所以这个RAID是RAID 10。当有数据写入时,首先写入的是RAID 0(因为RAID 0后组成,所以数据先写入),所以数据1和数据3被写入了第一个RAID 1中,而数据2和数据4被写入了第二个RAID 1中。当数据1和数据3被写入第一个RAID 1中时,因为写入的是RAID 1,所以在硬盘1和硬盘2中各写入了一份。数据2和数据4也一样。
这样的组成方式既拥有了RAID 0的性能优点,也拥有了RAID 1的磁盘容错功能。需要注意的是,虽然我们有了4块硬盘,但是由于RAID 1的缺点,所以真正的容量只有4块硬盘总容量的50%,另外的一半容量是用来备份的。
RAID 5最少需要由3块硬盘组成,当然每块硬盘的容量也应当一致。当组成RAID 5时,同样需要把硬盘划分成大小相等的区块。当有数据写入时,数据也被划分成大小相等的区块,然后循环向RAID 5中写入。不过,在每次循环写入数据的过程中,在其中一块硬盘中加入一个奇偶校验值(Parity),这个奇偶校验值的内容是这次循环写入时其他硬盘中所保存数据的备份。当有一块硬盘损坏时,采用这个奇偶校验值进行数据恢复。通过示意图来看看RAID 5的存储过程,如图1-16所示。
图1-16 RAID 5的存储过程示意图
在这张示意图中,我们使用3块硬盘组成了RAID 5。当有数据循环写入时,每次循环都会写入一个奇偶校验值,并且每次奇偶校验值都会被写入不同的硬盘中。这个奇偶校验值就是其他两块硬盘中的数据经过换算之后产生的。因为每次奇偶校验值都会被写入不同的硬盘中,所以,当任何一块硬盘损坏之后,都可以依赖其他两块硬盘中保存的数据恢复这块损坏的硬盘中保存的数据。
不过需要注意的是,每次循环写入数据时,都会有一块硬盘用来保存奇偶校验值,所以在RAID 5中可以使用的总容量是硬盘总数减去一块硬盘的容量之和。比如,在这张示意图中,由3块硬盘组成了RAID 5,但是真正可用的容量是两块硬盘的容量之和。也就是说,越多的硬盘组成RAID 5,损失的容量占比越小,因为不管由多少块硬盘组成RAID 5,奇偶校验值加起来只占用一块硬盘。而且还要注意的是,RAID 5不管是由几块硬盘组成的,只有损坏一块硬盘的情况才能恢复数据,因为奇偶校验值加起来只占用了一块硬盘。如果损坏的硬盘超过一块,那么数据就不能再恢复了。
RAID 5的优点如下:
● 由3块或3块以上的硬盘组成,每块硬盘的容量需要一致。
● 因为奇偶校验值的存在,所以RAID 5具有磁盘容错功能。
● RAID 5的实际容量是 n -1块硬盘,也就是硬盘总数减去一块硬盘的容量之和,有一块硬盘用来保存奇偶校验值,但不能保存实际数据。
● RAID 5的数据读/写性能要比RAID 1的数据读/写性能更好,但是在数据写入性能上比RAID 0差。
RAID 5也有一个缺点,那就是不管由多少块硬盘组成RAID 5,只支持一块硬盘损坏之后的数据恢复。
从总体上来说,RAID 5更像RAID 0和RAID 1的折中,性能比RAID 1好,但是不如RAID 0;具有磁盘容错功能,而且不像RAID 1那样浪费了50%的硬盘容量。
近些年又出现了一种新的磁盘阵列RAID 6,它是RAID 5的扩展。RAID 5只有一块硬盘用来保存奇偶校验值,而RAID 6有两块硬盘用来保存奇偶校验值,所以RAID 6可以支持两块硬盘损坏之后的数据恢复。
在了解了各种RAID的特点之后,通过表1-1来总结一下不同RAID的特点。
表1-1 不同RAID的特点
要想在服务器上实现RAID,可以采用磁盘阵列卡(RAID卡)来组成RAID,也就是硬RAID。在RAID卡上有专门的芯片负责RAID任务,因此性能要好得多,而且不占用系统性能;缺点是RAID卡比较昂贵。如果既不想花钱,又想使用RAID,那么只能使用软RAID。软RAID是指通过软件实现RAID功能。它没有多余的费用,但是更加耗费服务器系统性能,而且数据的写入速度也较硬RAID慢。硬RAID是通过不同厂商的RAID卡实现的,每种RAID卡的系统都不太一样,需要参考各个RAID卡厂商的说明。
笔者认为,使用软件模拟的RAID是没有实际使用价值的,因为RAID最主要的功能是数据冗余(RAID 1和RAID 5具备)。也就是说,当一块硬盘损坏之后,数据不会丢失,可以通过撤除损坏硬盘后加入新硬盘的方式来修复RAID。但是,只有在操作系统正常的情况下,才可以使用命令来修复RAID。试想一下,操作系统是安装在RAID之中的,而RAID是安装在硬盘之上的,硬盘已经损坏了,操作系统怎么可能正常?操作系统已经损坏了,如何还能使用命令来修复RAID?
所以,在生产环境中,要想使用RAID,必须使用独立于硬盘之外的RAID卡,RAID才能具备完整的功能。在Linux系统中只能使用软件模拟RAID,所以以下实验主要用于帮助大家理解RAID,在实际工作中不要使用软件模拟RAID(不论是Windows系统还是Linux系统中的软RAID都没有实际使用价值)。