RAID(Redundant Array of Independent Disk),独立冗余磁盘阵列(通常简称磁盘阵列)。磁盘阵列的实质是将多个磁盘通过RAID控制器组合在一起,形成一个新的磁盘。这个新的磁盘具有更大的容量(将多个磁盘合并使用)、更好的容错性(一份数据多个拷贝),以及更快的读写速度(多磁盘同时读写)等优势。
对与计算机而言,磁盘阵列就是一个磁盘。
-
一、磁盘阵列的种类
磁盘阵列按实现方式可分为硬件RAID和软件RAID,其区别如下:
硬件RAID:常见的硬件RAID以阵列卡等形式存在。对于主机而言,一个硬件RAID系统就是一个磁盘。
软件RAID:软件RAID是通过底层代码实现,通常是有操作系统提供的相关功能。
硬件RAID与软件RAID对比
磁盘类型 安装驱动 系统资源 支持种类 花费资金
软件RAID 无需 需要 更多 无需额外购买
硬件RAID 需要 无需 有限 需要额外购买
硬件RAID虽然按照麻烦,但可以不必占用系统资源,从而提高了系统资源利用率,因此硬件RAID一般用在专用存储或磁盘读写压力较大的服务器上。软件RAID部署比较方便,且能够支持更多的存储设备,因此软件RAID一般用在小型服务器、个人和家庭存储领域。
-
二、磁盘阵列级别
磁盘阵列按存储数据的方式不同,可以使用RAID0-RAID7来表示,通常将其称为阵列级别。除了0-7这8个级别外,一些厂商还在原有的8个级别的基础上,扩展出其他的级别,例如RADI50、RAID10等。
阵列级别不同,其存储数据的方式、附带的功能、特性也有所差异。常见的几个阵列级别:
(1)RAID 0
RAID 0必须由两块以上的磁盘组成,存储数据时RAID 0会先分割要存入的数据,然后再交错地存储在组成阵列的所有磁盘上。RAID 0交错地存储数据带来的特性如下:
- 大大提高了读写数据的速度(由于系统总线等多方面的限制,其读写速度往往低于所有磁盘读写速度的总和)。
- RAID 0阵列的可用空间是所有磁盘空间的总和。
- 由于数据都没有备份,因此RAID 0不提供数据冗余功能。
由于阵列中的数据分布在所有磁盘上,因此有时人们也将RAID 0称为带区卷。
注意:无论阵列的级别是多少,组成阵列的磁盘大小都应该大致相等。
(2)RAID 1
RAID 1必须由两块以上的磁盘组成,存储数据时,RAID 1将要存储的数据完整地存放在组成阵列的所有磁盘上,即每个磁盘都拥有一个拷贝。RAID 1的特性如下:
- 由于每个磁盘都保存着一份相同的数据,因此RAID 1能够提供数据冗余功能。
- RAID 1的可用空间与组成阵列的磁盘中容量最小的磁盘空间相等。
- RAID 1不能加快数据的读写速度。
由于每块磁盘内的数据一致,因此通常将RAID称为镜像卷。
(3)RAID 5
组成RAID 5必须使用3块以上的磁盘,以使用3块磁盘组成的RAID 5为例:存数数据时,先将数据分为两部分,然后对这两部分数据执行奇偶校验运算(即异或运算),最后将这两部分数据与奇偶校验的结果随机地存放在3块磁盘中。
RAID 5的特性如下:
- 提供磁盘冗余功能。
- 同时读写磁盘,加快的数据读写速度。
- 需要执行奇偶校验,要消耗计算资源。
- RAID 5的可用空间计算公式为:n*(m-1)。其中n表示单个磁盘的空间,m表示组成阵列的磁盘总数。
注意:RAID 5的冗余工作机制为,当其中一块磁盘损坏时,可以通过其他几块磁盘中的数据计算出丢失的数据。因此虽然RAID 5提供了磁盘冗余功能,但如果损坏的磁盘数大于1,仍然无法计算出丢失的数据。
-
三、创建组成阵列的磁盘分区
在Linux系统中,阵列的实现方式是:利用多个现有的块设备文件,通过操作系统的底层代码虚拟出新的块设备文件(称为虚拟块设备文件)。实现虚拟块设备文件功能的底层代码叫做MD(Multiple Device),利用MD可以组成RAID0、RAID4、RAID5、RAID6等多种阵列。
与Windows环境中的软件阵列不同,MD使用磁盘分区创建阵列(Windows系统中只能使用磁盘组成阵列)。
[root@localhost ~]# fdisk /dev/sda
The number of cylinders for this disk is set to 1958.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
#使用命令n和p添加主要分区
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
#新分区使用分区号1,并使用所有可用空间
Partition number (1-4): 1
First cylinder (1-1958, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1958, default 1958):
Using default value 1958
#使用命令t修改分区类型
Command (m for help): t
Selected partition 1
#分区类型代码fd(可通过键入L查看所有的分区类型及其对应的代码)
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): p
Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 1958 15727603+ fd Linux raid autodetect
#使用命令w将分区表同步到磁盘
Command (m for help): w
上面这个过程与创建普通磁盘分区类似,但在上面创建分区的过程中,使用了命令t将分区类型修改为Linux raid autodetect。虽然不修改分区类型也可以创建磁盘阵列,但为了方便管理员了解功能,建议修改组成阵列的所有磁盘分区。
按照上面的步骤依次添加sdb1和sdc1.
-
四、创建磁盘阵列
在Linux系统中,创建和管理磁盘阵列的使用的命令是mdadm。
注意:虽然系统不会提示,但组成阵列的所有分区大小应该基本一致。最好使用几个相同的磁盘,每个磁盘创建一个分区,然后创建阵列。
不要使用一个磁盘的多个分区组建阵列,这会大大影响阵列的读写速度。
除了注意上述两点外,建议使用相同型号的磁盘组成阵列(相同型号的磁盘参数都相同),以保证阵列获得最佳的性能。
1、创建磁盘阵列
使用上面创建的磁盘分区sda1、sdb1和sdc1组成阵列RAID 5。
(1)创建阵列的命令如下:
#使用mdadm创建磁盘阵列
#选项create表示要创建的磁盘阵列的设备名,此处要创建的是/dev/md0
#选项level表示磁盘阵列的级别,本例中为5
#选项raid-devices表示阵列将使用的磁盘分区数,最后是分区列表
#本例中分区数为3,组成磁盘阵列的分区分别是sda1、sdb1、sdc1
[root@localhost ~]# mdadm --create /dev/md0
> --level 5
> --raid-devices 3 /dev/sda1 /dev/sdb1 /dev/sdc1
上面这个示例命令中,使用了长格式选项create、level、raid-devices,其对应的短格式选项为C、l和n。
(2)磁盘阵列创建完成后,系统会立即同步磁盘,并初始化创建的阵列。由于这个过程会读写磁盘,因此通常不建议在此时对阵列执行读写操作。
如果要查看初始化进度,可以使用以下命令:
[root@localhost ~]# cat /proc/mdstat
2、写入配置文件
为方便系统跟踪和监视阵列,应该将阵列信息写入配置文件/etc/mdadm.conf中(默认情况下并不存在这个文件)。
可以使用如下命令写入配置文件:
#使用echo命令将阵列的组成信息写入配置文件
#如果当前写入的阵列不是系统中的第1个阵列,下面的命令应该使用追加的方式写入文件
[root@localhost ~]# echo "DEVICE /dev/sda1 /dev/sdb1 /dev/sdc1">/etc/mdadm.conf
#使用选项detail和scan命令扫描磁盘阵列,并将详细信息写入配置文件
[root@localhost ~]# mdadm --detail --scan>>/etc/mdadm.conf
3、使用阵列
完成以上步骤后,就可以像使用分区那样使用阵列了:
[root@localhost ~]# mkfd.ext3 /dev/md0
[root@localhost ~]# mount /dev/md0 /mnt/md0
至此,就可以使用阵列存储数据了。
-
五、为阵列添加热备份盘
如果使用了具有冗余功能的磁盘阵列,应该考虑为阵列添加热备份盘(即阵列的后备磁盘)。当阵列中的某个磁盘损坏时,阵列将自动使用热备份盘替代已损坏的磁盘并继续工作。
添加热备份盘之前,需要查看磁盘阵列的状态:
#通过查看/proc/mdstat的方法查看阵列状态 [root@localhost ~]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdc1[2] sdb1[1] sda1[0] 167766528 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
在上面的示例中,第2行中的active表示阵列/dev/md0工作正常。第3行中的[3/3]和[UUU]表示组成阵列的磁盘有3个,并且3个磁盘都处于正常工作状态(“U”表示正常,“_”表示不正常)。
要为阵列添加热备份盘,可以使用选项add(或短格式选项a):
[root@localhost ~]# mdadm /dev/md0 --add /dev/sdd1
#通过查看/proc/mdstat的方法查看阵列状态 [root@localhost ~]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdd1[3](S) sdc1[2] sdb1[1] sda1[0] 167766528 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
添加热备份盘后,查看阵列信息发现组成阵列的磁盘多了一块,其状态标识为S,表示这是一个热备份盘。
为阵列添加热备份盘后,阵列不会立即在热备份盘中存放数据。只有当阵列中的磁盘损坏时,阵列才会启用热备份盘。
提示:为阵列添加热备份盘的创建方法,与组成阵列的其他磁盘的创建方法一样,并且都要求大小基本一致。
六、使用热备份盘替换损坏磁盘
如果阵列中一个磁盘已经损坏,阵列会自动使用热备份盘将已损坏的磁盘替换掉,并重新同步阵列中保存的数据。
我们可以模拟这个过程:
(1)使用选项fail(短格式选项为f),认为标识损坏磁盘:
[root@localhost ~]# mdadm -f /dev/md0 /dev/sdc1
(2)将已损坏的磁盘从阵列中移除,可使用选项remove:
[root@localhost ~]# mdadm /dev/md0 --remove /dev/sdc1
七、扩展阵列
许多时候已经建立的磁盘阵列不能满足应用需求,这时就需要扩展阵列(即扩充阵列的容量)。
步骤:先将扩展磁盘添加为阵列的热备份盘,然后再扩展阵列。
假设已经将sdc1和sde1以热备份的方式添加到阵列中,现在需要扩展阵列。扩展现有阵列需要使用选项grow和raid-devices,过程如下:
[root@localhost ~]# mdadm --grow /dev/md0 --raid-devices 5
上面的命令将两个热备份盘添加到阵列中,构成阵列的磁盘数量从3个扩展到5个。扩展完成后,系统会自动同步阵列中的数据。