什么是RAID?
RAID全称:
Redundant Arrays of Inexpensive(Independent) Disks
RAID来历:
1988年由加利福尼亚大学伯克利分校的一个教授所提出的。
RAID阵列的优势:
- 多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供
- 提高IO能力:磁盘并行读写
- 提高耐用性:磁盘冗余来实现
- 多级别:多块磁盘组织在一起的工作方式不同,所达到的效果不同,满足各种需求
RAID的实现方式
- 外接式磁盘阵列:通过扩展卡提供适配能力
- 内接式RAID:主板集成RAID控制器安装OS前在BIOS里配置
- 软件RAID:通过OS实现
各级别的RAID
注:RAID级别的不同,所能提升的方面各有所不不同, 且成本也不同在试验中软RAID生成的磁盘名可能是/dev/mdN,但是在实际的生产环境中,生成的磁盘名是/dev/sdN,可能你正在使用的那块硬盘就是通过RAID阵列生成的。
常见的RAID level :
RAID-0:0, 条带卷,strip;
RAID-1: 1, 镜像卷,mirror;
RAID-2
..
RAID-5
RAID-6
RAID10
RAID01
RAID50
..
非混合RAID
RAID-0
读、写性能提升;
可用空间:N*min(S1,S2,…)
无容错能力
最少磁盘数:2, 2+
在企业中基本被淘汰,就不过多描述了。
RAID-1
读性能提升、写性能略有下降;
可用空间:1*min(S1,S2,…)
有冗余能力
最少磁盘数:2, 2N
在企业中基本被淘汰,就不过多描述了。
RAID-4
多块数据盘异或运算值,存于专用校验盘
RAID-5
读、写性能提升
可用空间:(N-1)*min(S1,S2,…)
有容错能力:允许最多1块磁盘损坏
最少磁盘数:3, 3+
RAID-6
读、写性能提升
可用空间:(N-2)*min(S1,S2,…)
有容错能力:允许最多2块磁盘损坏
最少磁盘数:4, 4+
RAID混合类型级别
RAID-10
读、写性能提升
可用空间:N*min(S1,S2,…)/2
有容错能力:每组镜像最多只能坏一块
最少磁盘数:4, 4+
还有
RAID-01
RAID-50
…
RAID7: 可以理解为一个独立存储计算机,自身带有操作系 统和管理工具,可以独立运行,理论上性能最高的RAID模式
注:在一些小型的公司,对硬盘要求不是太高的,一般是使用raid5或是raid10这两种,我下面重点介绍一下raid5这种阵列。
RAID-5实验
详细过程:全程用VM ContOS6软件raid模拟真实阵列。
先分区
- 首先,raid5这个阵列,最少要3块硬盘。我选择加入4块硬盘,3块使用,一块作为备用盘。
- 加入硬盘后,使用命令识别新加入的硬盘
echo '- - -' > /sys/class/scsi_host/host2/scan
- 比如我现在使用lsblk命令可以看到新加入的4块硬盘sdb;sdc;sdd;sde.
[ root@centos6 ~ ]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 5.8G 0 rom /media/cdrom
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1000M 0 part /boot
├─sda2 8:2 0 48.8G 0 part /
├─sda3 8:3 0 39.1G 0 part /app
├─sda4 8:4 0 1K 0 part
├─sda5 8:5 0 2G 0 part [SWAP]
└─sda6 8:6 0 10G 0 part /home
sdb 8:16 0 20G 0 disk
sdc 8:32 0 21G 0 disk
sdd 8:48 0 22G 0 disk
sde 8:64 0 23G 0 disk
- 接下来,我先对sdb盘进行分区。
[ root@centos6 ~ ]# fdisk /dev/sdb(首先对/dev/sdb分区)
- 选择新的分区,使用n(new的意思)
Command (m for help): n
- 选着分区已经存在的,还是新建分区(1-4)里面的一个,我选着新建分区1
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
- 选着从哪个柱面开始,一般新硬盘选择默认的就好了,我选择默认的,直接按回车键。
First cylinder (1-2610, default 1):
- 我只取其中的1G大小加入我待会要创建的raid5阵列中。
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +1G
- 这个时候在选择修改你所选择的分区的ID,输入t可以开始修改了,如果不知道所要的修改的ID,可以输入L查看ID。raid的ID是fd.
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)
- 最后一步了,输入w进行保存即可.
Command (m for help): w
The partition table has been altered!
- 使用lsblk命令我们可以看到,sdb1分区已经出现了
sdb 8:16 0 20G 0 disk
└sdb1 8:17 0 1G 0 part
sdc 8:32 0 21G 0 disk
sdd 8:48 0 22G 0 disk
sde 8:64 0 23G 0 disk
可能有的朋友会发现sdb上并没有出现新的分区,那是因为不是是有那个的干净的新磁盘,那么可以使用命令同步。比如:
partx -a /dev/sdb
接下来有两种方法来实现分出接下来的3个分区
其一是按照上面的过程重复sdb1的分区过程,但是这样稍显麻烦。
其二则是使用dd命令,复制前512个字节,覆盖c,d,e的前512个字节。但是这样,只能分出来的区都是一样的大小。如要求所分区的大小不一样,使用第一种方法继续分区。
而我接下来使用dd命令来对sdc,d,e来分区:
dd if=/dev/sdb of=/dev/sdc bs=1 count=512
dd if=/dev/sdb of=/dev/sdd bs=1 count=512
dd if=/dev/sdb of=/dev/sde bs=1 count=512
partx -a /dev/sdc
partx -a /dev/sdd
partx -a /dev/sde
- 使用lsblk命令可以看到我们分区已经完成了。
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 1G 0 part
sdc 8:32 0 21G 0 disk
└─sdc1 8:33 0 1G 0 part
sdd 8:48 0 22G 0 disk
└─sdd1 8:49 0 1G 0 part
sde 8:64 0 23G 0 disk
└─sde1 8:65 0 1G 0 part
创建RAID5阵列
mdadm这个模式化工具可以帮助我们实现阵列的创建。
顺便介绍一下mdadm的选项:
###模式:
创建:-C
装配:-A
监控:-F
管理:-f, -r, -a
###-C: 创建模式
-n #: 使用#个块设备来创建此RAID;
-l #:指明要创建的RAID的级别;
-a {yes|no}:自动创建目标RAID设备的设备文件;
-c CHUNK_SIZE: 指明块大小;
-x #: 指明空闲盘的个数;
###-D:显示raid的详细信息;
mdadm -D /dev/md#
###管理模式:
-f: 标记指定磁盘为损坏;
-a: 添加磁盘
-r: 移除磁盘
- 使用mdadm模式命令来建立软件raid5硬盘/dev/md5
[ root@centos6 ~ ]# mdadm -C /dev/md5 -l 5 -n3 -x 1 /dev/sd{b,c,d,e}1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.
- 接下来可以使用mdadm -D来查看这个阵列信息
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
(我们可以很清楚的看到,sd{bcd}1在使用中,而sde1作为空闲备用盘放在一旁。)
使用raid5这块硬盘
- 首先生成/dev/md5的配置文件信息,并导入/etc/mdadm.conf
[ root@centos6 ~ ]# mdadm -Ds /dev/md5
ARRAY /dev/md5 metadata=1.2 spares=1 name=centos6.9.magedu.com:5 UUID=fe8be162:1edb9d6d:e5df979b:e7be14bd
[ root@centos6 ~ ]# mdadm -Ds /dev/md5 > /etc/mdadm.conf
- 对/dev/md5进行格式化,这里我选择ext4格式
[ root@centos6 ~ ]# mkfs.ext4 /dev/md5
- 创建/mnt/raid5目录,且挂载/dev/md5到/mnt/raid5上
[ root@centos6 ~ ]# mkdir /mnt/raid5
[ root@centos6 ~ ]# mount /dev/md5 /mnt/raid5/
(这样我们就可以愉快的在这块raid上输入输出了…)
- 使用df命令,查看是否已经挂载上了。
[ root@centos6 /mnt/raid5 ]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 50264772 5270400 42434372 12% /
tmpfs 502056 76 501980 1% /dev/shm
/dev/sda3 40185208 76504 38060704 1% /app
/dev/sda1 991512 34904 905408 4% /boot
/dev/sda6 10192924 123080 9545412 2% /home
/dev/sr0 6048356 6048356 0 100% /media/cdrom
/dev/md5 2018796 51728 1861188 3% /mnt/raid5
(很明显,我们可以在最后面看到/dev/md5已经挂载了)
模拟出现故障
- 假如现在,sdd1硬盘坏掉了,我们模拟出这种情况下,看raid5阵列的应对方式。
[ root@centos6 /mnt/raid5 ]# mdadm /dev/md5 -f /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md5
[ root@centos6 /mnt/raid5 ]# mdadm -D /dev/md5
Update Time : Sun Aug 13 03:49:38 2017
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
3 8 65 2 spare rebuilding /dev/sde1
4 8 49 - faulty /dev/sdd1
(我们现在可以看到,state里面出现了degraded, recovering,Working Devices少了1,且,空闲盘/dev/sde1已经顶替了之前的/dev/sdd1的位子,而/dev/sdd1则进入了faulty状态。)
- 假如,我们现在在模拟破坏一个硬盘呢?比如sde1?
[ root@centos6 /mnt/raid5 ]# mdadm /dev/md5 -f /dev/sde1
mdadm: set /dev/sde1 faulty in /dev/md5
[ root@centos6 /mnt/raid5 ]# mdadm -D /dev/md5
Update Time : Sun Aug 13 03:53:48 2017
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 2
Spare Devices : 0
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
4 0 0 4 removed
3 8 65 - faulty /dev/sde1
4 8 49 - faulty /dev/sdd1
(这下工作盘又减少了1,/dev/sde1也进入了faulty状态,虽然上面的级别还是raid5显示,但是实际上已经进入了降级状态,且存储读取速度大大降低)
- 比如现在我们修好了硬盘,我们该怎么加入进去呢?
因为我们这是模拟的,我们要先把sde1和sdd1删掉,不然,系统默认这两个盘是坏的,且还在装载服务器上,是不能在直接加进去的,而生产中则是通过一系列的取消挂载等等操作后再拔下来。
[ root@centos6 /mnt/raid5 ]# mdadm /dev/md5 -r /dev/sde1
mdadm: hot removed /dev/sde1 from /dev/md5
[ root@centos6 /mnt/raid5 ]# mdadm /dev/md5 -r /dev/sdd1
mdadm: hot removed /dev/sdd1 from /dev/md5
- 这个时候我们再把硬盘加上去。使用mdadm -D查看是否加上去了。
[ root@centos6 /mnt/raid5 ]# mdadm /dev/md5 -a /dev/sdd1
mdadm: added /dev/sdd1
[ root@centos6 /mnt/raid5 ]# mdadm /dev/md5 -a /dev/sde1
mdadm: added /dev/sde1
[ root@centos6 /mnt/raid5 ]# mdadm -D /dev/md5
Update Time : Sun Aug 13 04:06:32 2017
State : clean
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
3 8 49 2 active sync /dev/sdd1
4 8 65 - spare /dev/sde1
(可以看出,state又恢复了clean状态,工作盘也是4个了,sde1又变成了之前的空闲备用盘了)
测试raid5性能
- 这里我用dd /dev/zero 往/dev/md5里面写1G的东西
[ root@centos6 /mnt/raid5 ]# dd if=/dev/zero of=f1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 3.65511 s, 287 MB/s
(可以很清楚的看出,写速度是287MB/s的速度)
- 那我们在测试读性能
[ root@centos6 /mnt/raid5 ]# dd if=f1 of=/dev/null
2048000+0 records in
2048000+0 records out
1048576000 bytes (1.0 GB) copied, 1.57253 s, 667 MB/s
(读性能在我这破本本上达到了惊人的667MBMB/s,感觉不科学…)
- 再看看我在其他普通盘上的读写速度
写速度
[ root@centos6 ~ ]# dd if=/dev/zero of=f1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 17.3834 s, 60.3 MB/s
读速度
[ root@centos6 ~ ]# dd if=f1 of=/dev/null
2048000+0 records in
2048000+0 records out
1048576000 bytes (1.0 GB) copied, 16.4121 s, 63.9 MB/s
(我的本本是机械硬盘,可以很明显的看到读写都是在60MB左右。)
个人评价
对于使用软件raid5阵列模拟生产所测验出的数据,我持怀疑态度,
第一,我使用的是机械硬盘,根本不可能出现600+MB/s这种不科学的速度
第二,不管怎么样,我终究其实还是在一块硬盘上在操作,这种数据,可能只是模拟出来的假象。
第三,就算是在真实环境中,使用raid5这个阵列,在一切最理想的的条件下,使用3块工作硬盘,应该也只能达到2倍的速度。
但是,这只是模拟出来,让我们学习原理,以及怎么使用的。以上只是吐槽….
以上的信息只是个人观点,欢迎各位大神指出小白的错误之处,感激不尽。