RAID技术介绍和总结
一.RAID技术简介
1987年,加利福利亚伯克利分校的Patterson、Gibson和Katz这三位工程师发表了一篇:"A Case for Redundant Arrays of Inexpensive Disks"的论文。其目的是将多块容量较小,相对廉价的硬盘驱动器进行组合,使其性能相当于一只昂贵的大硬盘。在当时,这种技术叫做廉价磁盘冗余阵列。许多工业级别的生产者发现了商机,纷纷去实现这种应用。但是,当他们实现以后却发现要真正让这种设备发挥很好的性能,这个设备的控制器芯片加上外围的硬件设备价格都不便宜。因此,这项技术改名为独立冗余磁盘阵列。事实上到今天为止,RAID技术已经成为众多存储解决方案中的工业标准。
目前RAID的实现技术主要有两种:硬件RAID和软件RAID。
硬件RAID:通过专用的RAID控制器,能极大的提高磁盘的I/O性能和可用性。并且为了提高性能,一般RAID控制器都有个小cpu,内存,还自带电池(可以独立供电)。在出现电源故障时,它会使用后备的电池电源保持缓存。硬件RAID比软件RAID技术在使用性能和服务性能上更胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。但是基于硬件实现的RAID技术对于大规模使用是非常昂贵的投资。
软件RAID:软RAID的实现,在Linux上是靠一个叫md(multi disks)的内核模块。md模块会在内核中模拟出一个RAID来,当要存储数据时,md会在内核中将数据转换为对应RAID级别支持的数据存储格式,然后通过/dev/md#这个设备文件将数据存储在磁盘上。(md#不代表RAID级别)。该模块对于用户空间的进程来看,就是一个RAID。而对于内核来看,其实还是那几块硬盘,只不过在内核里模拟了RAID的存储机制。软RAID的性能较低,因为其占用了系统资源。其性能取决于cpu的性能,取决于cpu分时隙的能力和cpu空闲时间。但是在软件RAID中无需物理硬件,零成本投资。
二.RAID级别介绍
常用的RAID级别分别是:RAID-0 (条带卷),RAID-1 (镜像卷),RAID-4(单磁盘奇偶校验),RAID-5(单磁盘分布式奇偶校验),RAID-6(双磁盘分布式奇偶校验),再加上嵌套式的RAID-10(镜像卷 + 条带卷),RAID-01(条带卷 + 镜像卷)。RAID2-3级别基本没人用。
RAID-0: 条带卷,在RAID-0级别中,要存储的数据先按指定的数据块大小进行切片,然后分散存储到多个磁盘上。当系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高了磁盘整体的读写性能。因为读取和写入是在设备上并行完成的。RAID-0的特点是磁盘的读写性能显著提升,但是没有数据冗余,零容错能力,如果一个驱动器发生故障,那么将无法恢复任何数据。可用空间是 N*min(S1,S2,...Sn),其实现至少需要2块硬盘。
RAID-1:镜像卷,在RAID-1级别中,数据被同等的写入两个或多个磁盘中。读性能得到提升,读取速度可以接近所有磁盘吞吐量的总和,但写入速度受限于最慢的磁盘,写性能略有下降。镜像卷有很好的数据冗余能力,可用空间是 1*min(S1,S2,...Sn),其实现也至少需要2块磁盘。
RAID-4:单磁盘奇偶校验,在RAID-4级别中,它以RAID-0的方式将数据写入到其它磁盘中,并在一个驱动器上保存校验码信息。校验码通常是将要写入到其它磁盘里的数据进行异或得到的。如果一个驱动器出现故障,那么可以使用校验码去和另一个驱动器上的数据进行异或来恢复所有数据。但如果两个驱动器出现故障,那么所有数据都将丢失。因为校验码都存储在一个驱动器上,每次数据写入其它磁盘时,都必须更新这些信息。因此,校验盘很容易成为性能瓶颈,特别是有大量数据写入时。可用空间是(N-1)*min(S1,S2,...Sn),其实现至少需要3个磁盘。
RAID-5:单磁盘分布式奇偶校验,RAID-5级别和RAID-4级别很像,它们之间最大的区别就是在RAID-5级别中,校验码是均与的分布在各个驱动器上的。这样就避免了RAID-4中出现的校验盘性能瓶颈的问题。RAID-5级别也允许有一块磁盘出现故障。如果使用了备用磁盘,那么在一块磁盘出现故障后,阵列会立即开始同步数据。可用空间是(N-1)*min(S1,S2,...Sn),其实现也至少需要3块磁盘。
RAID-6:双磁盘分布式奇偶校验,RAID-6和RAID-5相似。只是RAID-6用2块磁盘来存储校验信息,即使有2个驱动器发生故障,依然可以更换新的驱动器后重建数据。RAID-6比RAID-5慢,性能略差,但允许有2块磁盘发生故障。可用空间是(N-2)*min(S1,S2,...Sn),其实现至少需要4块磁盘。
混合类型
RAID-10:先镜像后条带,通过结合RAID-1的数据被完全相同地写入到两个或多个磁盘和RAID-0的读写操作在多个磁盘上同时并行执行的特点实现高性能和高容错性的磁盘I/O。在RAID-10中,读写性能提升和RAID-5差不多。有容错能力,但每组镜像最多只能坏一块。可用空间是N*min(S1,S2,...Sn)/2,和RAID-1一样空间利用率只有50%。其实现最少需要4块磁盘。
RAID-01:先条带后镜像,RAID-01和RAID-10非常相似,二者在读写性能上没有什么差别。但是在安全性上RAID-10要好于RAID-01。因此,RAID-10的应用比RAID-01多。在实际的生产环境中,RAID5和RAID10被经常拿来做比较,也是用的最多的两种技术。
三.软RAID的实现
RAID-0:
1.安装RAID的mdadm管理工具
# rpm -qa | grep "mdadm"
# yum install mdadm -y
这里已经安装mdadm工具了,如果没有的话,执行yum install mdadm -y 即可。
2.确认添加的硬盘或是分区
# ls -l /dev | grep "sd"
为了节约物理磁盘空间,这里用一块虚拟盘的多个分区来做RAID。
3.检查连接的驱动器是否已被现有RAID使用
# mdadm --examine /dev/sdb
4.创建RAID分区,并调整分区类型为fd
# fdisk /dev/sdb
这里新建了两个5G的分区,并调整分区类型为fd
5.再次验证驱动器是否正确定义RAID
# mdadm --examine /dev/sdb{1,2}
6.创建RAID md设备
# mdamd -C /dev/md0 -a yes -l 0 -n 2 /dev/sdb{1,2}
7.查看内核识别的RAID设备以及阵列使用状态等信息
# cat /proc/mdstat 或 mdadm -E /dev/sdb{1,2}
# mdadm -D /dev/md0 或 mdadm --detail /dev/md0
8.在RAID设备上创建文件系统并挂载
# mke2fs -t ext4 /dev/md0
# mkdir /backup && mount /dev/md0 /backup
# df -lh
9.因为重启系统后,/dev/md# 的名字可能会改变,扫描当前RAID设备的信息并保存到配置文件中方便以后装配。
# mdadm -D --scan --verbose >> /etc/mdadm.conf 或 mdadm -E -s -v >> /etc/mdadm.conf
RAID-1,RAID-4,RAID-5,RAID-6的软RAID实现方式和上述方法差不多,只是在使用 mdadm 命令创建阵列时使用 -l 选项指定要创建的阵列级别就行了。需要注意的是,在创建RAID前要先确认相应磁盘或者分区的文件系统类型已经调整为fd。另外,在RAID设备上创建文件系统时,可以通过类似这样的命令 "mke2fs -t ext4 -E stride=16 -b 4096 /dev/md0" 来明确指明stride大小(条带大小),即一个chunk相当于多少个磁盘块大小。这样可以略微提升RAID性能,在I/O繁忙时(对镜像卷意义不大,但对RAID0和5有用)。
RAID-10:
RAID-10 有两种方法可以实现,一种是在使用 mdadm 命令时通过 -l 选项直接指定要创建的RAID级别为10。另一种方法是通过嵌套的方式先创建两个或更多的RAID-1阵列,然后使用它们组成RAID-0阵列。第一种方法能够使用偶数或奇数个磁盘去创建阵列,而且能以单个RAID设备的形式被管理。第二种方法只允许偶数个磁盘,并且必须以嵌套设备的形式被管理,即分开管理RAID-1和RAID-0阵列。嵌套法创建RAID-10或者RAID-01的方法和上面的大同小异。
四.mdadm命令及常用选项总结
命令的语法格式:
mdadm [mode] <raiddevice> [options] <component-devices> # [ ] 中的为可选项,< > 中的为必选项
<raiddevice>: /dev/md#
<component-devices>: 任意块设备
四种模式分别是:创建(-C),装配(-A),监控(-F),管理(-f,-r,-a)
-C:创建RAID设备
子选项:
-a {yes|no}:是否自动创建目标RAID设备的设备文件
-l #:指定要创建的RAID级别
-n #:指定使用#个块设备来创建此RAID
-c CHUNK_SIZE:指明块大小,默认是64Kbytes
-x #:指明空闲盘的个数,做后备盘使用
例如:创建一个10G可用空间的RAID5; mdadm -C /dev/md0 -a yes -l 5 -n 3 /dev/sda{3,4,5}
-D:显示raid的详细信息
mdadm -D /dev/md#
maadm --detail /dev/md#
mdadm -E /dev/md#
mdadm --examine /dev/md#
管理模式:
-f: 标记指定磁盘为损坏; mdadm /dev/md1 -f|--fail|--set-fault /dev/sda3 # "|" 表示或者的意思
-a: 添加磁盘 mdadm /dev/md1 -a|--add /dev/sda5 # 新加进来的盘大小要和此前的RAID一样
-r: 移除磁盘 mdadm /dev/md0 -r /dev/sda2
观察md的状态:
cat /proc/mdstat
停止md设备:
mdadm -S /dev/md#
mdadm --stop /dev/md#
watch命令:
-n #: 刷新间隔,单位是秒;
watch -n# 'COMMAND'
mdadm -D|--detail --scan > /etc/mdadm.conf # 扫描当前RAID设备的信息并保存到配置文件中方便以后装配。