一、RAID(独立冗余磁盘阵列)概述
raid技术通过把多个硬盘设备组合成一个容量更大的,安全性更好的磁盘阵列。把数据切割成许多区段后分别放在不同的物理磁盘上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理设备上,从而起到了非常好的数据冗余备份效果。缺点就是磁盘利用率低。
二、RAID的分类
(1)RAID 0
RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术。RAID 0是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID 0没有提供冗余或错误修复能力,但实现成本是最低的。
工作原理如图:
(2)RAID 1
RAID 1称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行,当一块硬盘失效时,系统会忽略该硬盘,转而使用剩余的镜像盘读写数据,具备很好的磁盘冗余能力。虽然这样对数据来讲绝对安全,但是成本也会明显增加,磁盘利用率为50%。
工作原理如图:
(3)RAID 0+1
RAID 0+1名称上我们便可以看出是RAID0与RAID1的结合体。在我们单独使用RAID 1也会出现类似单独使用RAID 0那样的问题,即在同一时间内只能向一块磁盘写入数据,不能充分利用所有的资源。为了解决这一问题,我们可以在磁盘镜像中建立带区集。因为这种配置方式综合了带区集和镜像的优势,所以被称为RAID 0+1。把RAID0和RAID1技术结合起来,数据除分布在多个盘上外,每个盘都有其物理镜像盘,提供全冗余能力,允许一个以下磁盘故障,而不影响数据可用性,并具有快速读/写能力。RAID0+1要在磁盘镜像中建立带区集至少4个硬盘。也有一种叫法叫raid10.
工作原理如图:
(4)RAID 5
RAID 5:分布式奇偶校验的独立磁盘结构 它的奇偶校验码存在于所有磁盘上。RAID5的读出效率很高,写入效率一般,块式的集体访问效率不错。因为奇偶校验码在不同的磁盘上,所以提高了可靠性。但是它对数据传输的并行性解决不好,而且控制器的设计也相当困难。在RAID 5中有“写损失”,即每一次写操作,将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。
工作原理如图:
总结:raid0大幅度提升了设备的读写性能,但不具备容错能力。raid1虽然十分注重数据安全,但磁盘利用率太低。raid5就是raid0和raid5的一种折中,既提升了磁盘读写能力,又有一定的容错能力,成本也低。raid10就是raid0和raid1的组合,大幅度提升读写能力,较强的容错能力,成本也较高。一般中小企业用raid5,大企业采用raid10。
如图:
三、部署RAID 5卷
首先为服务器添加4块硬盘
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xb0813467 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd #磁盘类型改为raid
已将分区“Linux”的类型更改为“Linux raid autodetect”
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xb0813467
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 fd Linux raid autodetect
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
其他三块也是一样!
[root@localhost ~]# fdisk -l | grep sd[b-e]
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdb1 2048 41943039 20970496 fd Linux raid autodetect
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdc1 2048 41943039 20970496 fd Linux raid autodetect
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdd1 2048 41943039 20970496 fd Linux raid autodetect
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sde1 2048 41943039 20970496 fd Linux raid autodetect
[root@localhost ~]# yum -y install mdadm
#安装madam (madam是Linux下的raid管理工具)
[root@localhost ~]# mdadm -C /dev/md0 -ayes -l5 -n3 -x1 /dev/sd[b-e]1
#用sdb1,sdc1,sdd1,sde1四块磁盘其中3块创建raid5,名称为md0,另外一块作为热备份。
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
命令参数:
-C --create 创建阵列;
-a --auto 同意创建设备,如不加此参数时必须先使用mknod 命令来创建一个RAID设备,不过推荐使用-a yes参数一次性创建;
-l --level 阵列模式,支持的阵列模式有 linear, raid0, raid1, raid4, raid5, raid6, raid10, multipath, faulty, container;
-n --raid-devices 阵列中活动磁盘的数目,该数目加上备用磁盘的数目应该等于阵列中总的磁盘数目;
或者使用另一条命令
[root@localhost ~]# mdadm --create --auto=yes /dev/md0 --level=5 --raid-devices=4 --spare-devices=1 /dev/sd[b-e]1
命令参数:
--create #表示要创建raid
--auto=yes /dev/md0 #新建立的软件磁盘阵列设备为md0,md序号可以为0-9
--level=5 #磁盘阵列的等级,这里表示创建是的raid5
--raid-devices #添加作为磁盘阵列用的磁盘的块数
--spare-devices #添加作为预备(spare)磁盘的块数
/dev/sd[b-f]1 #磁盘阵列所使用的设备,还可写成/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
[root@localhost ~]# cat /proc/mdstat #查看RAID的配置文件
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[4] sde1[3](S) sdc1[1] sdb1[0]
41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2** [3/3] [UUU]**
unused devices: <none>
[root@localhost ~]# mdadm -D /dev/md0 #查看RAID配置文件详细信息
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 30 10:43:20 2019
** Raid Level : raid5** #阵列类型为raid5
………… #省略部分内容
Active Devices : 3 #活跃的磁盘数目
Working Devices : 4 #所有的磁盘数目
Failed Devices : 0 #故障的磁盘数目
Spare Devices : 1 #热备份的磁盘数目
………… #省略部分内容
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@localhost ~]# echo 'DEVICE /dev/sd[b-e]1' >>/etc/mdadm.conf
[root@localhost ~]# mdadm -Ds >>/etc/mdadm.conf
#添加raid5到raid配置文件并做修改
[root@localhost ~]# cat /etc/mdadm.conf
DEVICE /dev/sd[b-e]1
ARRAY /dev/md0 metadata=1.2 spares=1 name=localhost:0 UUID=12345d9f:61e1d599:86226f6d:536d45c7
[root@localhost ~]# mkfs.xfs /dev/md0
#格式化磁盘
[root@localhost ~]# mkdir /a
[root@localhost ~]# mount /dev/md0 /a
#挂载磁盘
[root@localhost ~]# df -hT #查看磁盘大小
………… #省略部分内容
/dev/md0 xfs 40G 33M 40G 1% /a
[root@localhost ~]# vim /etc/fstab #编写文件开机自动挂载
………… #省略部分内容
/dev/md0 /a xfs defaults 0 0
[root@localhost ~]# cd /a
[root@localhost a]# touch 123.txt 456.txt #创建测试文件
[root@localhost a]# mdadm /dev/md0 -f /dev/sdb1 #模拟sdb1损坏
mdadm: set /dev/sdb1 faulty in /dev/md0
[root@localhost a]# mdadm -D /dev/md0 #查看/dev/md0详细信息
………… #省略部分内容
Number Major Minor RaidDevice State
3 8 65 0 spare rebuilding /dev/sde1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
0 8 17 - faulty /dev/sdb1
[root@localhost a]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[4] sde1[3] sdc1[1] sdb1[0](F)
41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2 [**3/3] [UUU]**
unused devices: <none>
[root@localhost a]# ll #查看测试的文件
总用量 0
-rw-r--r--. 1 root root 0 6月 30 11:06 123.txt
-rw-r--r--. 1 root root 0 6月 30 11:06 456.txt
[root@localhost a]# mdadm /dev/md0 -r /dev/sdb1 #移除已损坏的磁盘
mdadm: hot removed /dev/sdb1 from /dev/md0
[root@localhost a]# mdadm -D /dev/md0 #查看/dev/md0详细信息
………… #省略部分内容
Number Major Minor RaidDevice State
3 8 65 0 active sync /dev/sde1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
[root@localhost a]# mdadm /dev/md0 -a /dev/sdb1 #添加一块硬盘
mdadm: added /dev/sdb1
[root@localhost a]# mdadm -D /dev/md0 #查看/dev/md0详细信息
………… #省略部分内容
Number Major Minor RaidDevice State
3 8 65 0 active sync /dev/sde1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
5 8 17 - spare /dev/sdb1
[root@localhost a]# ll
总用量 0
-rw-r--r--. 1 root root 0 6月 30 11:06 123.txt
-rw-r--r--. 1 root root 0 6月 30 11:06 456.txt
注意:在实际中sdb1已经是另一块完好的硬盘了。不是说之前损坏的那块移除再添加就好了。
服务器再添加一块磁盘,重启之后:
[root@localhost a]# mdadm /dev/md0 -a /dev/sdf1
mdadm: added /dev/sdf1
[root@localhost a]# mdadm -D /dev/md0
………… #省略部分内容
Number Major Minor RaidDevice State
3 8 65 0 active sync /dev/sde1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
5 8 17 - spare /dev/sdb1
6 8 81 - spare /dev/sdf1
由于默认是添加成热备盘,得把热备盘改为活动盘
[root@localhost a]# mdadm /dev/md0 -G -n4
#-n用来指定raid中活动盘的数量。最好保证要有足够的热备盘添加。
[root@localhost a]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jun 30 10:43:20 2019
Raid Level : raid5
Array Size : 41908224 (39.97 GiB 42.91 GB) #磁盘容量已将发生变化
Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Sun Jun 30 11:22:00 2019
State : clean #构建完成
………… #省略部分内容
Number Major Minor RaidDevice State
3 8 65 0 active sync /dev/sde1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
6 8 81 3 active sync /dev/sdf1
5 8 17 - spare /dev/sdb1
#此时raid中已经由四块硬盘了
[root@localhost a]# df -hT #查看之后,容量并没有发生变化
………… #省略部分内容
/dev/md0 xfs 40G 33M 40G 1% /a
[root@localhost a]# resize2fs /dev/md0
#(resizefx适用于ext3,ext4等文件系统不适用于xfs文件系统)
#resize2fs命令用于更新磁盘
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block 当尝试打开 /dev/md0 时
找不到有效的文件系统超级块.
[root@localhost a]# xfs_growfs /dev/md0 #对文件系统进行扩容
meta-data=/dev/md0 isize=512 agcount=16, agsize=654720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=10475520, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=5120, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 10475520 to 15715584
[root@localhost a]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
………… #省略部分内容
/dev/md0 xfs 60G 33M 60G 1% /a
#再次查看容量已经发生变化