RAID磁盘阵列详解
1 RAID原理
无论是DAS、NAS还是SAN,都是存储系统,一个存储系统可以包含多块磁盘。不同磁盘之间的组织排列,就是磁盘阵列技术,也就是RAID技术。
1.1 RAID数据组织方式
RAID磁盘阵列中的数据组织形式如下图所示,主要从三个维度进行数据组织,即分区(Extent)、分条(Strip)、和条带(Stripe):
· 分区:是将磁盘进行纵向分割,比如将磁盘0分割为分区0和分区1,将磁盘1分割为分区2和分区3,依次类推;
· 分条:是将磁盘进行横向分割,比如将磁盘0、1、2、3,横向分割出分条0、分条1等;
· 条带:纵向分割的分区和横向分割的分条,交叉之后形成条带;比如分区0和分条0交叉,形成条带0,0;分区2和分条0交叉,形成条带2,0;
需要注意的是条带可以包含多个数据块(Block),数据块是磁盘存储数据的最小单位,比如条带0,0包含数据块0和数据块1;一个条带包含的数据块数量,称之为分条深度,比如分条0深度为2,该分条内的条带均包含2个数据块,而分条1深度为1,该分条内的条带均包含1个数据块;一个分条跨越的分区数量,称之为分条尺寸,比如分条0跨越4个分区,所以分条尺寸为4;
可以看到上述数据组织形式是将数据打散开来的。虽然我们数据实际的组织形式是离散的,但是逻辑上呈现的仍然是连续的寻址空间。
1.2 RAID数据存取方式
根据上述离散的数据组织形式,不难发现数据的存取也是离散的。比如要将一段数据存入D0~D3,就需要将数据依次存入磁盘0的条带0,0,和磁盘1的条带2,0。反过来,数据的读取也是一样的。但是这种离散的数据存取方式,可以极大提高磁盘的存取速度。原因很简单,如果要写入数据D0~D7,可以将这些数据块并行写入四个磁盘,写入速度几乎提高四倍;反之,读取数据,也可以进行并行读取。
1.3 RAID数据冗余方式
RAID磁盘阵列中的数据冗余方式,主要分为镜像冗余和校验冗余,如下:
· 镜像冗余:这个很好理解,就是数据一比一镜像备份,比如磁盘1存储原始数据,磁盘2存储镜像备份数据,这时磁盘2就是磁盘1的备份。如果磁盘1故障,磁盘2可以直接恢复数据;
这时候,可以基于一些校验算法(比如奇偶校验),根据原始数据,使用校验算法生成校验数据,这部分校验数据就是冗余数据。如果原始数据因为磁盘故障丢失,这时可以使用校验算法,基于校验数据(冗余数据)逆向恢复原始数据。
举个例子,异或校验算法,可以根据100个原始数据,生成50个校验数据(冗余数据),如果100个原始数据中有50个数据因为故障丢失了,那么根据剩下的50个原始数据,以及50个校验数据,使用异或校验算法,可以逆向恢复丢失的那50个原始数据。这样存储空间利用率是100(原始数据)/150(原始+校验数据)= 66.6666%。
通常,校验算法越先进,生成的校验数据(冗余数据)越少,存储空间利用率越高,但是越先进的校验算法也意味着该算法越复杂,执行起来越消耗资源。
在RAID中,可以选择使用XOR异或校验算法,或者海明码。后者海明码更加先进也更加复杂,运行海明码所带来的巨大资源消耗,往往让人难以接受。所以现在RAID中,多使用简单可行的异或校验算法。
2 RAID级别
遵循RAID基本数据组织原理基础上,RAID磁盘阵列实际可以灵活安排数据组织结构,以提供不同的数据保护能力和不同的数据存取性能,这就是不同的RAID级别。
RAID技术发展至今,已经有了RAID 0~6这七种级别,不同级别代表RAID磁盘阵列不同的存储性能,存储成本和数据安全性;现在依次看下这七种RAID级别,如下:
2.1 RAID 0
该级别提供了RAID磁盘阵列最高的存储性能,RAID 0就是完全按照【分区&分条&条带】这三个维度进行数据的组织存取,简称为条带化的数据存储。条带化的数据存储形式在前面已经详细讲解过了,这里不再赘述。
所以RAID 0磁盘阵列的性能是和阵列中磁盘数量成正比的,最简单的公式就是
比如阵列中包含4块磁盘,单一磁盘性能为50MBps,则RAID 0磁盘阵列性能为200MBps,因为可以同时并行存取这四块磁盘。
综上,RAID 0的优点是存储性能高,缺点也很明显,即不提供数据保护。
2.2 RAID 1
RAID 1级别的数据组织形式,非常简单,采用最简单的镜像备份数据,如下:
根据上图所示,可以看到RAID 1级别的数据组织就是使用两块磁盘,一块磁盘存储原始数据,另一块磁盘存储镜像备份数据。如果因为磁盘故障导致原始数据丢失,根据另一块磁盘里的镜像备份数据可以快速恢复数据。所以RAID 1级别提供了较高的数据可靠性。
相较于RAID 0级别,RAID 1级别在数据存储性能上是有损失的,尤其是写入数据。因为每次写入数据实际写入的数据既要写入原始磁盘,也要写入镜像备份的磁盘(如果镜像备份的磁盘性能较低,容易形成性能瓶颈)。但是读取数据的性能还是可以的,因为可以从原始磁盘和镜像磁盘并行读取数据;但无论如何,RAID 1肯定比不上RAID 0级别的存储性能。
综上,RAID 1级别的优点是数据可靠性高,缺点也很明显,就是存储成本高(因为需要两块磁盘,一块存储原始数据,一块存储镜像备份数据),存储空间利用率低(只有50%)。所以RAID 1级别磁盘阵列,适合数据可靠性要求非常高的场景,比如银行、证券交易所等。
2.3 RAID 2
考虑采用镜像备份的方式保护数据,存储成本较高,存储空间利用率较低,所以可以使用校验冗余的方式保护数据,而不再使用RAID 1中的镜像冗余。
RAID 2就是基于海明码,计算校验冗余数据,如果原始数据丢失,根据校验数据、海明码算法,可以逆向计算,并恢复原始数据,如下:
根据上图所示,可以看到前三块磁盘存储的是原始数据,最后两块磁盘存储的是海明码根据原始数据计算出的校验数据,所以最后两块磁盘也被称为校验盘。
校验算法可以正向计算(原始数据–>校验数据),即使用校验算法,根据原始数据,计算出校验数据;校验算法也可以反向计算(校验数据->原始数据),即使用校验算法,根据校验数据算出原始数据。这一特性,也就保证了如果有原始数据丢失,那么根据校验数据,可以计算恢复出原始数据。
但是海明码算法有个特点,就是如果原始数据磁盘较少,那么校验磁盘和原始数据磁盘的数量几乎一致,比如原始数据磁盘3个,那么校验磁盘就需要2个(存储空间利用率60%),再比如原始数据磁盘4个,那么校验磁盘就需要3个(存储空间利用率57%)。但是如果原始磁盘的数量非常多,那么校验磁盘的数量会快速下降,比如原始磁盘数量64个,那么校验磁盘只需要7个(存储空间利用率90%)。
综上,RAID 2级别的优点是依据海明码提供数据保护,缺点是在数据量较低(数据磁盘较少)时,校验磁盘的数量几乎和数据磁盘的数量一致,导致存储成本高,存储空间利用率低。所以RAID 1级别非常适合于一些大数据存储场景,本身就需要海量磁盘进行数据存储。
2.4 RAID 3
采用海明码校验算法,在存储数据量较少时体现不出海明码的先进性,同时海明码本身算法复杂,海明码计算起来也非常消耗资源,所以磁盘阵列里更加倾向于简单的异或校验算法,这就是RAID 3级别。RAID 3级别,使用异或校验算法,计算校验数据,为原始数据,提供校验冗余的保护:
另外,RAID 3的数据组织形式,和RAID 0一样,采用条带化的数据组织形式,所以RAID 3在保证了数据存储性能较高的前提下提供了数据的校验保护,可以说是非常经济实惠的磁盘阵列技术。
2.5 RAID 5
RAID 5和RAID 3非常相似,都是采用条带化的数据组织形式(存储性能高),也都采用简单的异或校验算法,计算校验数据,提供原始数据的校验保护(数据可靠性高)。
唯一的区别,在于RAID 3级别将所有的校验数据专门存放于检验盘,如果校验盘故障了,则所有的校验数据丢失,原始数据的保护性也就没有了。所以RAID 5将校验数据,分散的存放于各个磁盘,不再单独设置校验盘,如下:
根据上图所示,可以发现RAID 5级别不再单独设置校验盘,校验数据(P数据)分散存放于各个磁盘。这样无论哪个磁盘故障,校验数据都不会完全丢失,剩余的校验数据,仍然可以帮助完成原始数据的回复。
2.6 RAID 6
无论是RAID 3还是RAID 5,它们使用异或运算计算校验数据,保护原始数据,所提供的保护性都是有限的,只能保护一块原始数据磁盘。换言之,如果磁盘阵列中有一块数据磁盘故障,根据校验数据可以恢复那块数据磁盘中的原始数据,但是如果同时两块(或以上)磁盘故障,那么就无法完全恢复数据了。这个实际并不难理解,所有的保护措施,都是有限保护,而不是无限保护。
RAID 6的核心思想,就是如果同时两块数据磁盘故障了,能不能恢复数据,答案是肯定的。只需要执行两次异或校验算法,生成两份校验数据,校验数据的增加,使得即使出现两块数据磁盘故障,两块故障数据磁盘里的原始数据,也都可以进行恢复,如下:
根据上图所示,可以发现RAID 6使用两次异或运算,计算出了两份校验数据(横向校验数据和斜向校验数据),校验数据的增加也就保证了就算是两块数据磁盘故障,也能恢复数据。
如果大胆去预测,只要不断增加校验数据,我们甚至可以保证三块数据磁盘故障情况下恢复数据,或者四块数据磁盘故障情况下恢复数据等等。但是一味增加校验数据就意味着磁盘存储利用率的不断下降,如果存储空间利用率都不到50%(即校验数据都超过了原始数据),那么还不如直接使用RAID 1镜像备份来保护数据。
综上,RAID 6通过增加校验数据,提供更高的数据保护,但是因为校验数据多了(冗余数据多了),所以存储空间利用率也在下降。
2.7 RAID 10
因为RAID 1级别并没有使用条带化的数据组织形式,如下所示,所以虽然RAID 1提供了非常高的数据保护(镜像保护),但是存储性能整体不高。
我们自然而然地在想,能不能在RAID 1级别中也引入条带化的数据组织形式,考虑到RAID 0级别是条带化数据组织的典型,于是将RAID 1和RAID 0结合,就产生了RAID 10级别,即使用RAID 1的镜像备份保护数据(提升数据可靠性),也使用RAID 0的条带化组织数据(提升存储性能)。
· RAID 0级别,以条带化形式组织数据,提供超高的存储性能
· RAID 1级别,以镜像冗余保护数据,提供超高的存储可靠性
RAID 等级 | ||||||
n≥1 | 2n (n≥1) | n≥3 | n≥3 | n≥4 | 2n(n≥2)≥4 | |
3 RAID实战:
使用 fdisk -l 命令查看一下自己添加的5 块硬盘是否已经添加成功
接着对创建的5个硬盘进行分区与更改文件类型;使用fdisk /dev/sdb修改第一个硬盘sdb,“n”创建分区,“p”创建主分区,后面起始和Last直接按回车键就好;接着按“t”键修改文件类型为raid类型,代码为"fd",“w”保存并退出。
3.1 创建RAID0:
# mdadm -C -v /dev/md0 -l0 -n2 /dev/sd[b-c]1 //raid 0设备名称为/dev/md0 -l指定raid等级,-n指定磁盘个数
# cat /proc/mdstat //查看概要
Personalities : [raid0]
md0 : active raid0 sdc1[1] sdb1[0]
20951040 blocks super 1.2 512k chunks
unused devices: <none>
[root@ergou dev]# mdadm -D /dev/md0 //查看详情
/dev/md0:
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
# mkfs.xfs /dev/md0 //格式化
# mkdir /raid0 //挂载
# mount /dev/md0 /raid0
# df -Th | grep /raid0
3.2 创建RAID1:
# mdadm -C -v /dev/md1 -l1 -n2 /dev/sd[d-e]1 -x1 /dev/sdf1
# cat /proc/mdstat
# mkfs.xfs /dev/md1
# mkdir /raid1
# mount /dev/md1 /raid1
# df -Th | grep /raid
3.3 创建RAID5:
# mdadm -C -v /dev/md5 -n3 -l5 /dev/sd[b-d]1 -x1 /dev/sde1
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid1 devices=2 ctime=Mon Aug 9 17:50:22 2021
mdadm: size set to 10475520K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.
# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md5 : active raid5 sdd1[4] sde1[3](S) sdc1[1] sdb1[0]
20951040 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
[==>..................] recovery = 13.4% (1411072/10475520) finish=1.0min speed=141107K/sec
[root@ergou ~]# mdadm -D /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Mon Aug 9 17:56:26 2021
Raid Level : raid5
Array Size : 20951040 (19.98 GiB 21.45 GB)
Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Aug 9 17:56:44 2021
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 4
Failed Devices : 0
Spare Devices : 2
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Rebuild Status : 23% complete
Name : ergou:5 (local to host ergou)
UUID : 5acf4999:4d382df2:60cf4983:1c7c924b
Events : 4
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
3 8 65 - spare /dev/sde1
模拟磁盘损坏
[root@ergou ~]# mdadm -f /dev/md5 /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md5
[root@ergou ~]# mdadm -D /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Mon Aug 9 17:56:26 2021
Raid Level : raid5
Array Size : 20951040 (19.98 GiB 21.45 GB)
Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Aug 9 17:58:09 2021
State : clean, FAILED
Active Devices : 1
Working Devices : 3
Failed Devices : 1
Spare Devices : 2
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : ergou:5 (local to host ergou)
UUID : 5acf4999:4d382df2:60cf4983:1c7c924b
Events : 46
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1 //正在同步数据
- 0 0 1 removed
- 0 0 2 removed
1 8 33 - faulty /dev/sdc1 //损坏
3 8 65 - spare /dev/sde1
4 8 49 - spare /dev/sdd1
# mdadm /dev/md5 -r /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md5
# mdadm -D /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Mon Aug 9 19:55:35 2021
Raid Level : raid5
Array Size : 20951040 (19.98 GiB 21.45 GB)
Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Mon Aug 9 20:02:47 2021
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Rebuild Status : 74% complete
Name : ergou:5 (local to host ergou)
UUID : 764f44ea:c62d2493:89faaab2:6c4490b0
Events : 32
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
3 8 65 1 spare rebuilding /dev/sde1
4 8 49 2 active sync /dev/sdd1
# mdadm -D /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Mon Aug 9 19:55:35 2021
Raid Level : raid5
Array Size : 20951040 (19.98 GiB 21.45 GB)
Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Mon Aug 9 20:04:02 2021
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : ergou:5 (local to host ergou)
UUID : 764f44ea:c62d2493:89faaab2:6c4490b0
Events : 38
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
3 8 65 1 active sync /dev/sde1
4 8 49 2 active sync /dev/sdd1
# mdadm /dev/md5 -a /dev/sdf1 //添加新磁盘
mdadm: added /dev/sdf1
# mdadm -D /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Mon Aug 9 19:55:35 2021
Raid Level : raid5
Array Size : 20951040 (19.98 GiB 21.45 GB)
Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Aug 9 20:05:05 2021
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : ergou:5 (local to host ergou)
UUID : 764f44ea:c62d2493:89faaab2:6c4490b0
Events : 39
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
3 8 65 1 active sync /dev/sde1
4 8 49 2 active sync /dev/sdd1
5 8 81 - spare /dev/sdf1
3.4 创建RAID10
# mdadm -Cv /dev/md1 -l1 -n2 /dev/sd[b-c]1
# mdadm -Cv /dev/md2 -l1 -n2 /dev/sd[d-e]1
# mdadm -D /dev/md1
# mdadm -D /dev/md2
# mdadm -E /dev/sd[b-e]1
# mdadm -E /dev/sd[b-c]1
创建RAID0 ,将其命名为md10,指定使用RAID1中的md1和md2做RAID0
# mdadm -Cv /dev/md10 -l0 -n2 /dev/md1 /dev/md2
进入根目录下创建目录md10,将RAID10的md10进行格式化之后挂载在md10目录下,然后就可以在该阵列中进行读写了
# cd /
# mkdir /md10
# mkfs.xfs /dev/md10
# mount /dev/md10 md10
# df -Th
补充:
磁盘扩充:
# mdadm -C -v /dev/md5 -n3 -l5 /dev/sd[b-d]1 -x1 /dev/sde1 //同上raid5
# mdadm -G /dev/md5 -n4 //-G指定增长模式,-n指定工作盘数量