1.3 RAID(磁盘阵列)
LVM 最大的优势在于可以在不卸载分区和不损坏数据的情况下进行分区容量的调整,但是,万一硬盘损坏了,那么数据一定会丢失。RAID(磁盘阵列)的优势在于硬盘的读/写性能更好,而且具有一定的磁盘容错功能(部分硬盘损坏,数据不会丢失)。
1.3.1 RAID 简介
RAID(Redundant Arrays of Inexpensive Disks)翻译过来就是廉价的、具有冗余功能的磁盘阵列。其原理是通过软件或硬件将多块容量较小的硬盘或分区组合成一个容量较大的磁盘组。这个容量较大的磁盘组的读/写性能更好,更重要的是具有磁盘容错功能。什么是磁盘容错呢?从字面上理解,冗余就是多余的、重复的。在磁盘阵列中,冗余是指由多块硬盘组成一个磁盘组,在这个磁盘组中,数据存储在多块硬盘的不同地方,这样即使某块硬盘出现问题,数据也不会丢失,也就是磁盘数据具有了保护功能。组成RAID 的可以是几块硬盘,也可以是几个分区,而硬盘更加容易理解,所以我们在讲解原理时使用硬盘举例,但是大家要知道,不同的分区也可以组成RAID。
常见的RAID 有这样几种级别。
1.RAID 0
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非常合适。
2.RAID 1
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 的速度足够快,但是负责数据写入的南桥芯片只有一个。
3.RAID 10或RAID 01
我们发现,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%,另外的一半容量是用来备份的。
4.RAID 5
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 的特点
5.软RAID 和硬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 都没有实际使用价值)。
1.3.2 命令模式配置RAID 5
我们主要以学习为目的,在命令模式下配置RAID 5,其他RAID 的配置方式和RAID 5的配置方式相似。由于软RAID 在工作中并不常用,所以我们用RAID 5来举例。
在Linux 系统中,使用mdadm 命令建立和管理软RAID。mdadm 命令既支持用完整的硬盘建立RAID,也支持用硬盘中的不同分区建立RAID。在这里使用分区建立RAID。
1.建立3个2GB 大小的分区和1个2GB 大小的备份分区
仍然建立3个2GB 大小的分区,用于构建RAID 5。不过,在这里多建立了1个2GB 大小的分区,用作备份分区。
这个备份分区的作用是什么呢?RAID 最大的好处就是具有冗余功能,当有一块硬盘或一个分区损坏时,数据不会丢失,只要插入新的硬盘或分区,依赖其他硬盘或分区就会主动重建损坏的硬盘或分区中的数据。不过,这仍然需要关闭服务器,手工插拔硬盘。如果在组成RAID 的时候就加入了备份硬盘或备份分区,那么,当硬盘或分区损坏时,RAID 会自动用备份硬盘或备份分区代替损坏的硬盘或分区,然后立即重建数据,而不需要人为手工参与。这样就避免了服务器停机和人为手工参与,非常方便,唯一的问题就是需要多余的硬盘或分区作为备份设备。
也就是说,在这个实验中需要4个2GB 大小的分区,其中3个组成RAID 5,1个作为备份分区。建立分区的过程这里不再详细解释。在建立完分区之后,可以使用gdisk 命令查看。命令如下:
我们建立了/dev/sdb1、/dev/sdb2、/dev/sdb3和/dev/sdb4共4个2GB 大小的分区。
2.建立RAID 5
使用mdadm 命令建立RAID,命令格式如下:
因为我们准备创建的是RAID 5,所以使用以下命令创建:
其中,/dev/md0是第一个RAID 设备的设备文件名。如果还有其他RAID 设备,则可以使用/dev/md[0~9]来表示。我们建立了RAID 5,使用了3个分区,并建立了1个备份分区。先查看一下新建立的/dev/md0,命令如下:
再查看/proc/mdstat 文件,在这个文件中也保存了RAID 的相关信息。命令如下:
3.格式化与挂载RAID
虽然已经创建了RAID 5,但是,要想正常使用,还需要格式化和挂载。格式化命令如下:
挂载命令如下:
4.生成mdadm 配置文件
在CentOS 7.x 中,mdadm 配置文件并不存在,需要手工建立。使用以下命令建立/etc/mdadm.conf 配置文件:
5.设置开机后自动挂载
设置开机后自动挂载需要修改/etc/fstab 配置文件,命令如下:
如果要重新启动,则一定要在这一步完成之后再进行,否则会报错。
6.模拟分区出现故障
虽然已经配置了RAID,但是它真的生效了吗?我们模拟磁盘报错,看看备份分区是否会自动代替错误分区。mdadm 命令有一个选项-f,其作用是把一块硬盘或一个分区变成错误状态,用来模拟RAID 报错。命令如下:
要想看到上面的效果,在查看时要快一点,否则修复可能就完成了。因为有备份分区的存在,所以分区损坏了,是不用管理员手工参与的。如果修复完成再查看,就会出现下面的情况:
备份分区/dev/sdb4已经被激活,而/dev/sdb2分区失效了。
7.移除错误分区
既然分区已经报错,就把/dev/sdb2分区从RAID 中移除。如果报错的是硬盘,则可以进行更换硬盘的处理。移除命令如下:
8.添加新的备份分区
既然分区已经报错,那么还需要加入一个新的备份分区,以防下次硬盘或分区出现问题。既然要加入新的备份分区,那么还需要再划分出一个2GB 大小的分区。命令如下:
新建/dev/sdb5分区,然后把它加入/dev/md0中作为备份分区。命令如下: