RAID(Redundant Array of Inexpensive Disks)称为廉价磁盘冗余阵列。RAID 的基本想法是把多个便宜的小磁盘组合到一起,成为一个磁盘组,使性能达到或超过一个容量巨大、价格昂贵的磁盘。
目前 RAID技术大致分为两种:基于硬件的RAID技术和基于软件的RAID技术。其中在Linux下通过自带的软件就能实现RAID功能,这样便可省去购买昂贵的硬件 RAID 控制器和附件就能极大地增强磁盘的 IO 性能和可靠性。由于是用软件去实现的RAID功能,所以它配置灵活、管理方便。同时使用软件RAID,还可以实现将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的。当然基于硬件的RAID解决方案比基于软件RAID技术在使用性能和服务性能上稍胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。在本节将详细讲述如何在红旗Linux服务器上创建和维护软RAID。
随着RAID技术经过不断的发展,现已有RAID 0 到 RAID 6 七种基本的RAID 级别,同时还有RAID 0和RAID 1的组合形式,称为RAID10。其中的级别并不代表技术的高低,而RAID 2和RAID 4基本上不再使用了,RAID 3则是由于实现起来太复杂也很少使用。目前这些常用的RAID级别Linux内核都能够支持,本节就以Linux 2.6的内核为例,在Linux 2.6内核中的软 RAID 可支持以下级别: RAID 0、RAID 1、RAID 4、RAID 5以及RAID 6等。Linux 2.6的内核除支持以上几种RAID级别外,还可支持LINEAR(线性模式)的软RAID,线性模式是将两个或更多的磁盘组合到一个物理设备中,磁盘不必具有相同的大小,在写入RAID 设备时会首先填满磁盘A,然后是磁盘B,以此类推。
RAID 0
也称为条带模式(striped),即把连续的数据分散到多个磁盘上存取,如图1所示。当系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。因为读取和写入是在设备上并行完成的,读取和写入性能将会增加,这通常是运行 RAID 0 的主要原因。但RAID 0没有数据冗余,如果驱动器出现故障,那么将无法恢复任何数据。
图1 RAID 0示意图
RAID 1
RAID 1又称为镜像(Mirroring),一个具有全冗余的模式,如图2所示。RAID 1可以用于两个或2xN个磁盘,并使用0块或更多的备用磁盘,每次写数据时会同时写入镜像盘。这种阵列可靠性很高,但其有效容量减小到总容量的一半,同时这些磁盘的大小应该相等,否则总容量只具有最小磁盘的大小。
图2 RAID 1示意图
RAID 4
创建RAID 4需要三块或更多的磁盘,它在一个驱动器上保存校验信息,并以RAID 0方式将数据写入其它磁盘,如图3所示。因为一块磁盘是为校验信息保留的,所以阵列的大小是(N-l)*S,其中S是阵列中最小驱动器的大小。就像在 RAID 1中那样,磁盘的大小应该相等。
如果一个驱动器出现故障,那么可以使用校验信息来重建所有数据。如果两个驱动器出现故障,那么所有数据都将丢失。不经常使用这个级别的原因是校验信息存储在一个驱动器上。每次写入其它磁盘时,都必须更新这些信息。因此,在大量写入数据时很容易造成校验磁盘的瓶颈,所以目前这个级别的RAID很少使用了。
图3 RAID 4示意图
RAID 5
在希望结合大量物理磁盘并且仍然保留一些冗余时,RAID 5 可能是最有用的 RAID 模式。RAID 5可以用在三块或更多的磁盘上,并使用0块或更多的备用磁盘。就像 RAID 4一样,得到的 RAID5 设备的大小是(N-1)*S。
RAID5 与 RAID4 之间最大的区别就是校验信息均匀分布在各个驱动器上,如图4所示,这样就避免了RAID 4中出现的瓶颈问题。如果其中一块磁盘出现故障,那么由于有校验信息,所以所有数据仍然可以保持不变。如果可以使用备用磁盘,那么在设备出现故障之后,将立即开始同步数据。如果两块磁盘同时出现故障,那么所有数据都会丢失。RAID5 可以经受一块磁盘故障,但不能经受两块或多块磁盘故障。
图4 RAID 5示意图
RAID 6
RAID 6是在RAID 5基础上扩展而来的。与RAID 5一样,数据和校验码都是被分成数据块然后分别存储到磁盘阵列的各个硬盘上。只是RAID 6中增加一块校验磁盘,用于备份分布在各个磁盘上的校验码,如图5所示,这样RAID 6磁盘阵列就允许两个磁盘同时出现故障,所以RAID 6的磁盘阵列最少需要四块硬盘。
图5 RAID 6示意图
创建软RAID
在红旗Linux服务器中是通过mdadm工具来创建和维护软RAID的,mdadm在创建和管理软RAID时非常方便,而且很灵活。mdadm常用的参数有如下:
--create或-C:创建一个新的软RAID,后面接raid设备的名称。例如,/dev/md0,/dev/md1等。
--assemble或-A:加载一个已存在的阵列,后面跟阵列以及设备的名称。
--detail或-D:输出指定RAID设备的详细信息。
--stop或-S:停止指定的RAID设备。
--level或-l:设置RAID的级别,例如,设置“--level=5”则表示创建阵列的级别是RAID 5。
--raid-devices或-n:指定阵列中活动磁盘的数目。
--scan或-s:扫描配置文件或/proc/mdstat文件来搜索软RAID的配置信息,该参数不能单独使用,只能配置其它参数才能使用。
下面将通过一个实例来讲述通过mdadm如何实现软RAID的功能。
【实例1】
某台机器上有4块空闲的硬盘,分别是/dev/sdb、/dev/sdc、/dev/sdd和/dev/sde,并用这四块硬盘来创建来创建一个RAID 5,具体操作步骤如下:
1、创建分区
首先使用“fdisk”命令在每块硬盘上创建一个分区,操作如下:
# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-102, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-102, default 102): Using default value 102
Command (m for help): w The partition table has been altered!
Calling ioctl() to re-read partition table. Syncing disks. |
针对其余几块硬盘也做相同操作,如果是直接基于磁盘来创建RAID设备,那么就可以跳过这一步。
2、创建RAID 5
创建完/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1四个分区后,下面就可以来创建RAID 5了,其中设定/dev/sde1作为备用设备,其余为活动设备,备用设备的作用是一旦某一设备损坏可以立即使用备用设备替换。操作命令如下:
# mdadm --create /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/sd[b-e]1 mdadm: array /dev/md0 started. |
其中“--spare-devices=1”表示当前阵列中备用设备只有一块,即作为备用设备的“/dev/sde1”,若有多块备用设备,则将“--spare-devices”的值设置为相应的数目。成功创建完成RAID设备后,通过如下命令可以查看到RAID的详细信息:
# mdadm --detail /dev/md0 /dev/md0: Version : 00.90.01 Creation Time : Mon Jan 22 10:55:49 2007 Raid Level : raid5 Array Size : 208640 (203.75 MiB 213.65 MB) Device Size : 104320 (101.88 MiB 106.82 MB) Raid Devices : 3 Total Devices : 4 Preferred Minor : 0 Persistence : Superblock is persistent
Update Time : Mon Jan 22 10:55:52 2007 State : clean Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1
Layout : left-symmetric Chunk Size : 64K
Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 33 1 active sync /dev/sdc1 2 8 49 2 active sync /dev/sdd1 3 8 65 -1 spare /dev/sde1 UUID : b372436a:6ba09b3d:2c80612c:efe19d75 Events : 0.6 |
3、创建RAID的配置文件
RAID的配置文件名为“mdadm.conf”,默认是不存在的,所以需要手工创建,该配置文件存在的主要作用是系统启动的时候能够自动加载软RAID,同时也方便日后管理。“mdadm.conf”文件内容包括:由DEVICE选项指定用于软RAID的所有设备,和ARRAY选项所指定阵列的设备名、RAID级别、阵列中活动设备的数目以及设备的UUID号。生成RAID配置文件操做如下:
# mdadm --detail --scan > /etc/mdadm.conf |
但是当前生成“mdadm.conf”文件的内容并不符合所规定的格式,所以也是不生效的,这时需要手工修改该文件内容为如下格式:
# vi /etc/mdadm.conf DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 ARRAY /dev/md0 level=raid5 num-devices=3 UUID=b372436a:6ba09b3d:2c80612c:efe19d75 |
如果没有创建RAID的配置文件,那么在每次系统启动后,需要手工加载软RAID才能使用,手工加载软RAID的命令是:
# mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 mdadm: /dev/md0 has been started with 3 drives and 1 spare. |
4、创建文件系统
接下来就只需要在RAID设备上创建文件系统就可使用了,在RAID设备上创建文件系统和在分区或磁盘上创建文件系统的方法一样。在设备“/dev/md0”上创建ext3的文件系统命令如下:
# mkfs.ext3 /dev/md0 |
创建完文件系统后,将该设备挂载上就可正常的使用了。如果要创建其它级别的RAID,其步骤和创建RAID 5基本都一样,区别在于指定“--level”值的时候,需要将该值设置为相应的级别。
软RAID虽然很大程度上能保证数据的可靠性,但是在日常的工作中,有时可能需要对RAID进行调整以及不排除RAID设备物理介质损坏的可能等相关问题
,当遇到这些情况时,那么同样可以通过“mdadm”命令来完成这些操作。下面也将通过一个实例来介绍更换RAID故障磁盘的完整过程。
【实例2】
以前面的【实例1】为基础,假定其中的“/dev/sdc1”设备出现故障时,更换一个新的磁盘,整个过程的详细说明如下:
1、模拟故障磁盘
在实际中,当软RAID检测到某个磁盘有故障时,会自动标记该磁盘为故障磁盘,并停止对故障磁盘的读写操作,所以这里需要将/dev/sdc1标记为出现故障的磁盘,命令如下:
# mdadm /dev/md0 --fail /dev/sdc1 mdadm: set /dev/sdc1 faulty in /dev/md0 |
由于【实例1】中的RAID 5设置了一个备用设备,所以当有标记为故障磁盘的时候,备用磁盘会自动顶替故障磁盘工作,阵列也能够在短时间内实现重建。通过“/proc/mdstat”文件可查看到当前阵列的状态,如下:
# cat /proc/mdstat Personalities : [raid5] md0 : active raid5 sde1[3] sdb1[0] sdd1[2] sdc1[4](F) 208640 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U] [=====>...............] recovery = 26.4% (28416/104320) finish=0.0min speed=28416K/sec unused devices: <none> |
以上信息表明阵列正在重建,当一个设备出现故障或被标记故障时,相应设备的方括号后将被标以(F),如“sdc1[4](F)”,其中“[3/2]”的第一位数表示阵列所包含的设备数,第二位数表示活动的设备数,因为目前有一个故障设备,所以第二位数为2;这时的阵列以降级模式运行,虽然该阵列仍然可用,但是不具有数据冗余;而“[U_U]”表示当前阵列可以正常