linux学习日记十三 软件磁盘阵列RAID
磁盘阵列的英文全称是redundant arrays of inexpensive disks(raid),即容错廉价磁盘阵列。可以通过一些技术将多个较小的磁盘整合成为一个较大的磁盘设备;而这个设备可不止存储功能而已,它还具有数据保护功能。
raid的等级:
× raid-0(等量模式,stripe):性能较佳
这种模式使用相同型号和容量的磁盘来组成,可以有多个,raid会将每个磁盘划分成等量的区块(一般为4k,2k等等),然后当一个文件被写入时,该文件会依据块大小切割好,之后依序放到各个磁盘里面去,由于每个磁盘交错存放数据,因此当你的数据要写入raid时,数据会被等量的放置到各个磁盘上去。越多磁盘组成raid-0,那么的话性能肯定就越好了。
缺点:一个磁盘挂点,整个文件系统崩盘,无法恢复了。并且所有磁盘容量必须一样,不然性能会下降。
× raid-1(映像模式,mirror):完整备份
这种模式也要相同型号,相同容量的磁盘,最好完全一样,一个模子刻出来的。
数据传送到i/o总线被复制多份到各个磁盘,因此写的性能会变得很差,不过如果你用硬件raid(磁盘阵列卡),磁盘阵列卡会主动帮你复制,不需要i/o总线。但是磁盘阵列卡很贵滴呀呀,我买不起,所以很悲剧。raid-1最大的用途在于备份,不过它的读取性能很好。
× raid 0+1, raid 1+0
raid-0的性能较佳但是数据不安全,raid-1数据安全但是性能不佳,那能不能组合下撒。
raid 0+1:先让n块磁盘组成raid-0, 同时再让另外的n块磁盘也组成raid-0, 这样子我得到了两组raid-0,然后将这两组raid-0再组成一组raid-1。
raid 1+0:先让2n块磁盘组成n个组,每个组两个磁盘,每个组里面的两个磁盘组成raid-1, 然后将这n组raid-1组成raid-0。
缺点:磁盘有一半的容量用来做备份了,悲剧呀!!!
raid-5:性能与数据备份的均衡考虑
raid-5至少需要三块以上的磁盘才能组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似raid-0,不过每次循环写入过程中,在每块磁盘还加入一个同位检查数据(parity),这个数据会记录其他磁盘的备份数据,用于当有磁盘损毁时的救援。
raid-5的容量要减掉一个磁盘容量,也就是阵列的磁盘总数n-1,因为需要一个磁盘容量来保存同位检查数据parity
raid-5的读取性能很不错,跟raid-0有得一拼,但是写入性能就很尴尬了,在软件磁盘阵列的时候,cpu还得花时间去计算同位检查数据。同时它只能保证一个磁盘损坏数据的安全,如果两个磁盘损坏就挂了。
raid-6:跟raid-5类似,不过这次会使用两块磁盘容量作为parity的存储,它可以支持两块磁盘同时损坏,这个概率应该比走在马路上被一辆驴车撞到的概率还低吧,^_^
====spare disk:预备磁盘的功能====
为了让系统可以实时在坏掉磁盘时主动重建,需要预备磁盘spare disk的辅助,平时不包含在磁盘阵列中,当磁盘阵列有任何磁盘损坏时,spare disk马上被主动拉入磁盘阵列中,并将坏掉的磁盘移除磁盘阵列,然后立即重建数据系统,如果你的磁盘阵列还支持热插拔就更爽了,因为这个时候只需要把坏的那颗磁盘拔下来,换上一个新的,再将新的磁盘设置成spare disk,完成了,不用关机重启可以完成一切。这对服务器的稳定性有很好的帮助。
磁盘阵列的优点:
× 数据安全与可靠性,这里指的是硬盘坏了数据可以挽回。
× 读写性能,raid-0可以加强读写性能,让你的系哦i/o系统部分得以改善
× 容量:可以让多个磁盘组合起来,因此单一文件系统可以有相当大的容量。
centos提供的软件磁盘阵列为mdadm这套软件,以分区或磁盘为单位,也就是说你不需要多个磁盘就可以设计你的磁盘阵列了。此外,mdadm支持刚刚提到的raid-0,raid-1,raid-5等级,还支持spare disk的功能。而且提供的管理机制还可以达到类似可以热插拔的功能,可以在线(文件系统正常使用)进行分区的抽换,使用上非常的方便。。
注意:硬盘磁盘阵列在linux看起来就是一个大的磁盘,所有设备文件名为/dev/sd[a-p],因为使用到scsi的模块的原因。而软件磁盘阵列因为是系统仿真,因此使用的设备文件名时系统的设备文件,文件名为/dev/md0, /dev/md1,两者注意区别。
====软件磁盘阵列的设置====
# mdadm –detail /dev/md0
# mdadm –create –auto=yes /dev/md[0-9] –raid-device=4 –level=[015] –spare-device=2 /dev/sd5 /dev/sd6
–create:为新建raid的参数
–auto=yes:决定新建后面接的软件磁盘阵列设备,即/dev/md0, /dev/md1等
–raid-devices=n:使用n个磁盘作为磁盘阵列的设备
–spare-devices=n:使用n个磁盘作为备用spare设备
–level=[015]:设置磁盘阵列的等级。支持很多,不过建议只要用0,1,5即可
–detail:后面所接的那个磁盘阵列设备的详细信息
注意最后面接的设备文件名,可以时整块磁盘,比如/dev/sdb,也可以是一个分区,比如/dev/sdb1,不过这些设备文件名的数量总数必须等于–raid-devices和–spare-devices的个数总和才行。
下面我来试试建立一个raid-5的软件磁盘阵列,貌似这个比较常用,很适合。
我希望这个raid-5环境时这样子的:
× 利用4个分区组成raid-5
× 每个分区大约为1g大小,需要确定每个分区一样大较佳
× 另外加一个分区设置为sparedisk
× 这个sparedisk的大小与其他raid所需分区一样大
× 将此raid-5设备挂载到/mnt/raid目录下面
先用fdisk构建5个1g的分区:
# fdisk /dev/sda
前面省略。。。
command (m for help):n
每次分1000m空间大小,注意,我不知道神马原因,first 扇区要手动输入,用p选项查看后,用最后一个分区的扇区号+2049才是第一个空闲扇区号,这个可能时fedora的一个bug,分区居然不是连续的,不管了,自己去试试。囧
最后的分区用p查看后,是这样子的:
设备 boot start end blocks id system
/dev/sda1 2048 206847 102400 7 hpfs/ntfs/exfat
/dev/sda2 * 206848 169859071 84826112 7 hpfs/ntfs/exfat
/dev/sda3 169859072 462827821 146484375 7 hpfs/ntfs/exfat
/dev/sda4 462829568 976773119 256971776 5 extended
/dev/sda5 462833664 463243263 204800 83 linux
/dev/sda6 463245312 631181311 83968000 83 linux
/dev/sda7 631183360 799119359 83968000 83 linux
/dev/sda8 799121408 803315711 2097152 82 linux swap / solaris
/dev/sda9 803317760 805365759 1024000 83 linux
/dev/sda10 805367808 807415807 1024000 83 linux
/dev/sda11 807417856 809465855 1024000 83 linux
/dev/sda12 809467904 811515903 1024000 83 linux
/dev/sda13 811517952 813565951 1024000 83 linux
后面的从9到13就是刚刚我分的5个分区,每个大概1g,大小都相同。
# partprobe
接下来就简单啦啦,,通过mdadm来创建磁盘阵列吧。哦也
# mdadm –create –auto=yes /dev/md0 –level=5 –raid-devices=4 –spare-devices=1 /dev/sda{9,10,11,12,13}
查看下(等下,先去喝杯咖啡先,因为如果你直接立马运行,可能出现下面的正在building数据的信息):
# mdadm --detail /dev/md0
/dev/md0: <==raid设备文件名
version : 1.2
creation time : sun oct 28 10:03:43 2012 <==raid被创建的时间
raid level : raid5 <==此raid的等级
array size : 3068928 (2.93 gib 3.14 gb) <==此raid可用磁盘容量
used dev size : 1022976 (999.17 mib 1047.53 mb) <==每个设备可用容量
raid devices : 4 <==用作raid的设备数量
total devices : 5 <==全部的设备数量
persistence : superblock is persistent
update time : sun oct 28 10:04:01 2012
state : clean, degraded, recovering
active devices : 3 <==启动的(active)设备数量
working devices : 5 <==可工作的设备数量
failed devices : 0 <==出现错误的设备数量
spare devices : 2 <==预备spare磁盘的数量
layout : left-symmetric
chunk size : 512k
rebuild status : 17% complete
name : localhost.localdomain:0 (local to host localhost.localdomain)
uuid : 657db303:887c7b6f:b8d8fc91:dc7b3374
events : 3
number major minor raiddevice state
0 8 9 0 active sync /dev/sda9
1 8 10 1 active sync /dev/sda10
2 8 11 2 active sync /dev/sda11
5 8 12 3 spare rebuilding /dev/sda12
4 8 13 - spare /dev/sda13
真正的完成build后的信息应该是:
# mdadm --detail /dev/md0
/dev/md0:
version : 1.2
creation time : sun oct 28 10:03:43 2012
raid level : raid5
array size : 3068928 (2.93 gib 3.14 gb)
used dev size : 1022976 (999.17 mib 1047.53 mb)
raid devices : 4
total devices : 5
persistence : superblock is persistent
update time : sun oct 28 10:06:00 2012
state : clean
active devices : 4
working devices : 5
failed devices : 0
spare devices : 1
layout : left-symmetric
chunk size : 512k
name : localhost.localdomain:0 (local to host localhost.localdomain)
uuid : 657db303:887c7b6f:b8d8fc91:dc7b3374
events : 20
number major minor raiddevice state
0 8 9 0 active sync /dev/sda9
1 8 10 1 active sync /dev/sda10
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
4 8 13 - spare /dev/sda13
还可以通过查看/proc/mdstat查看磁盘阵列情况:
# cat /proc/mdstat
personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sda12[5] sda13[4](s) sda11[2] sda10[1] sda9[0]
3068928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [uuuu]
unused devices: <none>
格式化与挂载使用raid:
# mkfs -t ext4 /dev/md0
# mkdir /mnt/raid
# mount /dev/md
# mount /dev/md0 /mnt/raid
# df
文件系统 1k-块 已用 可用 已用% 挂载点
rootfs 82649712 4681980 73769332 6% /
devtmpfs 1964632 4 1964628 1% /dev
tmpfs 1975352 600 1974752 1% /dev/shm
tmpfs 1975352 1160 1974192 1% /run
/dev/sda6 82649712 4681980 73769332 6% /
tmpfs 1975352 0 1975352 0% /sys/fs/cgroup
tmpfs 1975352 0 1975352 0% /media
/dev/sda7 82649712 8355056 70096256 11% /home
/dev/sda5 198337 90718 97379 49% /boot
/dev/md0 3020688 70048 2797196 3% /mnt/raid
看到了吧,最后一个,是不是很有成就感,=_=
====仿真raid错误的救援模式====
# mdadm –manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备]
–add:将后面的设备加入到这个md中
–remove:将后面的设备从这个md中删除
–fail:将后面的设备设置成出错的状态
手动模拟磁盘错误:
# cp -a /etc /var/log /mnt/raid/
# df -h /mnt/raid/; du -smh /mnt/raid/*
文件系统 容量 已用 可用 已用% 挂载点
/dev/md0 2.9g 126m 2.7g 5% /mnt/raid
45m /mnt/raid/etc
4.4m /mnt/raid/log
16k /mnt/raid/lost+found
# mdadm –manage /dev/md0 –fail /dev/sda10
mdadm: set /dev/sda10 faulty in /dev/md0
然后马上查看状态,这个动作要快点,因为raid会自动重建数据系统:
# mdadm --detail /dev/md0
/dev/md0:
version : 1.2
creation time : sun oct 28 10:03:43 2012
raid level : raid5
array size : 3068928 (2.93 gib 3.14 gb)
used dev size : 1022976 (999.17 mib 1047.53 mb)
raid devices : 4
total devices : 5
persistence : superblock is persistent
update time : sun oct 28 10:24:42 2012
state : clean, degraded, recovering
active devices : 3
working devices : 4
failed devices : 1
spare devices : 1
layout : left-symmetric
chunk size : 512k
rebuild status : 6% complete
name : localhost.localdomain:0 (local to host localhost.localdomain)
uuid : 657db303:887c7b6f:b8d8fc91:dc7b3374
events : 23
number major minor raiddevice state
0 8 9 0 active sync /dev/sda9
4 8 13 1 spare rebuilding /dev/sda13
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
1 8 10 - faulty spare /dev/sda10
喝完咖啡后,看一下(其实也就1分钟左右)
# mdadm --detail /dev/md0
/dev/md0:
version : 1.2
creation time : sun oct 28 10:03:43 2012
raid level : raid5
array size : 3068928 (2.93 gib 3.14 gb)
used dev size : 1022976 (999.17 mib 1047.53 mb)
raid devices : 4
total devices : 5
persistence : superblock is persistent
update time : sun oct 28 10:26:53 2012
state : clean
active devices : 4
working devices : 4
failed devices : 1
spare devices : 0
layout : left-symmetric
chunk size : 512k
name : localhost.localdomain:0 (local to host localhost.localdomain)
uuid : 657db303:887c7b6f:b8d8fc91:dc7b3374
events : 43
number major minor raiddevice state
0 8 9 0 active sync /dev/sda9
4 8 13 1 active sync /dev/sda13
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
1 8 10 - faulty spare /dev/sda10
看到了吧,不用我来给你解释了吧。
接下来,我将出错的磁盘删除并加入新的磁盘:
首先,先新建一个新的分区,这个分区大小要与其他的分区一样大才好。然后再用mdadm删除错误的并加入新的
# fdisk /dev/sda
….下面建新分区步骤省略,如果不知道怎么建,参考我的企鹅日记(一)
# partprobe
# partprobe
[root@localhost ~]# mdadm –manage /dev/md0 –add /dev/sda14 –remove /dev/sda10
mdadm: added /dev/sda14
mdadm: hot removed /dev/sda10 from /dev/md0
# mdadm --detail /dev/md0
/dev/md0:
version : 1.2
creation time : sun oct 28 10:03:43 2012
raid level : raid5
array size : 3068928 (2.93 gib 3.14 gb)
used dev size : 1022976 (999.17 mib 1047.53 mb)
raid devices : 4
total devices : 5
persistence : superblock is persistent
update time : sun oct 28 10:33:04 2012
state : clean
active devices : 4
working devices : 5
failed devices : 0
spare devices : 1
layout : left-symmetric
chunk size : 512k
name : localhost.localdomain:0 (local to host localhost.localdomain)
uuid : 657db303:887c7b6f:b8d8fc91:dc7b3374
events : 45
number major minor raiddevice state
0 8 9 0 active sync /dev/sda9
4 8 13 1 active sync /dev/sda13
2 8 11 2 active sync /dev/sda11
5 8 12 3 active sync /dev/sda12
6 8 14 - spare /dev/sda14
看到了吧,结果不用我解释了吧。。哈哈
而这一切的一切都是online的状态下完成的,是不是很nb呢 =_=
====开机自动挂载raid====
只需要知道/dev/md0的uuid就行
# mdadm –detail /dev/md0 | grep -i uuid
uuid : 657db303:887c7b6f:b8d8fc91:dc7b3374
# vi /etc/mdadm.conf
array /dev/md0 uuid=657db303:887c7b6f:b8d8fc91:dc7b3374
# vi /etc/fstab,在最后一行加入
/dev/md0 /mnt/raid ext4 defaults 1 2
测试下可行否(这个很重要,因为如果fstab修改不对可能导致开不了机器)
# umount /dev/md0; mount -a
[root@localhost ~]# df /mnt/raid/
文件系统 1k-块 已用 可用 已用% 挂载点
/dev/md0 3020688 120464 2746780 5% /mnt/raid
ok,没有问题,那么你就可以重启了,看是不是自动挂载了呢。
====关闭raid====
1,先卸载
# umount /dev/md0
2,删除配置文件内容:
# vi /etc/fstab,删除(注释)下面这行
/dev/md0 /mnt/raid ext4 defaults 1 2
3,关闭/dev/md0:
# mdadm –stop /dev/md0
4,# cat /proc/mdstat
personalities : [raid6] [raid5] [raid4]
unused devices: <none>
5,vi /etc/mdadm.conf,删除(注释)下面的行
array /dev/md0 uuid=657db303:887c7b6f:b8d8fc91:dc7b3374
好的,所有的raid的基本都讲完了。不过上面我用的时一块磁盘,实际用途中记得用多块磁盘啊!!
=======================================end=========================================
上一篇: Linux文件系统损坏原因分析及修复方法