RAID(Redundant Arrays of Inexpensive Independent Disks)被称为廉价冗余阵列,为了提高磁盘的性能或者保存数据完整,将多个磁盘合成一个“阵列”来提供更好的性能、冗余等。
RAID一般使用硬件raid,并配合指定 raid的接口或者raid卡来组成硬件raid,但是开销一般比较大,于是在linux中也提供了软件raid的实现。
raid的好处:
提高IO能力: 磁盘的并行读写
提高耐用性: 磁盘冗余来实现
RAID技术分类:
多个磁盘组成条带化
RAID1:镜像,mirror 保证数据的可用性
校验码 等
raid各个级别:
RAID level(级别):仅代表磁盘组织方式不同,没有上下之分
RAID-0:条带化
性能提升:读、写
冗余能力 (容错能力):无
空间利用率:nS
至少需要2块磁盘
RAID-1:镜像
性能提升:写性能下降,读性能提示
冗余能力:有
空间利用率:1/2
至少需要2块
RAID-4:多块数据盘异或运算值,存于专用校验盘
RAID-5:
性能表现:读、写提升
冗余能力:有
空间利用率:(n-1)/n
至少需要3块盘
RAID-10:
性能表现:读、写提升
冗余能力:有
空间利用率:1/2
至少需要4块盘
RAID-01:
性能表现:读、写提升
冗余能力:有
空间利用率:1/2
至少需要4块盘
RAID-50:
性能表现:读、写提升
冗余能力:有
空间利用率:(n-2)/n
至少需要6块盘
jdod :将多个小盘组合成一个大盘
性能表现:无提升
冗余能力:无
空间利用率:100%
至少需要2块
软硬RAID的使用区别:
硬件RAID:BIOS主板下调整、RAID卡
软件RAID:内核模块支持 (md:multi disks)
使用命令实现软件raid:
mdadm 管理命令,将任何设备做成RAID,并有多种模式选项命令
模式化的命令:
创建模式:
-C --create
专用选项:
-l # :指定raid级别 --level
-n # : 设备个数 -num
-a {yes|no}:是否自动为其创建设备文件 --auto
-x # :指定空闲盘个数
-c CHUNK_SIZE:指定chunk大小
管理模式:
-a,--add :添加raid成员
-r,--remove :移除raid成员
-f,--fail : 模拟损坏raid成员
监控模式:
-F
增长模式:
-G
装配模式:
-A
查看RAID阵列的详细信息
mdadm -D /dev/md#
--detail
停止阵列:
mdadm -S /dev/md#
特例:格式化md0设备指定分配条带和block:
mke2fs -j -E stride=16 -b 4096 /dev/md0
RAID5案例:
1、创建一个3G的raid5级别设备(那么至少需要3个1G的设备):
#在/dev/sdb下创建6个分区,其类型指定为fd编号,表示为Linux raid
[[email protected] ~]# fdisk -l /dev/sdb 2> /dev/null | grep ‘^/dev‘ /dev/sdb1 1 132 1060258+ fd Linux raid autodetect /dev/sdb2 133 264 1060290 fd Linux raid autodetect /dev/sdb3 265 396 1060290 fd Linux raid autodetect /dev/sdb4 397 2610 17783955 5 Extended /dev/sdb5 397 528 1060258+ fd Linux raid autodetect /dev/sdb6 529 660 1060258+ fd Linux raid autodetect
2、使用mdadm命令
#使用mdadm创建为level 5级别raid
[[email protected] ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sdb{1,2,3,5} mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
#查看md0设备信息及成员
[[email protected] ~]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdb3[4] sdb5[3](S) sdb2[1] sdb1[0] 2117632 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
#查看md0的raid级别
[[email protected] ~]# mdadm -D /dev/md0 | grep -i ‘level.*‘ Raid Level : raid5
#查看成员信息及其状态:
[[email protected] ~]# mdadm -D /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘ 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 4 8 19 2 active sync /dev/sdb3 3 8 21 - spare /dev/sdb5
#要使用md0设备必须先格式化
[[email protected] ~]# mke2fs -t ext4 /dev/md0
#挂载md0设备
[[email protected] ~]# mkdir /mnt/md0 [[email protected] ~]# mount /dev/md0 /mnt/md0
#查看md0是否已经被识别为一个单个磁盘设备
[[email protected] ~]# fdisk -l 2> /dev/null | grep ‘md0‘ Disk /dev/md0: 2168 MB, 2168455168 bytes
#查看挂载点
[[email protected] ~]# df | grep ‘/md0‘ /dev/md0 2018796 3120 1909796 1% /mnt/md0
#拷贝配置文件到此挂载点
[[email protected] ~]# cp /etc/issue /etc/inittab /mnt/md0
#ls列出文件,发现出现了lost+found表示已经被识别了单个硬盘的单个分区
[[email protected] ~]# ls /mnt/md0 inittab issue lost+found
3、损坏模拟
#下面进行模拟损坏一块磁盘
#先查看此时md0成员信息,/dev/sdb5表示为备用,其它都是完好的
[[email protected] ~]# mdadm --detail /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘ 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 4 8 19 2 active sync /dev/sdb3 3 8 21 - spare /dev/sdb5
#使用-f或者--fail 选项模拟时/dev/sdb3分区损坏
[[email protected] ~]# mdadm /dev/md0 --fail /dev/sdb3 mdadm: set /dev/sdb3 faulty in /dev/md0
#再次查看分区信息,此时备用的sdb5已经自动顶了上去
[[email protected] ~]# mdadm --detail /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘ 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 3 8 21 2 spare rebuilding /dev/sdb5 4 8 19 - faulty /dev/sdb3
#这时我们查看文件看看有没有损坏
[[email protected] ~]# cat /mnt/md0/issue CentOS release 6.8 (Final) Kernel \r on an \m
#下面修改此文件内容
[[email protected] ~]# sed -i ‘$a \new line \n hello world‘ /mnt/md0/issue
#查看修改后的文件内容
[[email protected] ~]# cat /mnt/md0/issue CentOS release 6.8 (Final) Kernel \r on an \m new line hello world
4、移除成员
#这时我们移掉一块分区
[[email protected] ~]# mdadm /dev/md0 -r /dev/sdb3 mdadm: hot removed /dev/sdb3 from /dev/md0
说明:这里的热移除表示正在使用时进行移除
#再次查看成员
[[email protected] ~]# mdadm -D /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘ 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 3 8 21 2 active sync /dev/sdb5
5、添加成员接管
#添加一个分区加入md0,这里要指定-n 表示为第4块硬盘
[[email protected] ~]# mdadm -G /dev/md0 -n 4 -a /dev/sdb6 mdadm: added /dev/sdb6 mdadm: Need to backup 3072K of critical section..
#再次查看md0磁盘阵列成员
[[email protected] ~]# mdadm -D /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘ 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 3 8 21 2 active sync /dev/sdb5 4 8 22 3 active sync /dev/sdb6
#再次查看数据,文件读取正常
[[email protected] ~]# cat /mnt/md0/issue CentOS release 6.8 (Final) Kernel \r on an \m new line hello world
#再次加入
[[email protected] ~]# mdadm -G /dev/md0 -n 5 -a /dev/sdb3 mdadm: added /dev/sdb3 mdadm: Need to backup 6144K of critical section..
#使用watch工具进行动态数据查看
[[email protected] ~]# watch -n 3 ‘cat /proc/mdstat‘
解析:这里表示数据同步中,使用watch可以不断进行读秒查看
#数据仍然存在
[[email protected] ~]# cat /mnt/md0/issue CentOS release 6.8 (Final) Kernel \r on an \m new line hello world
6、保存md0阵列配置
#保存阵列数据配置
[[email protected] ~]# mdadm -D --scan /dev/md0 > /etc/mdadm.conf
7、停止md0阵列
#卸载md0设备
[[email protected] ~]# umount /mnt/md0
#停止磁盘阵列
[[email protected] ~]# mdadm -S /dev/md0 mdadm: stopped /dev/md0
#内存中已经没有md0阵列了
[[email protected] ~]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] unused devices: <none>
#md0真的被停止了
[[email protected] ~]# fdisk -l 2> /dev/null | grep ‘md0‘
8、重启启动磁盘阵列
#重新启用md0阵列
[[email protected] ~]# mdadm -A -s /dev/md0 mdadm: /dev/md0 has been started with 5 drives.
#md0中5个设备都列了出来
[[email protected] ~]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdb1[0] sdb3[5] sdb6[4] sdb5[3] sdb2[1] 4235264 blocks super 1.2 level 5, 512k chunk, algorithm 2 [5/5] [UUUUU] unused devices: <none>
#挂载md0设备
[[email protected] ~]# mount /dev/md0 /mnt/md0
#文件数据依然存在
[[email protected] ~]# cat /mnt/md0/issue CentOS release 6.8 (Final) Kernel \r on an \m new line hello world
注意:如果相要重新启用md0并读取原有设备成员,那么就需要madm -D -s的配置信息保存至/etc/mdadm.conf文件中,否则无法重新启用的。
9、测底清除设备成员的raid信息
#先卸载设备
[[email protected] ~]# umount /dev/md0
#停止阵列设备
[[email protected] ~]# mdadm --stop /dev/md0 mdadm: stopped /dev/md0
#清除radi的超级块信息
[[email protected] ~]# mdadm --zero-superblock /dev/sdb{1,2,3,5,6}
#删除配置文件
[[email protected] ~]# rm -f /etc/mdadm.conf