一、raid简介
1.软raid
计算机核心部件:CPU、内存
IDE(集成开发环境): 133Mbps
SATA(硬盘): 300Mbps,600Mbps,6Gbps
USB 3.0: 480Mbps
SCSI: Small Computer System Interface
早期,硬盘容量很小,还没有现在的U盘空间大,而且性能也不稳定。当然也有相对比较好的,但价格非常昂贵,所以人们就想能不能有多个硬盘绑定成一块,让系统认为只是一块硬盘。
1987年Raid技术兴起。美国的一个大学开发出来了,叫做廉价冗余磁盘阵列,后来改名叫做独立冗余磁盘阵列。
Raid发展到现在,已经不是简单的条带化了,还产生了其他的类型,叫做Raid level(级别)。这个级别仅代表磁盘组织方式不同,没有上下之分。不仅有速度,还要考虑数据可用性。
二、raid列举
1.Raid 0(条带)
读写速度得到提升,但不具备数据冗余,不推荐使用,最少需要2块硬盘。
应用场景:不要求安全,只要求速度。适合大规模并发读取。例如数据库从库,存储从库。
2.Raid 1(镜像)
相比raid 0写性能下降,读性能提升,冗余能力提升。但磁盘利用率是1/2,最少需要2块硬盘。
应用场景:只要求安全,对速度不要求。适合系统盘和监控服务器。
3.Raid 10
同组不能都坏掉,这是目前主流的方案。磁盘利用率是1/2,最少需要4块硬盘。
应用场景:对于性能和安全都要求的情况。例如高并发或高访问量数据库主库,存储主库。
4.Raid 01
同组都可以坏,不能是不同组的相同标号。磁盘利用率是1/2,最少需要4块硬盘。
5.Raid 5(校验码机制)
读写都提升,有数据冗余功能,空间利用率(n-1)/n,只能坏一块,最少需要3块硬盘。
应用场景:适合对性能和安全有一定要求但又不太高的情况。例如普遍数据库和存储库。
6.Raid 6
可以看做是raid 5的升级版,它支持同时损坏2块磁盘,最少需要4块硬盘。
7.Raid 7
可以看做是raid 5的升级版,它支持同时损坏3块磁盘,最少需要5块硬盘。
三、raid创建
那么到底怎么实现软raid呢?
md:内核模块。
mdadm:将任何块设备做成RAID,意味着分区也可以做。
常用命令
创建模式: -C
管理模式:--add,--del mdadm /dev/* --fail /dev/sd*
监控模式: -F
增长模式: -G
装配模式: -A
创建模式:-C
环境要求:新添加一块大小为10G的磁盘并且分区,先分2个分区,每个分区大小为1G(fdisk或gdisk都可以)。
[root@base ~]# echo "- - -" >> /sys/class/scsi_host/host0/scan
[root@base ~]# echo "- - -" >> /sys/class/scsi_host/host1/scan
[root@base ~]# echo "- - -" >> /sys/class/scsi_host/host2/scan
[root@base ~]# fdisk -l
...
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
...
[root@base ~]# gdisk /dev/sdb
...
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB FD00 Linux RAID
2 2099200 4196351 1024.0 MiB FD00 Linux RAID
[root@base ~]# partprobe /dev/sdb
[root@base ~]# cat /proc/partitions
major minor #blocks name
...
8 17 1048576 sdb1
8 18 1048576 sdb2
1.Raid 0:
示例:使用mdadm命令创建一个2G的raid 0
专用选项:
-l:指定级别
-n:设备个数
-a:{yes|no}自动为其创建设备文件
-c:chunk大小,默认为64k,(数据块)2的N次方
-x:指定空闲盘的个数
创建raid0
[root@base ~]# mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sdb{1,2}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
查看当前系统上所有启用raid的设备
[root@base ~]# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
对硬盘进行格式化操作
[root@base ~]# mkfs.xfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=8, agsize=65408 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=523264, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
然后就可以直接挂载使用
[root@base ~]# mkdir /mnt/raid0
[root@base ~]# mount /dev/md0 /mnt/raid0
[root@base ~]# df -hT /mnt/raid0
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/md0 xfs 2.0G 33M 2.0G 2% /mnt/raid0
如果想要开机自动挂载,可以直接编辑/etc/fstab文件。
[root@base ~]# vim /etc/fstab
/dev/md0 /mnt/raid0 xfs defaults 0 0
2.raid 1
创建一个2G的raid1
由于raid1的硬盘使用率是1/2,所以要想达到2G,则需要创建两块大小为2G的硬盘,我们可以再创建两个大小为2G的分区。
[root@base ~]# gdisk /dev/sdb
...
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB FD00 Linux RAID
2 2099200 4196351 1024.0 MiB FD00 Linux RAID
3 4196352 8390655 2.0 GiB FD00 Linux RAID
4 8390656 12584959 2.0 GiB FD00 Linux RAID
[root@base ~]# partprobe /dev/sdb
[root@base ~]# cat /proc/partitons
...
8 17 1048576 sdb1
8 18 1048576 sdb2
8 19 2097152 sdb3
8 20 2097152 sdb4
...
直接用命令创建
[root@base ~]# mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sdb{3,4}
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
[root@base ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md1 : active raid1 sdb4[1] sdb3[0]
2094080 blocks super 1.2 [2/2] [UU]
[==>..................] resync = 14.5%
(305536/2094080) finish=0.2min speed=101845K/sec
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
[root@base ~]# mkdir /mnt/Raid1
[root@base ~]# mkfs.xfs /dev/md1
meta-data=/dev/md1 isize=512 agcount=4, agsize=130880 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=523520, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@base ~]# mount /dev/md1 /mnt/Raid1
[root@base ~]# df -hT /mnt/Raid1
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/md1 xfs 2.0G 33M 2.0G 2% /mnt/Raid1
我们在其中创建一些数据,然后模拟一块磁盘损毁,看一下是否还可以看到那些数据。
[root@base ~]# cd /mnt/Raid1
[root@base Raid1]# echo "jiayou" > aixuexi
[root@base Raid1]# cat aixuexi
jiayou
使用命令mdadm -D /dev/md1查看raid1的相关信息
[root@base Raid1]# mdadm -D /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Jan 18 11:04:03 2021
Raid Level : raid1
Array Size : 2094080 (2045.00 MiB 2144.34 MB)
Used Dev Size : 2094080 (2045.00 MiB 2144.34 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Jan 18 11:07:22 2021
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : localhost.localdomain:1 (local to host localhost.localdomain)
UUID : 21a27a2d:d4210bb8:faa229da:09c63a7e
Events : 17
Number Major Minor RaidDevice State
0 8 19 0 active sync /dev/sdb3
1 8 20 1 active sync /dev/sdb4
模拟损坏一块磁盘sdb4并查看raid1的相关信息
[root@base Raid1]# mdadm /dev/md1 -f /dev/sdb4
mdadm: set /dev/sdb4 faulty in /dev/md1
[root@base Raid1]# mdadm -D /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Jan 18 11:04:03 2021
Raid Level : raid1
Array Size : 2094080 (2045.00 MiB 2144.34 MB)
Used Dev Size : 2094080 (2045.00 MiB 2144.34 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Jan 18 11:09:22 2021
State : active, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 1
Spare Devices : 0
Consistency Policy : resync
Name : localhost.localdomain:1 (local to host localhost.localdomain)
UUID : 21a27a2d:d4210bb8:faa229da:09c63a7e
Events : 20
Number Major Minor RaidDevice State
0 8 19 0 active sync /dev/sdb3
- 0 0 1 removed
1 8 20 - faulty /dev/sdb4
然后我们去查看刚才创建的数据是否还可以查看,结果证明还可以查看,所有raid1是具有数据冗余功能的,允许损坏一块磁盘。
[root@base Raid1]# cat aixuexi
jiayou
那么如果真的是磁盘损坏,我们可以在硬件设备上把它拔掉,软raid可以这样操作:
[root@base Raid1]# mdadm /dev/md1 -r /dev/sdb4
mdadm: hot removed /dev/sdb4 from /dev/md1
[root@base Raid1]# mdadm -D /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Jan 18 11:04:03 2021
Raid Level : raid1
Array Size : 2094080 (2045.00 MiB 2144.34 MB)
Used Dev Size : 2094080 (2045.00 MiB 2144.34 MB)
Raid Devices : 2
Total Devices : 1
Persistence : Superblock is persistent
Update Time : Mon Jan 18 11:10:41 2021
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : localhost.localdomain:1 (local to host localhost.localdomain)
UUID : 21a27a2d:d4210bb8:faa229da:09c63a7e
Events : 22
Number Major Minor RaidDevice State
0 8 19 0 active sync /dev/sdb3
- 0 0 1 removed
可是现在的raid1只剩下一块磁盘,如果这块也损坏就会造成数据丢失,所以我们可以再补上一块盘,需要注意的是,对于硬盘的大小、转速各方面都要尽量一致。
我们再创建一个分区:
[root@base Raid1]# gdisk /dev/sdb
[root@base Raid1]# partprobe /dev/sdb
[root@base Raid1]# cat /proc/partitions
然后对新添加的分区格式化
[root@base Raid1]# mkfs.xfs /dev/sdb5
meta-data=/dev/sdb5 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
然后通过管理命令里的-a添加
[root@base Raid1]# mdadm /dev/md1 -a /dev/sdb5
mdadm: added /dev/sdb5
[root@base Raid1]# mdadm -D /dev/md1
/dev/md1:
Version : 1.2
Creation Time : Mon Jan 18 11:04:03 2021
Raid Level : raid1
Array Size : 2094080 (2045.00 MiB 2144.34 MB)
Used Dev Size : 2094080 (2045.00 MiB 2144.34 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Jan 18 11:14:02 2021
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : localhost.localdomain:1 (local to host localhost.localdomain)
UUID : 21a27a2d:d4210bb8:faa229da:09c63a7e
Events : 41
Number Major Minor RaidDevice State
0 8 19 0 active sync /dev/sdb3
2 8 21 1 active sync /dev/sdb5
如果不想用raid1阵列了,可以停止这个阵列,不过停止前需要先反挂载一下。需要注意的是当进行反挂载时,数据会丢失,所以要提前做好数据迁移。
[root@localhost ~]# umount /dev/md1
[root@localhost ~]# mdadm -S /dev/md1
mdadm: stopped /dev/md1
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
raid1处于停止状态,那我们如果想要再次启用该怎么做呢?
这里我们可以将刚才模拟损坏的盘添加上
[root@base Raid1]# mdadm -A /dev/md1 /dev/sdb{3,4}
[root@base Raid1]# cat /proc/mdstat
这里看不到是因为它本身是记录有损坏的信息的,这时我们可以手动添加:
[root@base Raid1]# mdadm -AR /dev/md1 /dev/sdb{3,4}
[root@base Raid1]# cat /proc/mdstat
[root@base Raid1]# mdadm -D /dev/md1
进行手动添加:
[root@base Raid1]# mdadm /dev/md1 -a /dev/sdb4
mdadm: added /dev/sdb4
[root@base Raid1]# mdadm -D /dev/md1
[root@base Raid1]# cat /proc/mdstat
其实在工作当中,raid的损坏是感觉不到的。当然,raid有一个监控功能可以做到,如果损坏是可以发邮件的,而且也还有其他的第三方的监控软件。换一种思路,我们都知道Raid1是两块磁盘,那么可不可以多建立一个磁盘,让它一直处于替补状态。只不过这样又浪费了一块磁盘,不过为了数据安全,这样做是有必要的。
可用命令模式-a选项直接添加
[root@base Raid1]# mdadm /dev/md1 -a /dev/sdb5
mdadm: added /dev/sdb5
[root@base Raid1]# mdadm -D /dev/md1
这时我们再模拟一块磁盘损坏,看sdb5是否会补上空缺。
[root@base Raid1]# mdadm /dev/md1 -f /dev/sdb3
mdadm: set /dev/sdb3 faulty in /dev/md1
[root@base Raid1]# mdadm -D /dev/md1
结果显示,完全是可以自动补上空缺的。
现在回过头看下,刚才用-A进行添加时,还是需要手动执行。那么怎么才能让它实现自动呢。可以通过手动创建的信息导入到它的配置文件里,让它自己去识别就可以了。
[root@base Raid1]# mdadm -D --scan
[root@base Raid1]# mdadm -D --scan > /etc/mdadm.conf
[root@base Raid1]# mdadm -S /dev/md1
[root@base Raid1]# cat /proc/mdstat
[root@base Raid1]# mdadm -A /dev/md1
[root@base Raid1]# cat /proc/mdstat