RAID(Redundant Array of Independent Disks,独立冗余磁盘阵列)技术是指通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬件设备上,然后利用分散读写技术来提升磁盘阵列的整体性能,同时把多个重要数据的副本同步到不同的物理硬件设备上,从而起到了非常好的数据冗余备份效果。
出于成本和技术等方面的考虑,需要针对不同的需求在数据可靠性以及读写性能上作出权衡,制定出满足不同需求的方案。因此,目前的RAID方案已有十几种,接下来简单介绍RAID 0、RAID 1、RAID 5与RAID 10这4中常见的方案。
一、RAID 0
RAID 0技术把多块物理硬盘设备(最少需要两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。这样一来,在最理想的状态下,硬盘设备的读写性能会提升数倍,但是若任意一块硬盘发生故障将导致整个系统的数据都受到破坏。通俗来说,RAID 0技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据备份和错误修复能力。如下图所示,数据被分别写入到不同的硬盘设备中,即disk1和disk2硬盘设备会分别保存数据资料,最终实现提升读取、写入速度的效果。
二、RAID 1
如果对硬盘设备的读写速度没有要求,而是希望增加数据的安全性时,就需要用到RAID 1技术了。在下图中可以看到,RAID 1技术是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用。
RAID 1技术虽然十分注重数据的安全性,但是因为是在多块硬盘设备中写入了相同的数据,导致硬盘设备的利用率下降,从理论上来说,上图所示的硬盘空间的真实可用率只有50%,由三块硬盘设备组成的RAID 1磁盘阵列的可用率只有33%左右,以此类推。而且,由于需要把数据同时写入到两块以上的硬盘设备,这无疑也在一定程度上增大了系统计算功能的负载。
三、RAID 5
RAID5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一设备损坏后不至于出现致命缺陷。如下图所示,图中parity部分存放的就是数据的奇偶校验信息,换句话说,就是RAID 5技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。RAID 5这样的技术特性“妥协”地兼顾了硬盘设备的读写速度、数据安全性与存储成本问题。
四、RAID 10
顾名思义,RAID 10技术是RAID 1 + RAID 0技术的一个“组合体”,记住不要读成RAID "十"。如下图所示,RAID 10技术需要至少4块硬盘来组建,其中先分别两两制作成RAID 1磁盘阵列,以保证数据的安全性;然后再对两个RAID 1磁盘阵列实施RAID 0技术,进一步提高硬盘设备的读写速度。这样从理论上来讲,只要坏的不是同一组中的所有硬盘,那么最多可以损坏50%的硬盘设备而不丢失数据。由于RAID 10技术继承了RAID 0的高读写速度和RAID 1的数据安全性,在不考虑成本的情况下RAID 10的性能都超过了RAID 5,因此当前成为广泛使用的一种存储技术。
五、部署磁盘阵列
实验1:准备4块硬盘来部署RAID 10磁盘阵列。
第1步:为虚拟机添加4块硬盘。
第2步:使用mdadm命令创建RAID 10。mdadm命令用于管理Linux系统中的软件RAID磁盘阵列,格式为"mdadm [模式] <RAID设备名称> [选项] [成员设备名称] "。mdadm命令的常用参数和作用如下表所示:
参数 | 作用 |
-a | 检测设备名称 |
-n | 指定设备数量 |
-l | 指定RAID级别 |
-C | 创建一个RAID阵列卡 |
-v | 显示创建的过程 |
-f | 模拟设备损坏 |
-r | 移除设备 |
-Q | 查看摘要信息 |
-D | 查看详细信息 |
-S | 停止RAID磁盘阵列 |
[root@linuxprobe ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd[b-e] //-a yes参数代表自动创建设备文件
mdadm: layout defaults to n2 //-n 4参数代表使用4块硬盘来部署RAID阵列
mdadm: layout defaults to n2 //-l 10参数代表RAID 10方案
mdadm: chunk size defaults to 512K
mdadm: /dev/sdb appears to be part of a raid array:
level=raid0 devices=0 ctime=Thu Jan 1 08:00:00 1970
mdadm: partition table exists on /dev/sdb but will be lost or
meaningless after creating array //因为我之前有用/dev/sdb硬盘做分区,所以会提示该信息
mdadm: size set to 20954624K
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
第3步:把制作好的RAID磁盘阵列格式化为ext4格式。
[root@linuxprobe ~]# mkfs.ext4 /dev/md0 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 2621440 inodes, 10477312 blocks 523865 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2157969408 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
第4步:创建挂载点目录,然后进行挂载操作。
[root@linuxprobe ~]# mkdir /RAID //创建挂载点目录
[root@linuxprobe ~]# mount /dev/md0 /RAID/
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.1G 15G 18% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/md0 40G 49M 38G 1% /RAID //可用空间为40GB
第5步:最后,查看/dev/md0磁盘阵列的详细信息,并把挂载信息写入到配置文件中,使其永久生效。
[root@linuxprobe ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Mar 12 14:31:51 2020 Raid Level : raid10 Array Size : 41909248 (39.97 GiB 42.92 GB) Used Dev Size : 20954624 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Mar 12 14:51:09 2020 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Name : linuxprobe.com:0 (local to host linuxprobe.com) UUID : cce49e07:a4bbba1a:ad44ecc4:70eb146b Events : 17 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 2 8 48 2 active sync /dev/sdd 3 8 64 3 active sync /dev/sde [root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab //写入配置文件中
六、损坏磁盘阵列及修复
实验:模拟RAID磁盘阵列损坏后的修复方法。
第1步:使用mdadm命令模拟/dev/sdb设备损坏。
[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb //模拟/sdb设备损坏
mdadm: set /dev/sdb faulty in /dev/md0
[root@linuxprobe ~]# mdadm -D /dev/md0 //查看RAID阵列的详细信息
/dev/md0:
Version : 1.2
Creation Time : Thu Mar 12 14:31:51 2020
Raid Level : raid10
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Mar 12 16:23:03 2020
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : cce49e07:a4bbba1a:ad44ecc4:70eb146b
Events : 19
Number Major Minor RaidDevice State
0 0 0 0 removed //显示/sdb已经被移除
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
0 8 16 - faulty /dev/sdb
知识补充:在RAID 10级别的磁盘阵列中,当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用,除非两块硬盘同时损坏。在此期间,我们仍然可以在/RAID目录中进行文件的创建和删除操作。
第2步:RAID 10磁盘阵列的修复。因为是虚拟机模拟的硬盘,所以可以先重启系统,之前模拟损坏的硬盘就变成正常硬盘,然后再添加到RAID磁盘阵列中。
[root@linuxprobe ~]# reboot //重启系统
[root@linuxprobe ~]# umount /RAID/ //先卸载挂载目录
[root@linuxprobe ~]# mdadm /dev/md0 -a /dev/sdb //将/sdb添加至RAID磁盘阵列中
mdadm: added /dev/sdb
[root@linuxprobe ~]# mdadm -D /dev/md0 //查看磁盘阵列信息
/dev/md0:
Version : 1.2
Creation Time : Thu Mar 12 14:31:51 2020
Raid Level : raid10
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Mar 12 16:43:47 2020
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Rebuild Status : 25% complete //新添加的硬盘的重建进度
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : cce49e07:a4bbba1a:ad44ecc4:70eb146b
Events : 37
Number Major Minor RaidDevice State
4 8 16 0 spare rebuilding /dev/sdb //新添加的/sdb硬盘正在重建中
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
[root@linuxprobe ~]# mdadm -D /dev/md0 //再次查看磁盘阵列信息
----------------------------省略部分输出内容------------------------------------
Number Major Minor RaidDevice State
4 8 16 0 active sync /dev/sdb //重建完成
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
第3步:重新挂载RAID磁盘阵列。
[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.1G 15G 18% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/md0 40G 49M 38G 1% /RAID
七、磁盘阵列+备份盘
存在一种极端情况,假如RAID 1磁盘阵列中的硬盘全部损坏,就会导致数据丢失。因此,可以准备一块备用硬盘,这块硬盘平时处于闲置状态,一旦RAID磁盘阵列中有硬盘出现故障后则会马上自动顶替上去。
这里我们演示RAID 5磁盘阵列加一块备份盘的实验,部署RAID 5磁盘阵列至少需要3块硬盘,加上备份盘则总共需要4块硬盘。在实验中我们故意移除磁盘阵列中的一块硬盘,然后检查备份盘是否自动顶替上去并同步数据。
第1步:为了避免实验冲突,将虚拟机还原至初始状态,重新添加4块硬盘。
第2步:创建一个RAID 5磁盘阵列+备份盘。
[root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sd[b-e] //-x 1参数代表有一块备份盘
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: /dev/sdb appears to be part of a raid array:
level=raid0 devices=0 ctime=Thu Jan 1 08:00:00 1970
mdadm: partition table exists on /dev/sdb but will be lost or
meaningless after creating array
mdadm: size set to 20954624K
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@linuxprobe ~]# mdadm -D /dev/md0 //查看磁盘阵列详情
/dev/md0:
Version : 1.2
Creation Time : Thu Mar 12 20:02:10 2020
Raid Level : raid5
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Mar 12 20:04:10 2020
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : e336ed00:1bbab6a7:8da15044:e7c60046
Events : 22
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
3 8 64 - spare /dev/sde //备份盘
第3步:将部署好的RAID 5磁盘阵列格式化为ext4文件格式,然后挂载到目录上,之后就可以使用了。
[root@linuxprobe ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477312 blocks
523865 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab //挂载信息写入配置文件
[root@linuxprobe ~]# mkdir /RAID
[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.1G 15G 18% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 84K 994M 1% /dev/shm
tmpfs 994M 8.9M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/md0 40G 49M 38G 1% /RAID //RAID 5磁盘阵列的利用率为(N-1)/N,N表示磁盘的块数
第4步:把/dev/sdb硬件设备移除磁盘阵列,然后迅速查看/dev/md0磁盘阵列的状态,就会发现备份盘已经自动顶替上去并开始了数据同步。
[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Mar 12 20:02:10 2020
Raid Level : raid5
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Mar 12 20:22:18 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 : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : e336ed00:1bbab6a7:8da15044:e7c60046
Events : 24
Number Major Minor RaidDevice State
3 8 64 0 spare rebuilding /dev/sde //备份盘正在同步数据
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
0 8 16 - faulty /dev/sdb