企业级的数据库应用大多部署在RAID磁盘阵列的服务器上,这样能提高磁盘的访问性能,并能够实现容错/容灾。 RAID(冗余磁盘阵列),简单理解,就是拿一些廉价的硬盘来做成阵列。其目的无非是为了扩展存储容量,提升读写性能,实现数据冗余(备份容灾)。
主流的大概可以分为几个级别:RAID 0、RAID 1、RAID 5、RAID6、RAID 10、 RAID 01、RAID 50等。
-
RAID 0 简称磁盘条带化,它可以提供最好的读写性能,如果你把两块磁盘做成了RAID0,那么在写入数据的时候,就可以同时对A磁盘和B磁盘执行写入操作。这里需要说明的是:“可以同时...写入操作”,并不是意味着将文件的相同内容“在同一时间内完全写入”A磁盘和B磁盘中。打 个比方:有一个100M的文件需要写入磁盘中,假设单个磁盘的写入速度是10M/S,那么需要10秒钟才能完成写入工作。但如果在具有A、B两块磁盘的 RAID 0阵列环境中,(以秒/S为最小单位的)单时间内,可以将10M内容写入A磁盘中,并同时将紧随的10M内容写入B磁盘中,这样算起来,写入速度变成了 20M/S,只需要5秒钟就能搞定了,而且每块磁盘中只需存储50M的文件内容,不会造成硬盘存储压力。当然,上诉例子也许不恰当,也只是指的理论环境 下,实际环境中会有很多其他因素,效率肯定不能达到。 可以肯定的是,这样肯定是能提高读写性能的,但是这样也带来了一个问题就是,如果其中的一部 分数据丢失了,你的全部数据都不会找回来的,因为RAID0没有提供冗余恢复数据的策略。所以RAID0可以用在只读的数据库数据表,或者是经过复制过来 的数据库上,如果你对数据丢失不敏感的话,也可以使用RAID 0,总之这个level下是高性能、无冗余。
-
RAID 1 磁盘镜像它提高了读的性能,降低了写的性能,因为它采用了一块磁盘做冗余备份的方法,这样如果你有两块50G的磁盘,那么加起来就是100G,但是在RAID 1下,那么你只能使用50G ,这种方法会影响磁盘的空间使用,降低了I/O 写的性能。通俗点来讲:你将一个100M的文件写入RAID 1时,将内容写入A磁盘的同时,也会将相同的内容写入B磁盘中。 这样一来,两块磁盘的内容是完全一致的(这就传说中的”冗余“,并不是什么高深的东西)。本来只需要写入1块硬盘的,可是现在要写入到两块硬盘去,效率肯 定会变低。至于“读”操作,RAID 1环境下,由于两块磁盘上有相同的内容,读取操作同时在两块磁盘上进行,所以读性能得到提升,关于数据冗余方面,只是当第一个硬盘数据损坏或 者挂掉了,就启动第二块硬盘。当然,两块硬盘都挂了,那就真的崩溃了。哈哈。值得一提的是,有些书或者文章上讲,RAID 1是在将第一块硬盘写入完成后,才将数据完整复制到第二块磁盘中做为镜像备份的这种说法有待考证,按我的理解,是同时复制写入的。
-
RAID 5 与RAID1 不同之处就是多了奇偶校验,所有的奇偶校验的信息会遍布各个磁盘,性能上要比RAID1高些,但是一旦发生磁盘I/O失败,就会造成性能急剧下降,同时这 种方法也在RAID0 与RAID1间折了中,是比较通用的做法。 用简单的语言来表示,至少使用3块硬盘(也可以更多)组建RAID5阵列,当有数据写入硬盘的时候,按照1块硬盘的方式就是直接写入这块硬盘的,如果是 RAID5的话这次数据写入会分根据算法分成3部分,然后写入这3块硬盘,写入的同时还会在这3块硬盘上写入校验信息,当读取写入的数据的时候会分别从3 块硬盘上读取数据内容,再通过检验信息进行校验。当其中有1块硬盘出现损坏的时候,就从另外2块硬盘上存储的数据可以计算出第3块硬盘的数据内容。也就是说RAID5这种存储方式只允许有一块硬盘出现故障,出现故障时需要尽快更换。当更换故障硬盘后,在故障期间写入的数据会进行重新校验。 如果在未解决故障又坏1块,那就是灾难性的了。
-
RAID 10 (和RAID 01没什么区别,就是前者在RAID 1的基础上做RAID 0,后者反了过来而已 )就是RAID0 与 RAID1的组合,它提供了高性能,高可用性, 性能上要比RAID5好,特别适合大量写入的应用程序,但是就是成本比较高无论是多少块磁盘你都是将损失一半的磁盘存储。至少需要4块硬盘 才能完成,A和B做数据分割,分别存储一半的数据,C和D分别对应做A和B的镜像备份。这样一来,可真是完美了,也是我理想中的最佳状态。也不需要 RAID 5的奇偶校验。很显然,这样子成本也会高一些。还有一点很遗憾的就是性能的”短板效应“,
通过上面RAID 10的介绍也就明白了RAID 50的性能模式了吧?这里就不介绍了。
下面是一个综合各种RAID 等级的性能以及应用场景:
软RAID配置命令——mdadm 命令格式:
[root@localhost ~]# mdadm -C /dev/md5 -a yes -l 5 -n 3 -x 1 /dev/sd[b,c,d,e]
或者
[root@localhost ~]# mdadm -C /dev/md0 -ayes -l5 -n3 -x1 /dev/sd[b-e]1
关于上述的选项与参数介绍:
- -C --create:创建模式
- -a --auto {yes|no}:同意创建设备,如不加此参数时必须先使用mknod 命令来创建一个RAID设备,不过推荐使用-a yes参数一次性创建;
- -l --level #:阵列模式,支持的阵列模式有 linear, raid0, raid1, raid4, raid5, raid6, raid10, multipath, faulty, container;
- -n #:使用#个块设备来创建此RAID(-n 3 表示用3块硬盘来创建这个RAID)
- -x #:当前阵列中热备盘只有#块(-x 1 表示热备盘只有1块)
创建RAID举例(以RAID 5为例) 需求如下:
- 利用4个分区组成RAID 5,其中一个分区作为预备磁盘,当工作中的RAID损坏后,预备磁盘顶上;
- 每个分区大小为20GB;
- 利用1个分区设置为预备分区;
- 挂载到/test目录使用】
开始配置:
1、创建RAID 5:
[root@localhost ~]# fdisk -l | grep 磁盘 #以下就是用来做RAID 5的磁盘
..........................#省略部分内容
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
磁盘标签类型:gpt
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
磁盘标签类型:gpt
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
磁盘标签类型:gpt
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
磁盘标签类型:gpt
..........................#省略部分内容
[root@localhost ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd[b,c,d,e]
........................#忽略部分提示信息
Continue creating array? y #输入“y”进行确认
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started. #/dev/md0创建成功。
[root@localhost ~]# cat /proc/mdstat #查询刚刚创建的RAID信息
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd[4] sde[3](S) sdc[1] sdb[0] #组成RAID的实体磁盘及其顺序
41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
#相关信息,chunk大小及RAID等级说明,后面的三个U代表正常,若不是U则代表有误。
unused devices: <none>
[root@localhost ~]# mdadm -D /dev/md0 #这个命令查看出来的结果更人性化写
/dev/md0: #RAID的设备文件名
Version : 1.2
Creation Time : Thu Sep 5 09:37:42 2019 #创建RAID的时间
Raid Level : raid5 #RAID的等级,这里是RAID5
Array Size : 41908224 (39.97 GiB 42.91 GB) #整组RAID的可用量
Used Dev Size : 20954112 (19.98 GiB 21.46 GB) #每颗磁盘的可用容量
Raid Devices : 3 #组成RAID的磁盘数量
Total Devices : 4 #包括spare的总磁盘数
Persistence : Superblock is persistent
Update Time : Thu Sep 5 09:39:28 2019
State : clean #目前这个RAID的使用状态
Active Devices : 3 #启动的设备数量
Working Devices : 4 #目前使用于此RAID的设备数量
Failed Devices : 0 #损坏的设备数量
Spare Devices : 1 #预备磁盘的数量
Layout : left-symmetric
Chunk Size : 512K #chunk的小区块容量
Consistency Policy : resync
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : d395d245:8f9294b4:3223cd47:b0bee5d8
Events : 18
#以下是每个磁盘的使用情况,包括三个active sync和一个spare
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
#RaidDevice是指此RAID内的磁盘顺序
2、格式化并进行挂载使用:
[root@localhost ~]# mkfs.xfs /dev/md0 #格式化刚刚创建的RAID 5
[root@localhost ~]# mkdir /test #创建挂载点
[root@localhost ~]# mount /dev/md0 /test #挂载
[root@localhost ~]# df -hT /test #确认挂载,使用起来和普通文件系统没有区别
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/md0 xfs 40G 33M 40G 1% /test
#将挂载信息写入/etc/fstab中进行开机自动挂载了,设备名可以是/dev/md0,也可以是设备的UUID。
[root@localhost ~]# blkid /dev/md0 #查询该RAID 5的UUID
/dev/md0: UUID="93830b3a-69e4-4cbf-b255-f43f2ae4864b" TYPE="xfs"
[root@localhost ~]# vim /etc/fstab #打开/etc/fstab,写入下面内容
UUID=93830b3a-69e4-4cbf-b255-f43f2ae4864b /test xfs defaults 0 0
3、测试RAID 5:
关于测试,必然涉及到了一些管理RAID的参数,如下:
- -f --fail:会将后面的设备设置成为出错的状态;
- -a --add:会将后面的设备加入到这个md中;
- -r --remove:会将后面这个设备由这个md中移除;
[root@localhost ~]# echo "hi,girl,good morning." > /test/a.txt #写入数据
[root@localhost ~]# cat /test/a.txt #查看
hi,girl,good morning.
[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb #将/dev/sdb损坏
mdadm: set /dev/sdb faulty in /dev/md0
[root@localhost ~]# mdadm -D /dev/md0 #查看RAID 5的状态
/dev/md0:
Version : 1.2
Creation Time : Thu Sep 5 09:37:42 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 : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Sep 5 10:47:00 2019
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 1 #查到失败的磁盘有1个
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : d395d245:8f9294b4:3223cd47:b0bee5d8
Events : 39
Number Major Minor RaidDevice State
3 8 64 0 active sync /dev/sde
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
0 8 16 - faulty /dev/sdb #这就是刚才损坏的磁盘
#可以发现作为预备磁盘已经顶替了损坏的磁盘了
[root@localhost ~]# df -hT /test #可用容量还是40G
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/md0 xfs 40G 33M 40G 1% /test
root@localhost ~]# mdadm /dev/md0 -r /dev/sdb #将损坏的磁盘移除RAID组
mdadm: hot removed /dev/sdb from /dev/md0
[root@localhost ~]# mdadm /dev/md0 -a /dev/sdf #添加一块磁盘到RAID组
mdadm: added /dev/sdf
[root@localhost ~]# mdadm -D /dev/md0 #查看RAID组的成员状态
/dev/md0:
.............#省略部分内容
Number Major Minor RaidDevice State
3 8 64 0 active sync /dev/sde
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
5 8 80 - spare /dev/sdf
#新添加的磁盘已经成为了RAID组的预备磁盘
4、将RAID组重设置为普通磁盘
[root@localhost ~]# umount /test
[root@localhost ~]# vim /etc/fstab
.............#省略部分内容
UUID=93830b3a-69e4-4cbf-b255-f43f2ae4864b /test xfs defaults 0 0
#将设置的RAID 5自动挂载删除
[root@localhost ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
#损坏RAID的超级区块
[root@localhost ~]# mdadm --stop /dev/md0 #停止RAID的使用
mdadm: stopped /dev/md0
#以下操作是将RAID中成员磁盘的超级块信息覆盖
[root@localhost ~]# dd if=/dev/zero of=/dev/sdc bs=1M count=10
[root@localhost ~]# dd if=/dev/zero of=/dev/sdd bs=1M count=10
[root@localhost ~]# dd if=/dev/zero of=/dev/sde bs=1M count=10
[root@localhost ~]# dd if=/dev/zero of=/dev/sdf bs=1M count=10
[root@localhost ~]# cat /proc/mdstat #确认下面不存在该RAID
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>
经过以上操作即恢复成了普通磁盘,但是原本的数据都没有了,后续使用没有深入研究,可以使用一些重新检测的命令进行系统扫描或者重启系统,即可挂载使用,否则可能会挂载不上。
重新检测命令:
[root@localhost ~]# partprobe /dev/sdc
———————— 本文至此结束,感谢阅读