9. raid镜像卷


Raid 发展到现在,已经不是简单的条带化了,还生出了其他的类型,那么
这里叫做Raid level(级别),这个级别仅代表磁盘组织方式不同,没有上
下之分。不仅有速度,还要考虑数据可用性,

软raid
计算机核心部件:CPU、内存
IDE: 133Mbps
SATA: 300Mbps,600Mbps,6Gbps
USB 3.0: 480Mbps
SCSI: Small Computer System Interface
早期,硬盘容量很小,还没有现在的U盘空间大,性能并不稳定,这是大多
数,当然也有相对比较好的,但价格非常的昂贵,所以人们就在想办法,
我能不能有多个硬盘绑定成一块,让系统认为只是一块硬盘,1987年Raid
技术兴起。美国的一个大学开发出的,当时叫做廉价冗余磁盘阵列,后来
改名叫做独立冗余磁盘阵列。

Raid 0(条带): 读写速度得到提升,但不具备数据冗余,不推荐
最少2块硬盘
Raid 1(镜像): 写性能下降,读性能提升,相反冗余能力提升。但磁盘利用
率是1/2,最少2块硬盘
Raid 1+0: 同组不能都坏掉,目前主流的方案。最少4块
Raid 0+1: 同组都可以坏,不能是不同组的相同标号。最少4块硬盘
Raid 0+1 和Raid1+0的空间利用率都是1/2
Raid 5(校验码机制):读写都提升,冗余有,空间利用率(n-1)/n 只能坏一
块。最少3块硬盘
异或运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;即:参加运算的
两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则
为0。
Raid 6 可以看做是raid5的升级版,它支持同时损坏2块磁盘。最少是4块

Raid 7 可以看做是raid5的升级版,它支持同时损坏3块磁盘。最少是5块

Raid 50 拓展
那么到底怎么实现软raid?
md: 内核模块。
mdadm:将任何块设备做成RAID,意味着分区也可以做,但没有意义,
为什么那?做实验而已。
模式化的命令:
创建模式: -C 管理模式:--add,--del mdadm /dev/* --fail /dev/sd*
监控模式: -F
增长模式: -G
装配模式: -A
创建模式 -C
//环境要求: 新添加一块磁盘,大小为10G。并且分区,先分2个分区,每
个分区大小为1G.(fdisk或者gdisk都可以)
[root@bash ~]# echo "- - -" >>
/sys/class/scsi_host/host0/scan
[root@bash ~]# echo "- - -" >>
/sys/class/scsi_host/host1/scan
[root@bash ~]# echo "- - -" >>
/sys/class/scsi_host/host2/scan
[root@bash ~]# fdisk -l
...
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520
sectors
Units = sectors of 1 * 512 = 512 bytes
...
Raid0 :
创建一个2G的Raid 0
思路:可以使用4个512M的分区,也可以使用2个1G的分区。再提醒大家
一次,这里我们用分区做的是没有意义的,只不过是演示过程。
专用选项:
-l: 指定级别
-n: 设备个数
-a: {yes|no} 自动为其创建设备文件
-c: chunk大小,默认为64k,(数据块) 2的N次方
-x: 指定空闲盘的个数
//创建raid0
[root@bash ~]# 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@bash ~]# partprobe /dev/sdb
[root@bash ~]# partprobe /dev/sdb
[root@bash ~]# cat /proc/partitions
major minor #blocks name
...
8 17 1048576 sdb1
8 18 1048576 sdb2
[root@bash ~]# 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的设备
//格式化raid硬盘
//这里可以查看到我们刚才创建的硬盘信息,我们也格式化过了,然后就可
以直接挂在使用了。
[root@bash ~]# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
[root@bash ~]# 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
PS: 当然这个是临时挂载,也可以加入开机自动挂载,编辑/etc/fstab文件
即可,这里不再赘述。
Raid1
创建一个2G的Raid1(有效存储空间)
思路:想要创建2个一个2G的Raid1,那么假设说用两块硬盘来实现,那么每
一块大小应该是多大的那?对了,就是2G,而且它实际空间使用率只有
2G。那么就再创建2个2G的分区。
[root@bash ~]# mkdir /mnt/Raid0
[root@bash ~]# mount /dev/md0 /mnt/Raid0/
[root@bash ~]# mount | tail -1
/dev/md0 on /mnt/Raid0 type xfs
(rw,relatime,seclabel,attr2,inode64,sunit=1024,swidth=2048
,noquota)
[root@bash ~]# df -hT /mnt/Raid0/
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 2.0G 33M 2.0G 2% /mnt/Raid0
[root@bash ~]# 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@bash ~]# partprobe /dev/sdb
[root@bash ~]# partprobe /dev/sdb
[root@bash ~]# partprobe /dev/sdb
[root@bash ~]# cat /proc/partitions
...
8 17 1048576 sdb1
8 18 1048576 sdb2
8 19 2097152 sdb3
//直接用命令创建
8 20 2097152 sdb4
...
[root@bash ~]# 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@bash ~]# 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@bash ~]# mkdir /mnt/Raid1
[root@bash ~]# 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
//复制一个数据进去,然后模拟一块磁盘损坏,看一下还能不能访问。
//我们先来看一下Raid1 的相关详细信息,可以使用-D 或者 --detail
//模拟损坏一块磁盘/dev/sdb4,
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@bash ~]# mount /dev/md1 /mnt/Raid1/
[root@bash ~]# mount | tail -1
/dev/md1 on /mnt/Raid1 type xfs
(rw,relatime,seclabel,attr2,inode64,noquota)
[root@bash ~]# df -hT /mnt/Raid1/
Filesystem Type Size Used Avail Use% Mounted on
/dev/md1 xfs 2.0G 33M 2.0G 2% /mnt/Raid1
[root@bash ~]# cd /mnt/Raid1/
[root@bash Raid1]# echo jiayou > aixuexi
[root@bash Raid1]# cat aixuexi
jiayou
[root@bash Raid1]#
[root@bash Raid1]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
0 8 19 0 active sync
/dev/sdb3
1 8 20 1 active sync
/dev/sdb4
//然后再去查看刚才我们创建的信息是否还损坏。查看验证数据仍然存在且
可访问,说你那个raid1卷是有数据冗余功能的。
//到这里,如果真的硬盘损坏,我们可以在硬件设备上把它拔掉,那么这是
软Raid又要怎么实现那?用--remove
//那么现在我们的Raid1是瘸腿状态,如果另一块盘也挂掉的话,我们的数
据就会丢失,所以赶紧给补上一块盘,而且这里注意,对于硬盘大小,转
速各方面都要尽量一致。
//我们再来创建一个新的分区
[root@bash Raid1]# mdadm /dev/md1 -f /dev/sdb4
mdadm: set /dev/sdb4 faulty in /dev/md1
[root@bash Raid1]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
0 8 19 0 active sync
/dev/sdb3
- 0 0 1 removed
1 8 20 - faulty /dev/sdb4
[root@bash Raid1]# cat aixuexi
jiayou
[root@bash Raid1]# mdadm /dev/md1 -r /dev/sdb4
mdadm: hot removed /dev/sdb4 from /dev/md1
[root@bash Raid1]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
0 8 19 0 active sync
/dev/sdb3
- 0 0 1 removed
//将新添加分区,格式化
//然后通过管理命令里的-a 添加
[root@bash Raid1]# gdisk /dev/sdb
...
3 4196352 8390655 2.0 GiB FD00
Linux RAID
4 8390656 12584959 2.0 GiB FD00
Linux RAID
5 12584960 16779263 2.0 GiB FD00
Linux RAID
[root@bash Raid1]# partprobe /dev/sdb
[root@bash Raid1]# cat /proc/partitions
...
8 20 2097152 sdb4
8 21 2097152 sdb5
...
[root@bash 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
//到这里如果我们不想用这个raid1阵列了,要怎么办呐?可以停止某个阵
列,停止前先反挂载一下,这里注意,Raid卷存储的数据会随着反挂载而
丢失,注意提前迁移数据。
//那么然后我们又想重新使用了 又改怎么做那?这里我们故意将刚才模拟
损坏的盘(/dev/sdb4)再添加一下,
[root@bash Raid1]# mdadm /dev/md1 -a /dev/sdb5
mdadm: added /dev/sdb5
[root@bash Raid1]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
0 8 19 0 active sync
/dev/sdb3
2 8 21 1 active sync
/dev/sdb5
[root@bash ~]# umount /dev/md1
[root@bash ~]# df -hT /mnt/Raid1/
Filesystem Type Size Used Avail Use%
Mounted on
/dev/mapper/centos-root xfs 17G 1.3G 16G 8% /
[root@bash ~]# mdadm -S /dev/md1
mdadm: stopped /dev/md1
[root@bash ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
//这里看不到,是因为它本事是记录有损坏的信息的,那么我们不让他自动
识别,手动添加
//手动添加,可以看到同步信息
[root@bash ~]# mdadm -A /dev/md1 /dev/sdb{3,4}
mdadm: /dev/md1 assembled from 1 drive - need all 2 to
start it (use --run to insist).
[root@bash ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
[root@bash ~]# mdadm -AR /dev/md1 /dev/sdb{3,4}
mdadm: /dev/md1 has been started with 1 drive (out of 2).
[root@bash ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md1 : active raid1 sdb3[0]
2094080 blocks super 1.2 [2/1] [U_]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
[root@bash ~]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
0 8 19 0 active sync
/dev/sdb3
- 0 0 1 removed
[root@bash ~]# mdadm /dev/md1 -a /dev/sdb4
mdadm: added /dev/sdb4
[root@bash ~]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
0 8 19 0 active sync
/dev/sdb3
那么在我们raid的工作当中,其实你是感觉不到磁盘是否损坏的,当然,
raid有一个监控功能可以做到,如果损坏是可以发邮件的。而且也还有其他
的第三方的监控软件,这里我们都不再叙述,我们将另外一种思路,我们
都知道Raid1,是两块磁盘,那么我们可不可以多建立一个磁盘,让它一直
处于替补状态那?只不过这样又浪费了一块磁盘,不过为了数据安全,没
办法,该土豪就得土豪。
//可用命令模式 -a选项直接添加
//这时候我们再模拟坏一块硬盘(/dev/sdb3),看一下sdb5是否会自动顶上
去。结果是可以的。
2 8 20 1 spare rebuilding
/dev/sdb4
[root@bash ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md1 : active raid1 sdb4[2] sdb3[0]
2094080 blocks super 1.2 [2/2] [UU]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
[root@bash ~]# mdadm /dev/md1 -a /dev/sdb5
mdadm: added /dev/sdb5
[root@bash ~]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
0 8 19 0 active sync
/dev/sdb3
2 8 20 1 active sync
/dev/sdb4
3 8 21 - spare /dev/sdb5
//而且看到这里那,我们用-A的时候还是需要我们自己手动的去执行的,这
也不怎么自动啊?怎么让它实现自动啊?我们手动创建的信息导入到它的
配置文件里边,让它自己去识别就可以了。
//扫描你的raid磁盘信息
//然后再停止一下,重启,就方便多了
[root@bash ~]# mdadm /dev/md1 -f /dev/sdb3
mdadm: set /dev/sdb3 faulty in /dev/md1
[root@bash ~]# mdadm -D /dev/md1
...
Number Major Minor RaidDevice State
3 8 21 0 active sync
/dev/sdb5
2 8 20 1 active sync
/dev/sdb4
0 8 19 - faulty /dev/sdb3
[root@bash ~]# mdadm -D --scan
ARRAY /dev/md0 metadata=1.2 name=bash:0
UUID=f968a69a:78046043:1e77c572:a21ef721
ARRAY /dev/md1 metadata=1.2 name=bash:1
UUID=1cf56f75:f6939b5e:64005aba:cb12e366
[root@bash ~]# mdadm -D --scan > /etc/mdadm.conf
[root@bash ~]# mdadm -D --scan
ARRAY /dev/md0 metadata=1.2 name=bash:0
UUID=f968a69a:78046043:1e77c572:a21ef721
ARRAY /dev/md1 metadata=1.2 name=bash:1
UUID=1cf56f75:f6939b5e:64005aba:cb12e366
[root@bash ~]# mdadm -D --scan > /etc/mdadm.conf
[root@bash ~]# mdadm -S /dev/md1
mdadm: stopped /dev/md1
[root@bash ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>
Raid5
[root@bash ~]# mdadm -A /dev/md1
mdadm: /dev/md1 has been started with 2 drives.
[root@bash ~]# cat /proc/mdstat
Personalities : [raid0] [raid1]
md1 : active raid1 sdb5[3] sdb4[2]
2094080 blocks super 1.2 [2/2] [UU]
md0 : active raid0 sdb2[1] sdb1[0]
2093056 blocks super 1.2 512k chunks
unused devices: <none>


版权声明:本文为m0_68980728原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。