一、磁盘阵列简介
磁盘阵列RAID(RedundantArrays of Inexpensive Disks),即容错廉价磁盘阵列。磁盘阵列可以通过技术将多个较小的磁盘整合成一个较大的磁盘设备。
整个RAID会根据等级(level)选择的不同,而使得整合后得磁盘具有不同的功能,基本常见的等级有以下几种:
RAID 0:
最早出现的RAID模式,即Data Stripping数据分条技术。RAID 0的组建至少需要两块硬盘,成本比较低,没有提供冗余或错误修复的能力。RAID 0可以提高整个磁盘的性能和吞吐量。
当RAID 0 使用同型号、容量的磁盘来组成时,效果较佳。这种模式的RAID会将磁盘先切出等量的区块,然后当一个文件要写入RAID时,该文件会依据块的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错存放数据,因此当你的数据要写入RAID,数据会被等量放置在各个磁盘上面。举例说明,当有一个由两块磁盘组成的RAID 0,将1G的数据写入其中,RAID 0中的两个磁盘会分别存放512M,如图1-1。
图 1-1 RAID 0的磁盘示意图
RAID 1:
RAID 1称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件。这样即使一个磁盘上的文件数据损坏,你的数据还是可以完整保留下来。虽然这样数据的安全性提高了,但成本会明显增加,磁盘的利用率也降至50%。RAID 1的写性能不佳,但是读性能稍微提升,原因是当从RAID 1中读取数据时可以同时从两块拥有相同数据的硬盘上进行读取。
假设RAID 1是由两块相同大小的磁盘组成的,当向其中存入1G的数据时,两块磁盘都会存储1G的数据,如图1-2。
图 1-2 RAID 1的磁盘示意图
RAID 10,RAID 01
RAID 10和RAID 01是将RAID 1和RAID 0以不同的方式组合。RAID 10是先分开数据然后对分组的数据进行镜像处理(即两个RAID 1组成一个RAID 0),RAID 01是先对数据进行镜像操作,然后分开存储(两个RAID 0组成一个RAID 1)。RAID 01和10的读写性能都有提升,并且都拥有冗余能力,但空间利用率都为降为50%。RAID 10如图1-3,RAID 01如图1-4。
图 1-3 RAID 10的磁盘示意图
图 1-4 RAID 01的磁盘示意图
RAID 5
RAID 5至少需要三块以上的磁盘才能够组成这种类型的磁盘阵列。RAID 5写入数据的方式类似RAID 01,不过每个循环的写入过程中,在每块磁盘还加入一个同位检查数据(Parity),这个数据会记录其他磁盘的备份数据,用于当有磁盘损毁时的救援。如图1-5。
图 1-5 RAID 5的磁盘示意图
图中,每个循环写入时,都会有部分的同位检查码(Parity)被记录,并且记录的同位检查码每次都记录在不同的磁盘,因此,任何一个磁盘损毁时都能够通过其他磁盘的检查码来重建原本磁盘内的数据。不过需要注意的是,由于有同位检查码,因此RAID 5的总容量会是(n-1)/n,而且当损毁的磁盘数量大于等于两块时,整租RAID 5的数据就损毁了。因此RAID 5默认支持一块磁盘的损毁情况。
RAID 5的读写性能均有提升,但其写性能低于RAID 0。
RAID 50
将RAID 5和RAID 0相结合。构建RAID 50至少需要6块磁盘,每3块做一个RAID 5,然后将两个RAID 5做成一个RAID 0。
RAID 50的读写性能提升,具有冗余能力,其空间利用率为(n-2)/n。
二、创建软RAID实践
硬RAID基于硬件基础,其设置时在BIOS界面,硬RAID要求必须要有RAID控制器以及驱动。
软RAID实践
基础命令:
mdadm:将任何设备做成RAID
模式化的命令 :
创建模式
-C
专用选项:
-l 级别
-n #设备个数
-a 是否自动为其创建设备文件yes no
-c 指定chunk(数据块)大小 2^n 默认为64k
-x #指定空闲盘个数
管理模式
--add,--remove(-r) --fail(-f,--set-faulty)
mdadm /dev/md# --fail /dev/sda7 模拟sda7为损坏
--remove
--add
监控模式
-F
增长模式
-G
装配模式
-A
mdadm -A /dev/md# /dev/sd{#1,#2,...}
-D /dev/md# 显示RAID阵列的详细信息
--detail
停止阵列
mdadm -S /dev/md#
--stop
(1)做一个可用大小为2G的RAID 0,设置为自动挂载。
可以采用2个1G的分区或者采用4个512M的分区来做2G的RAID 0。这里使用2个1G分区制作一个2G的RAID 0;
创建两个1G大小的分区/dev/sdb5 /dev/sdb6
1
fdisk /dev/sdb
将分区/dev/sdb{5,6}的system id为Linux raid auto(fd)
w保存并退出fdisk
使用partprobe命令让系统识别新分区
1
partprobe /dev/sdb
查看系统是否识别了新的分区表
1
cat /proc/partitions
执行mdadm命令,将/dev/sdb{5,6}创建为RAID 0 (没有mdadm命令可以使用yum install mdadm 安装)
1
mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sdb{5,6}
查看当前设备上所有启用的RAID设备
1
cat /proc/mdstat
格式化新建的md0设备
1
mke2fs -j /dev/md0
挂载/dev/md0到/mnt/raid0 (新建/mnt/raid0)
1
mount /dev/md0 /mnt/raid0
设置开机自动挂载/dev/md0
1
echo "/dev/md0 /mnt/raid0 ext3 defaults 0 0">>/etc/fstab
停止阵列
首先取消md0的挂载
1
umount /dev/md0
停止md0
1
mdadm -S /dev/md0
删除阵列
1
rm /dev/md0
(取消挂载,使用--fail 和--remove删除raid 0中的设备,然后使用-S停止md0)
(2)做一个可用大小为2G的RAID 1,模拟磁盘损坏并添加新的磁盘。
制作RAID 1和上面的制作RAID 0步骤相似
使用2个2G分区制作一个2G的RAID 1;
创建两个2G大小的分区/dev/sdb5 /dev/sdb6
执行mdadm命令,将/dev/sdb{5,6}创建为RAID 1 (没有mdadm命令可以使用yum install mdadm 安装)
1
mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sdb{5,6}
使用 mdadm —D 查看md0的信息
1
mdadm —D /dev/md0
使用fdisk新建一个大小为2G的/dev/sdb7
使用 mdadm --add 为raid 1 添加一个预备磁盘
1
mdadm /dev/md0 --add /dev/sdb7
模拟 raid 1下的/dev/sdb6 损坏
1
mdadm /dev/md0 --fail /dev/sdb6
/dev/sdb7会自动顶替坏掉的sdb6
(3)做一个可用大小为2G的RAID 5,使用-x指定空闲磁盘个数,模拟磁盘损坏观察效果。
制作步骤与RAID 0相似,这里可以使用3个1G分区制作一个2G的RAID 5
这里创建4个1G分区,其中一个当作预备磁盘
mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sdb{5,6,7,8}
模拟/dev/md0中的/dev/sdb5 损坏
1
mdadm /dev/md0 --fail /dev/sdb5
空闲磁盘/dev/sdb8 自动顶替损坏的/dev/sdb5