一、概述
RAID(Redundant Array of Independent Disk),从字面意思讲的是基于独立磁盘的具有冗余的磁盘阵列,其核心思想是将多块独立磁盘按不同方式组成一个逻辑磁盘,以此来提高其存储容量、提高性能或者提供数据备份的功能。按其组合的方式不同而分成不同级别的RAID。
RAID分为软件RAID和硬件RAID两类,在比较流行的操作系统中已经集成了软RAID功能,如常用的Windows、Linux系统都有软件RAID功能,在功能上,软件RAID与硬件RAID一样,但是由于软件RAID没有独立的硬件控制设备,所以其性能不如硬件RAID,但是其实现比硬件RAID简单,不需要额外的硬件支持。硬件RAID通常需要有RAID卡,而RAID卡自带有独立的控制部件和内存,所以不会占用系统资源。目前大部分主板都已经集成了RAID卡。
二、RAID级别
RAID0(不含校验与冗余的条带存储)
将多块磁盘组合为RAID0后,数据在存储的时候被分割后分散在各个磁盘中,所以能最大地提升存储性能与存储空间,但是缺点是无法做到数据冗余,无法容错,此外,RAID0至少需要两块磁盘。
如下图所示,当写文件到RAID0时,文件会被分割成多个部分,熟悉oracle数据库的应该知道这个类似于重做日志组写日志,重做日志的编号分布和数据块存储在RAID0上的编号一样,当用两块磁盘组成RAID0时,数据被分割成多块,每块都有个编号,分布如下图所示:
优点:RAID0的结构可以加速磁盘IO,而且磁盘利用率达到100%
缺点:因为没有检验与备份,如果磁盘中某一块坏掉了,都将导致整个文件无法读取。
RAID1(不含检验的镜像存储)
多块磁盘组合为RAID1后,数据将被同时复制到每一个磁盘中,制作RAID1阵列至少需要两块磁盘,此种阵列只要有其中一块磁盘可用,就可以正常工作,RAID1的安全性最好,但是其利用率最低,两块磁盘组成的RAID1只有50%的利用率。
如下图所示,当有一个文件写入RAID1时,该文件会写入磁盘1,与此同时也会被复制到磁盘2,磁盘1与磁盘2的数据互为备份,很明显,这样会降低写入数据的效率,因为一个数据会被重复写两次,当然读取数据的时候会很快,因为可以同时从两块磁盘读数据。
RAID2(位级别的检验式条带存储)
多块磁盘组合为RAID2后,数据将以bit位为单位同步式分别存储在不同的磁盘上,并采用汉明码对数据进行校验与恢复。
假设有一个文件写入RAID2,则该文件会被分成数据为分别同步写入不同的磁盘中每个磁盘上分布的数据在与汉明码运算后再被写入磁盘中,拥有检验位的RAID2允许磁盘中的任何一块损坏,并且能通过其余未损坏的磁盘进行运算后还原已损坏的磁盘上的数据,以此实现数据恢复功能,RAID2对大量数据的读写具有很高的性能,但对少量的数据读写性能反而不好,RAID2至少需要三块磁盘。
RAID3(字节级别的检验式条带存储)
该级别的磁盘阵列与RAID2类似,只不过是以字节为单位分割数据。
RAID4(数据块级别的检验式条带存储)
该级别的磁盘阵列与RAID2类似,仅仅是数据分割单位不一样,以下是其原理图
RAID5(数据块级别的分布式检验条带存储)
多块磁盘组合成RAID5,数据将以block块为单位分别存储在不同的磁盘上,并对数据进行汉明码运算,为了节省磁盘,该类型磁盘阵列的汉明码会被写道不同的磁盘,下图是其原理图
RAID10(镜像与条带存储)
RAID10并不是RAID十,而是RAID0+RAID1结合而成,该磁盘阵列继承了RAID0快速与高效,同时也继承了RAID1的数据安全,该结构至少需要四块磁盘。RAID10通常有两种结构,一种是RAID0+1,该结构是先用四块磁盘组合为两个RAID0,再将两个RAID0组合为RAID1;另外一种是RAID1+0,先将四块磁盘组合为两块RAID1,再将两个RAID1组合为RAID0。
如图所示,当数据写入磁盘时,首先会以条带的方式同步写入有两个RAID1组合成的RAID0中,当数据被写入由具体磁盘组成的RAID1时,可以实现双磁盘镜像功能。
RAID10继承了RAID0与RAID1的优点,但是也继承了其缺点,其利用率很低,只有50%
三、磁盘阵列实战
接下来介绍如何创建软件RAID的具体步骤
[root@localhost ~]# fdisk -l
Disk /dev/sdc: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdb: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sde: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdd: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
从以上输出信息可知,系统有四块磁盘未进行分区,如果在Linux实现软件RAID,则可以将每块硬盘分一个区组建RAID,也可以对硬盘分多个区实现软件RAID,在此将硬盘划分为两个区。
创建磁盘分区[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x6d01a146.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-4194303, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-4194303, default 4194303): +1G
Partition 1 of type Linux and of size 1 GiB is set
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2099200-4194303, default 2099200):
Using default value 2099200
Last sector, +sectors or +size{K,M,G} (2099200-4194303, default 4194303):
Using default value 4194303
Partition 2 of type Linux and of size 1023 MiB is set
Command (m for help): t
Partition number (1,2, default 2): 1
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'
Command (m for help): p
Disk /dev/sdb: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x6d01a146
Device Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 fd Linux raid autodetect
/dev/sdb2 2099200 4194303 1047552 fd Linux raid autodetect
Command (m for help): w
其余的几块盘做相同的操作
分区划分好后,执行下面的命令,使系统重新加载分区
[root@localhost ~]# partprobe -a
创建RAIDmdadm
创建磁盘阵列,在CentOS7中可以创建RAID0、RAID1、RAID4、RAID5、RAID6、RAID10。mdadm [模式] 选项 [raid 设备]
选项:
-C 创建软件RAID #create
-l 指定RAID级别 #level
-n 指定磁盘个数
-x 指定备用设备个数
[root@localhost ~]# mdadm -C /dev/md0 -l 0 -n 3 /dev/sdb1 /dev/sdc1 /dev/sdd1 #创建RAID0
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@localhost ~]# mdadm --detail /dev/md0 #查看md0的详细信息
/dev/md0:
Version : 1.2
Creation Time : Mon Apr 27 22:48:18 2020 #创建时间
Raid Level : raid0 #RAID级别
Array Size : 3144192 (3.00 GiB 3.22 GB) #RAID磁盘空间
Raid Devices : 3 #磁盘个数
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Mon Apr 27 22:48:18 2020
State : clean
Active Devices : 3 #存活磁盘个数
Working Devices : 3 #工作中的磁盘个数
Failed Devices : 0 #错误磁盘个数
Spare Devices : 0 #备用磁盘个数
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 09100147:213d3e18:f652c4d2:02490c86
Events : 0
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
[root@localhost ~]# mdadm -C /dev/md1 -l 5 -n 3 -x 1 /dev/sdb2 /dev/sdc2 /dev/sdd2 /dev/sde2 #创建RAID5
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
[root@localhost ~]# mdadm --detail /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Apr 27 22:54:11 2020
Raid Level : raid5
Array Size : 2093056 (2044.34 MiB 2143.29 MB)
Used Dev Size : 1046528 (1022.17 MiB 1071.64 MB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Apr 27 22:54:17 2020
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:1 (local to host localhost.localdomain)
UUID : 4f0524d1:58ee3131:a1496e8e:440629ee
Events : 18
Number Major Minor RaidDevice State
0 8 18 0 active sync /dev/sdb2
1 8 34 1 active sync /dev/sdc2
4 8 50 2 active sync /dev/sdd2
3 8 66 - spare /dev/sde2
格式化与挂载
[root@localhost ~]# mkfs -t xfs /dev/md0
[root@localhost ~]# mkfs.xfs /dev/md1
[root@localhost ~]# mkdir /raid0
[root@localhost ~]# mount /dev/md0 /raid0
[root@localhost ~]# mkdir /raid5
[root@localhost ~]# mount /dev/md1 /raid5
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 42G 15G 28G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 84K 914M 1% /dev/shm
tmpfs 914M 9.0M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 3.9G 126M 3.8G 4% /boot
/dev/sr0 3.9G 3.9G 0 100% /run/media/root/CentOS 7 x86_64
/dev/md0 3.0G 33M 3.0G 2% /raid0
/dev/md1 2.0G 33M 2.0G 2% /raid5
将磁盘阵列设备设置为开机自动挂载项,系统开机就会读取磁盘阵列的配置文件/etc/mdadm.conf
以启动RAID设备。以下命令可以快速创建RAID的配置文件。其中DEVICE行代表所有磁盘阵列的设备成员名称,ARRAY行描述磁盘阵列具体的基本信息,包括名称、级别、UUID等信息。
[root@localhost ~]# echo "DEVICE /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdc2 /dev/sdd1 /dev/sdd2 /dev/sde2" > /etc/mdadm.conf
[root@localhost ~]# mdadm -Evs >> /dev/mdadm.conf
[root@localhost ~]# cat /dev/mdadm.conf
ARRAY /dev/md/1 level=raid5 metadata=1.2 num-devices=3 UUID=4f0524d1:58ee3131:a1496e8e:440629ee name=localhost.localdomain:1
spares=1 devices=/dev/sdb2,/dev/sdc2,/dev/sdd2,/dev/sde2
ARRAY /dev/md/0 level=raid0 metadata=1.2 num-devices=3 UUID=09100147:213d3e18:f652c4d2:02490c86 name=localhost.localdomain:0
devices=/dev/sdb1,/dev/sdc1,/dev/sdd1
[root@localhost ~]# echo "/dev/md0 /raid0 xfs defaults 0 0" >> /etc/fstab
[root@localhost ~]# echo "/dev/md1 /raid5 xfs defaults 0 0" >> /etc/fstab
RAID性能测试[root@localhost ~]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 5.44206 s, 193 MB/s
real 0m5.457s
user 0m0.000s
sys 0m4.965s
可以看出普通磁盘写入1GB的数据需要5.457s
接着测试一下RAID0的写入速度
[root@localhost ~]# cd /raid0
[root@localhost raid0]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.53482 s, 2.0 GB/s
real 0m0.537s
user 0m0.000s
sys 0m0.523s
我只想说,我勒个天,耗时0.537秒,仅仅是普通盘的十分之一
最后测试一下RAID5的写入速度
[root@localhost raid0]# cd /raid5
[root@localhost raid5]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.785508 s, 1.3 GB/s
real 0m0.787s
user 0m0.001s
sys 0m0.410s
RAID5总耗时0.787s,因为RAID5要进行汉明码运算,所以会比RAID0慢一点,但是与普通盘相比,其速度也是很快了!
模拟RAID故障[root@localhost raid5]# mdadm /dev/md1 -f /dev/sdc2 && mdadm --detail /dev/md1 #利用-f参数模拟磁盘sdc2损坏
mdadm: set /dev/sdc2 faulty in /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Apr 27 22:54:11 2020
Raid Level : raid5
Array Size : 2093056 (2044.34 MiB 2143.29 MB)
Used Dev Size : 1046528 (1022.17 MiB 1071.64 MB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Apr 27 23:22:26 2020
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 0% complete
Name : localhost.localdomain:1 (local to host localhost.localdomain)
UUID : 4f0524d1:58ee3131:a1496e8e:440629ee
Events : 20
Number Major Minor RaidDevice State
0 8 18 0 active sync /dev/sdb2
3 8 66 1 spare rebuilding /dev/sde2 #磁盘sde2接替损坏的sdc2磁盘,正在进行重建数据
4 8 50 2 active sync /dev/sdd2
1 8 34 - faulty /dev/sdc2 #损坏的sdc2磁盘成为空闲设备