RAID 方案总结
1、简介
RAID是redundant array of independent disks的缩写,意指独立磁盘冗余阵列,是把相同的数据存储在多个硬
盘的不同的地方的方法。通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能。因为多个硬盘增加了平均故障间隔时间(MTBF),储存冗余数据也增加了容错。
2、RAID级别
当前已出现的RAID的级别
有 RAID0,RAID1,RAID01/RAID10,RAID2,RAID3,RAID4,RAID5,RAID6,RAID7,越到后面的结构就是对前面结构的一种重复和再利用。常用的结构有RAID0,RAID1,RAID0+1,RAID5。
一般越是性能可靠的阵列需要更多的冗余数据,单位比特的存储成本也越高,例如RAID1和RAID6。为了减少冗
余数据量,RAID结构也引入数据校验算法(奇偶/hamming)来校验及恢复数据,这种机制副作用是随机读写数据时对校验盘的访问造成了速度瓶颈,不适用于大数据量的读写,例如RAID2,3,4,5。
对于不同的设备而言,需要对于不同的应用场景使用不同的RAID结构,了解这些RAID结构的优缺点是有必要
的,以下将详细阐述。
2.1 RAID 0:仅提高数据传输率的方案
RAID 0连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数
据冗余,因此并不能算是真正的RAID结构。RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID
0不能应用于数据安全性要求高的场合。
2.2 RAID 1:无需重组数据的高可靠高存储成本方案
RAID 1是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可
直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID
1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。
2.3 RAID 01/10:RAID0+RAID1的复合方案
RAID 01/10根据组合分为RAID 10和RAID 01,实际是将RAID
0和RAID 1标准结合的产物,在连续地以位或字节
为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID
0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低。RAID
1+0是先镜射再分区数据,再将所有硬盘分为两组,视为是RAID 0的最低组合,然后将这两组各自视为RAID
1运作。RAID 0+1则是跟RAID 1+0的程序相反,是先分区再将数据镜射到两组硬盘。它将所有的硬盘分为两组,变成RAID
1的最低组合,而将两组硬盘各自视为RAID 0运作。性能上,RAID 0+1比RAID
1+0有着更快的读写速度。可靠性上,当RAID 1+0有一个硬盘受损,其余三个硬盘会继续运作。RAID
0+1 只要有一个硬盘受损,同组RAID 0的另一只硬盘亦会停止运作,只剩下两个硬盘运作,可靠性较低。因此,RAID
10远较RAID 01常用,零售主板绝大部份支持RAID 0/1/5/10,但不支持RAID
01。
2.4 RAID 2:带Hamming校验的低速方案
RAID 2将数据条块化地分布于不同的硬盘上,条块单位为位或字节,并使用称为“加重平均纠错码(汉明
码)”的编码技术来提供错误检查及恢复。
2.5 RAID 3:含奇偶校验信息块低速方案
RAID 3同RAID 2非常类似,都是将数据条块化分布于不同的硬盘上,区别在于RAID 3使用简单的奇偶校验,并
用单块磁盘存放奇偶校验信息。如果一块磁盘失效,奇偶盘及其他数据盘可以重新产生数据;如果奇偶盘失效则不影响数据使用。RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据来说,奇偶盘会成为写操作的瓶颈。
2.6 RAID 4:含1个校验信息块低速可靠方案
RAID4和RAID3很象,不同的是,它对数据的访问是按数据块进行的,也就是按磁盘进行的,每次是一个盘。在
图上可以这么看,RAID3是一次一横条,而RAID4一次一竖条。它的特点和RAID3也挺象,不过在失败恢复时,它的难度可要比RAID3大得多了,控制器的设计难度也要大许多,而且访问数据的效率不怎么好。
2.7 RAID 5
RAID 5不单独指定的奇偶盘,而是在所有磁盘上交叉地存取数据及奇偶校验信息。在RAID 5上,读/写指针可
同时对阵列设备进行操作,提供了更高的数据流量。RAID 5更适合于小数据块和随机读写的数据。RAID
3与RAID 5相比,最主要的区别在于RAID 3每进行一次数据传输就需涉及到所有的阵列盘;而对于RAID
5来说,大部分数据传输只对一块磁盘操作,并可进行并行操作。在RAID 5中有“写损失”,即每一次写操作将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。
2.8 RAID50
RAID 50:RAID50是RAID5与RAID0的结合。此配置在RAID5的子磁盘组的每个磁盘上进行包括奇偶信息在内的
数据的剥离。每个RAID5子磁盘组要求三个硬盘。RAID50具备更高的容错能力,因为它允许某个组内有一个磁盘出现故障,而不会造成数据丢失。而且因为奇偶位分部于RAID5子磁盘组上,故重建速度有很大提高。优势:更高的容错能力,具备更快数据读取速率的潜力。需要注意的是:磁盘故障会影响吞吐量。故障后重建信息的时间比镜像配置情况下要长。
2.9 RAID 6:含2个校验信息块低速高可靠方案
与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可
靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。但RAID 6需要分配给奇偶校验信息更大的磁盘空间,相对于RAID
5有更大的“写损失”,因此“写性能”非常差。较差的性能和复杂的实施方式使得RAID
6很少得到实际应用。
2.10 RAID 7:带高速缓冲的新标准
RAID 7是一种新的RAID标准,其自身带有智能化实时操作系统和用于存储管理的软件工具,可完全独立于主机
运行,不占用主机CPU资源。RAID 7可以看作是一种存储计算机(Storage
Computer),它与其他RAID标准有明显区别。
RAID7所有的I/O传送均是同步进行的,可以分别控制,这样提高了系统的并行性,提高系统访问数据的速度;每
个磁盘都带有高速缓冲存储器,实时操作系统可以使用任何实时操作芯片,达到不同实时系统的需要。允许使用SNMP协议进行管理和监视,可以对校验区指定独立的传送信道以提高效率。可以连接多台主机,因为加入高速缓冲存储器,当多用户访问系统时,访问时间几乎接近于0。由于采用并行结构,因此数据访问效率大大提高。需要注意的是它引入了一个高速缓冲存储器,这有利有弊,因为一旦系统断电,在高速缓冲存储器内的数据就会全部丢失,因此需要和UPS一起工作。当然了,这么快的东西,价格也非常昂贵。
2.11 其他
除了以上的各种标准,我们可以如RAID 0+1那样结合多种RAID规范来构筑所需的RAID阵列,例如RAID
5+3(RAID 53)就是一种应用较为广泛的阵列形式。用户一般可以通过灵活配置磁盘阵列来获得更加符合其要求的磁盘存储系统。
3、mdadm 实践
首先显示当前使用mdadm版本。
# mdadm -V mdadm - v3.2.5 - 18th May 2012
3.1 创建RAID基本过程
以创建RAID1阵列为例,给出基本过程,创建其他RAID级别阵列过程类似。假设目前有两个硬盘/dev/sda
和/dev/sdb,目标是组成RAID1阵列设备/dev/md0。
3.1.1. 硬盘分区
首先在硬盘/dev/sda上分别创建一个分区
# fdisk /dev/sda Command (m for help): n 按n创建新分区 Command action e extended p primary partition (1-4) 输入p 选择创建主分区 Partition number (1-4): 输入 1 创建第一个主分区 First cylinder (1-204, default 1): 直接回车,选择分区开始柱面这里就从 1 开始 Last cylinder or +size or +sizeM or +sizeK (1-204, default 204): 直接回车,最后一个柱面 Command (m for help): t 输入t 指定分区类型! Selected partition 1 Hex code (type L to list codes): fd fd 指 Linux raid auto,可用命令l显示文件格式列表确认 Command (m for help): w 然后输入w写盘! The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
同样的方法对/dev/sdb分区。
3.1.2.组成阵列
#mdadm --create --verbal /dev/md0 --level 1 -n2 /dev/sda1 /dev/sdb1 mdadm: /dev/sda1 appears to contain an ext2fs file system size=512000K mtime=Thu Aug 21 08:25:31 2014 mdadm: /dev/sda1 appears to be part of a raid array: level=raid1 devices=2 ctime=Thu Aug 21 09:34:32 2014 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 mdadm: /dev/sdb1 appears to be part of a raid array: level=raid1 devices=2 ctime=Thu Aug 21 09:34:32 2014 mdadm: size set to 58581824K mdadm: largest drive (/dev/sda1) exceeds size (58581824K) by more than 1% Continue creating array? y mdadm: Defaulting to version 1.2 metadata md: bind<sda1> md: bind<sdb1> md/raid1:md0: not clean -- starting background reconstruction md/raid1:md0: active with 2 out of 2 mirrors md0: detected capacity change from 0 to 59987787776 mdadm: array /demd: resync of RAID array md0 md: minimum _guaranteed_ speed: 1000 KB/sec/disk. v/md0 started. md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync. md: using 128k window, over a total of 58581824k.
之后可以查看RAID同步数据的进度。不必等待同步作业完成,我们即可进行格式化,挂载,拷贝数据等其他工
作,及时关闭系统,同步工作也会在下次RAID启动后继续进行。
# cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] md0 : active raid1 sdb1[1] sda1[0] 58581824 blocks super 1.2 [2/2] [UU] [==================>..] resync = 90.7% (53178304/58581824) finish=2.1min speed=42078K/sec unused devices: <none>
3.1.3. 格式化阵列为linux ext4格式
# mkfs.ext4 /dev/md0
3.1.4.挂载到 /mnt/myRAID 后,就可以对RAID设备进行读写操作了。
# mkdir /mnt/myRAID # mount /dev/md0 /mnt/myRAID
3.2 启动已有的RAID
3.2.1.启动 mdadm 监视任务
# /etc/init.d/mdadm start
使用 restart 参数,在启动前杀死可能已经启动的相同进程。
# /etc/init.d/mdadm restart Stopping MD monitoring service: mdadm --monitorNo /sbin/mdadm found running; none killed. . Starting MD monitoring service: mdadm --monitor.
3.2.2.启动 mdadm-raid 任务,将自动扫描所有分区设备,如果有设备是RAID文件系统,将按其中宏块信息建立相应md设备 /dev/mdX。
# /etc/init.d/mdadm-raid restart
使用 restart 参数,在启动前杀死可能已经启动的相同进程。
# /etc/init.d/mdadm-raid restart md: md0 stopped. md: bind<sdb1> md: bind<sda1> md/raid1:md0: not clean -- starting background reconstruction md/raid1:md0: active with 2 out of 2 mirrors md0: detected capacity change from 0 to 59987787776 md: resync of RAID array md0 md: minimum _guaranteed_ speed: 1000 KB/sec/disk. md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync. md: using 128k window, over a total of 58581824k. md0: unknown partition table md: resuming resync of md0 from checkpoint. Assembling MD array md0...done (started [2/2]). Generating udev events for MD arrays...done.
3.2.3.挂载到 /mnt/myRAID 后,就可以对RAID设备进行读写操作了。
# mkdir /mnt/myRAID # mount /dev/md0 /mnt/myRAID
3.3 移除和添加磁盘
为了进行测试,我们需要从RAID中移除及添加磁盘,同时查看数据同步的效果。
3.3.1.移除磁盘
移除磁盘的方法最简单的就是关闭电源后将磁盘拔下。不关电源需要实现的话使用以下指令。
# mdadm /dev/md0 --fail /dev/sdb # 仿真磁盘错误 md/raid1:md0: Disk failure on sdb, disabling device. md/raid1:md0: Operation continuing on 1 devices. md: md0: recovery done. mdadm: set /dev/sdb faulty in /dev/md0 # mdadm /dev/md0 --remove /dev/sdb # 从/dev/md0移除磁盘/dev/sdb md: unbind<sdb> md: export_rdev(sdb) mdadm: hot removed /dev/sdb from /dev/md0
如果没有执行第一条命令,你将得到一个错误信息。实际应用中我们应该通过检测磁盘信息来确定是否需要从
RAID中移除某块磁盘,然后提示用户更换。
# mdadm /dev/md0 -r /dev/sdb md: cannot remove active disk sdb from md0 ... mdadm: hot remove failed for /dev/sdb: Device or resource busy
3.3.2. 添加磁盘
添加磁盘使用以下命令
# mdadm /dev/md0 -a /dev/sdb #向/dev/md0添加磁盘/dev/sdb md: export_rdev(sdb) md: bind<sdb> mdadm: added /demd: recovery of RAID array md0 v/sdb md: minimum _guaranteed_ speed: 1000 KB/sec/disk. md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery. md: using 128k window, over a total of 58581824k. # cat /proc/mdstat #显示数据同步进度 Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] md0 : active raid1 sdb[2] sda[3] 58581824 blocks super 1.2 [2/1] [_U] [>....................] recovery = 1.5% (927104/58581824) finish=17.6min speed=54535K/sec unused devices: <none>
当需要添加的磁盘已经被挂载(mount),你将得到以下错误信息,下面的例子中,/dev/sdb1已经被挂载(mount)
到 /mnt/sdb1。
# mdadm /dev/md0 -a /dev/sdb mdadm: Cannot open /dev/sdb: Device or resource busy # mdadm /dev/md0 -a /dev/sdb1 mdadm: Cannot open /dev/sdb1: Device or resource busy
当需要添加的磁盘容量小于现有RAID容量,你将获得以下错误信息。
# mdadm /dev/md0 -a /dev/sdb2 mdadm: /dev/sdb2 not large enough to join array
3.4 数据恢复测试
以下测试用于展示mdadm的RAID管理功能。
测试1:通过--add添加磁盘病重新同步
假设/dev/md0是由/dev/sda和/dev/sdb组成的RAID1,并已经挂载(mount)到/mnt/myRAID。
测试步骤:
# touch /mnt/myRAID/testfile #向RAID分区写入一些数据,用于后期检查 # mdadm /dev/md0 --fail /dev/sdb #仿真磁盘错误 # mdadm /dev/md0 --remove /dev/sdb # 从/dev/md0移除磁盘/dev/sdb # fdisk /dev/sdb #将/dev/sdb重新分区,或删除所有分区 # mkfs.msdos /dev/sdb1 # 格式化/dev/sdb,确保磁盘内容被改写。 # mdadm /dev/md0 --add /dev/sdb # 向/dev/md0添加磁盘/dev/sdb # cat /proc/mdstat # 显示RAID同步进度
可以注意到,即使在纳入RAID后,使用“fdisk–l /dev/sdb”查看之前对/dev/sdb的分区结构没有变化,而这
些不影响RAID使用。
测试2:通过--create添加磁盘并重新同步
假设/dev/md0是由/dev/sda和/dev/sdb组成的RAID1,并已经挂载(mount)到/mnt/myRAID。测试步骤:
# touch /mnt/myRAID/testfile #向RAID分区写入一些数据,用于后期检查 # mdadm /dev/md0 --fail /dev/sdb #仿真磁盘错误 # mdadm /dev/md0 --remove /dev/sdb # 从/dev/md0移除磁盘/dev/sdb # fdisk /dev/sdb #将/dev/sdb重新分区,或删除所有分区 # mkfs.msdos /dev/sdb1 # 格式化/dev/sdb,确保磁盘内容被改写。 # reboot # 重启系统 # mdadm -Cv /dev/md0 -l1 -n2 /dev/sd[ab]1 #按原有参数重新建立/dev/md0 # mount /dev/md0 /mnt/myRAID # 挂载RAID # ls /mnt/myRAID # 显示RAID文件 # cat /proc/mdstat # 显示RAID同步进度
4、总结
RAID的意义在于在磁盘损坏时最大程度地保护数据。下表列出一些典型的RAID级别的性能特征:
RAID级别
需要的磁盘数量
磁盘利用率
容许磁盘损坏个数
RAID0
2
100%
0
RAID1
2
50%
1
RAID0+1,RAID1+0
4
50%
1
RAID5
4
75%
1
RAID6
5
60%
2
在linux环境下,mdadm(multiply devices adminstrator)是一个相当成熟的RAID管理工具,具体mdadm的命令行参
数请参考网上资源。