1、简要概述:
磁盘阵列(Redundant Arrays of Inexpensive Disks,RAID)又叫独立磁盘冗余阵列,其基本原理是将多块独立的磁盘按不同的方式组合为一个逻辑磁盘,从而提高存储容量或提升存储性能或提供数据备份功能。RAID存储系统的组合方式根据RAID级别定义。磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任一颗硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。由加利福尼亚大学伯克利分校(University of California-Berkeley)在1987年,发表的文章:“A Case for Redundant Arrays of Inexpensive Disks”。文章中,谈到了RAID这个词汇,而且定义了RAID的5层级。
RAID
种类:软件RAID,硬件RAID。在现有的操作系统中如Windows、Linux、Unix等已经集成了软RAID的功能。软RAID可以实现与硬件RAID相同的功能,但由于其没有独立的硬件控制设备,所以性能不如硬件RAID,但软RAID实现简单、不需要额外的硬件设备。硬件RAID通常需要有RAID卡,RAID卡本身会有独立的控制部件与内存,所以不会占有系统资源,效率高、性能强。当然目前市面上有很多主板已经集成了RAID卡,具体的使用方式可以参考硬件说明书。
现在RAID存储系统被广泛应用于生产环境作为存储解决方案
2
、RAID级别
RAID
根据组合的方式不同有多种设计解决方案,以下介绍几种常见的RAID方案(RAID级别)。
1
、RAID 0(不含校验与冗余的条带存储)
RAID 0
连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,因此并不能算是真正的RAID结构。RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。RAID 0至少需要两块磁盘。存储原理如下图:( )为剩余空间。
RAID 0
|
---------------------
| |
(_DATA1_) (_DATA2_)
(_DATA3_) (_DATA4_)
(_DATA5_) (_DATA6_)
(_DATA7_) (_DATA8_)
( ) ( )
( ) ( )
磁盘1 磁盘2
说明:如果有一个文件要写入RAID 0,则该文件会被分割为多个部分(上图分割了8个数据块),DATA1与DATA2被同时分别存入磁盘1与磁盘2,其他部分依次类推。读取该文件时,将同时从磁盘1与磁盘2中读取数据。如果两块磁盘的存储空间为20G,则RAID 0的总存储空间为40G。
缺点:因为没有校验与备份,两个硬盘中如果有一块磁盘损坏,即磁盘中的任何一个数据块损坏将导致整个文件无法读取。
2
、RAID 1(不含校验的镜像存储)
它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。制作这种磁盘阵列至少需要2块硬盘,该级别的阵列安全行是最好的,磁盘利用率是最低的。
RAID 1
|
-------------------------
| |
(_DATA1_) (_DATA1_)
(_DATA2_) (_DATA2_)
(_DATA3_) (_DATA3_)
(_DATA4_) (_DATA4_)
( ) ( )
( ) ( )
磁盘1 磁盘2
说明:如果有一个文件要写入RAID 1,则该文件会被分成数据块写入磁盘1,同时写入磁盘2,DATA1与DATA2被同时存入磁盘1与磁盘2,其他部分依次类推。RAID 1写入数据的效率会降低,因为数据需要同时写入两块硬盘,但RAID 1读取数据的效率会提升,因为可以同时从两块硬盘读取数据。
3
、RAID 0+1
也被称为RAID 10标准,实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低。
RAID 1
|
-------------------------
| |
RAID 0 RAID 0
| |
--------------------- ---------------------
| | | |
(_DATA1_) (_DATA2_) (_DATA1_) (_DATA2_)
(_DATA3_) (_DATA4_) (_DATA3_) (_DATA4_)
(_DATA5_) (_DATA6_) (_DATA5_) (_DATA6_)
(_DATA7_) (_DATA8_) (_DATA7_) (_DATA8_)
( ) ( ) ( ) ( )
( ) ( ) ( ) ( )
4
、RAID 2(位级别的校验式条带存储)
多块磁盘组合为RAID 2后,数据将以位(bit)为单位同步式分别存储在不同的硬盘上,并采用海明码的编码技术对数据进行校验与恢复。这种编码技术需要多个磁盘存放检查及恢复信息,使得RAID 2技术实施更复杂,因此在商业环境中很少使用。
RAID 2
|
--------------------------------
| | |
(_DATA1_) (_DATA2_) (_Parity1_)
(_DATA3_) (_DATA4_) (_Parity2_)
(_DATA5_) (_DATA6_) (_Parity3_)
(_DATA7_) (_DATA8_) (_Parity4_)
( ) ( ) ( )
( ) ( ) ( )
磁盘1 磁盘2 磁盘3
说明:如果有一个文件要写入RAID 2,则该文件会被分成数据位分别同步写入到不同的磁盘中,DATA1与DATA2进行海明码运算后别写入校验盘中,其他部分依次类推。RAID 2对大数据量的读写具有很高的性能,但少量数据的读写时性能反而不好,该磁盘阵列至少需要3块硬盘。
异或运算:
0
异或 0 = 0
0
异或 1 = 1
1
异或 0 = 1
1
异或 1 = 0
数据1:10010110
数据2:01011001
异或运算结果:11001111
从这些数据可以看出任何一组数据丢失,都可以由另外两组数据运算恢复!
5
、RAID 3(字节级别的校验式条带存储)
它同RAID 2非常类似,都是将数据条块化分布于不同的硬盘上,区别在于RAID 3使用简单的奇偶校验,并用单块磁盘存放奇偶校验信息。如果一块磁盘失效,奇偶盘及其他数据盘可以重新产生数据;如果奇偶盘失效则不影响数据使用。RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据来说,奇偶盘会成为写操作的瓶颈。(该级别的磁盘阵列可以参考RAID 2的读写原理,仅数据分割的单位为字节)
6
、RAID 4 (数据块级别的校验式条带存储)
该级别的磁盘阵列与RAID 5类似,仅校验数据被写入至同一块硬盘中。RAID 4使用一块磁盘作为奇偶校验盘,每次写操作都需要访问奇偶盘,这时奇偶校验盘会成为写操作的瓶颈,因此RAID 4在商业环境中也很少使用。
RAID 4
|
----------------------------------------------
| | | |
(_DATA1_) (_DATA2_) (_DATA3_) (_Parity1_)
(_DATA4_) (_DATA5_) (_DATA6_) (_Parity2_)
(_DATA7_) (_DATA8_) (_DATA9_) (_Parity3_)
(_DATA10_) (_DATA11_) (_DATA12_) (_Parity4_)
( ) ( ) ( ) ( )
( ) ( ) ( ) ( )
磁盘1 磁盘2 磁盘3 磁盘4
7
、RAID 5 (数据块级别的分布式校验条带存储)
RAID 5
不单独指定的奇偶盘,而是在所有磁盘上交叉地存取数据及奇偶校验信息。在RAID 5上,读/写指针可同时对阵列设备进行操作,提供了更高的数据流量。RAID 5更适合于小数据块和随机读写的数据。RAID 3与RAID 5相比,最主要的区别在于RAID 3每进行一次数据传输就需涉及到所有的阵列盘;而对于RAID 5来说,大部分数据传输只对一块磁盘操作,并可进行并行操作。在RAID 5中有“写损失”,即每一次写操作将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。
RAID 5
|
-------------------------------
| | |
(_DATA1_) (_DATA2_) (_Parity1_)
(_DATA3_) (_Parity2_) (_DATA4_)
(_Parity5_) (_DATA5_) (_Parity6_)
( ) ( ) ( )
( ) ( ) ( )
磁盘1 磁盘2 磁盘3
8
、RAID 6
与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。但RAID 6需要分配给奇偶校验信息更大的磁盘空间,相对于RAID 5有更大的“写损失”,因此“写性能”非常差。较差的性能和复杂的实施方式使得RAID 6很少得到实际应用。
9
、RAID 7
是一种新的RAID标准,其自身带有智能化实时操作系统和用于存储管理的软件工具,可完全独立于主机运行,不占用主机CPU资源。RAID 7可以看作是一种存储计算机(Storage Computer),它与其他RAID标准有明显区别。RAID 7并非公开的RAID标准,而是Storage Computer Corporation 的专利硬件产品名称,RAID 7是以RAID 3及RAID 4为基础所发展的。
10
、RAID 5E(RAID 5 Enhencement)
RAID 5E
是在RAID 5级别基础上的改进,与RAID 5类似,数据的校验信息均匀分布在各硬盘上,但是,在每个硬盘上都保留了一部分未使用的空间,这部分空间没有进行条带化,最多允许两块物理硬盘出现故障。看起来,RAID 5E和RAID 5加一块热备盘好象差不多,其实由于RAID 5E是把数据分布在所有的硬盘上,性能会与RAID5 加一块热备盘要好。当一块硬盘出现故障时,有故障硬盘上的数据会被压缩到其它硬盘上未使用的空间,逻辑盘保持RAID 5级别。
11
、RAID 5EE
与RAID 5E相比,RAID 5EE的数据分布更有效率,每个硬盘的一部分空间被用作分布的热备盘,它们是阵列的一部分,当阵列中一个物理硬盘出现故障时,数据重建的速度会更快。
12
、RAID 50
RAID50
是RAID5与RAID0的结合。此配置在RAID5的子磁盘组的每个磁盘上进行包括奇偶信息在内的数据的剥离。每个RAID5子磁盘组要求三个硬盘。RAID50具备更高的容错能力,因为它允许某个组内有一个磁盘出现故障,而不会造成数据丢失。而且因为奇偶位分部于RAID5子磁盘组上,故重建速度有很大提高。优势:更高的容错能力,具备更快数据读取速率的潜力。需要注意的是:磁盘故障会影响吞吐量。故障后重建信息的时间比镜像配置情况下要长。
3
、创建RAID
磁盘阵列有两种方式可以实现,分别是“软件阵列”与“硬件阵列”。
软件阵列是指通过网络操作系统自身提供的磁盘管理功能将连接的普通SCSI卡上的多块硬盘配置成逻辑盘,组成阵列。
硬件阵列是使用专门的磁盘阵列卡来实现的
下面在linux中新添加4个硬盘(每个2G大小)来创建RAID。
1
、查看磁盘信息如下:
[root@Eleven ~]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1318 10482412+ 83 Linux
/dev/sda3 1319 1579 2096482+ 82 Linux swap / Solaris
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sdc: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
Disk /dev/sdd: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdd doesn't contain a valid partition table
Disk /dev/sde: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sde doesn't contain a valid partition table
由以上信息可以看出本机有sdb,sdc,sdd,sde四块硬盘未分区,如果需要在Linux中实现软RAID,可以将每块硬盘分一个区组建RAID,同样可以对硬盘分多个区实现软RAID,这里我们每块硬盘分两个区。
2
、创建硬盘分区:
[root@Eleven ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n #
新建分区
Command action
e extended
p primary partition (1-4)
p #
新建主分区
Partition number (1-4): 1 #
分区编号为1
First cylinder (1-261, default 1): #
默认回车
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261): +1G #
容量大小为1G
****
一下方法与上面相同,创建第二个分区****
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (124-261, default 124): #
回车
Using default value 124
Last cylinder or +size or +sizeM or +sizeK (124-261, default 261): #
回车
Using default value 261
Command (m for help): t #
输入t,用来改变分区类型
Partition number (1-4): 1 #
注明修改第一个分区的类型
Hex code (type L to list codes): fd #
格式为fd,即raid。不清楚格式时可以输入L查看所有分区类型
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): p #
查看硬盘分区结果
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 123 987966 fd Linux raid autodetect
/dev/sdb2 124 261 1108485 fd Linux raid autodetect
Command (m for help): w #
保存并退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
剩余三块硬盘执行相同操作。
自动识别新建的分区:
[root@Eleven ~]# partprobe –a
3
、创建RAID,这里仅以RAID0与RAID5为例,其余级别的磁盘阵列操作方法类似。
RAID 0
(1)、创建RAID 0
[root@Eleven ~]# mdadm -C /dev/md0 -l 0 -n 4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: array /dev/md0 started.
说明:-C为创建(create), -l指定RAID级别(level),-n说明磁盘个数。
(2)、查看RAID 0详细信息
[root@Eleven ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 0.90
Creation Time : Tue Apr 3 23:23:31 2012
创建时间
Raid Level : raid0 RAID
级别
Array Size : 3951360 (3.77 GiB 4.05 GB) RAID
磁盘空间
Raid Devices : 4
磁盘个数
Total Devices : 4
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Apr 3 23:23:31 2012
State : clean
Active Devices : 4
活动磁盘个数
Working Devices : 4
工作磁盘个数
Failed Devices : 0
错误磁盘个数
Spare Devices : 0
空闲磁盘个数
Chunk Size : 64K
UUID : 4b1ab893:ddcaecca:ae44c0d3:6465f4e1
设备UUID
Events : 0.1
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
3 8 65 3 active sync /dev/sde1
格式或并使用:
[root@Eleven ~]# mkfs.ext3 /dev/md0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
494016 inodes, 987840 blocks
49392 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1015021568
31 block groups
32768 blocks per group, 32768 fragments per group
15936 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@Eleven ~]# mkdir /raid0
[root@Eleven ~]# mount /dev/md0 /raid0/
RAID 5
(1)、创建RAID 5
[root@Eleven ~]# mdadm -C /dev/md1 -l 5 -n 3 -x 1 /dev/sdb2 /dev/sdc2 /dev/sdd2 /dev/sde2
mdadm: create aborted
说明:-C为创建(create), -l指定RAID级别(level),-n说明磁盘个数,x指定备用设备个数(因为RAID 5允许设备的损坏,因此指定一个备用设备,可以在活动设备损坏时自动替换为备用设备)
(2)、查看RAID 5详细信息
[root@Eleven ~]# mdadm --detail /dev/md1
/dev/md1:
Version : 0.90
Creation Time : Wed Apr 4 12:16:49 2012
Raid Level : raid5
Array Size : 2216832 (2.11 GiB 2.27 GB)
Used Dev Size : 1108416 (1082.62 MiB 1135.02 MB)
Raid Devices : 3
活动磁盘数3个
Total Devices : 4
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Wed Apr 4 12:16:49 2012
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 4
Failed Devices : 0
Spare Devices : 2
Layout : left-symmetric
Chunk Size : 64K
Rebuild Status : 64% complete
UUID : 6245637f:64bae348:ee9c041d:f77c0cb0
Events : 0.1
Number Major Minor RaidDevice State
0 8 18 0 active sync /dev/sdb2
1 8 34 1 active sync /dev/sdc2
4 8 50 2 spare rebuilding /dev/sdd2
3 8 66 - spare /dev/sde2
该磁盘为备用磁盘
格式或并使用:
[root@Eleven ~]# mkfs.ext3 /dev/md1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
277440 inodes, 554208 blocks
27710 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=570425344
17 block groups
32768 blocks per group, 32768 fragments per group
16320 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@Eleven ~]# mkdir /raid5
[root@Eleven ~]# mount /dev/md1 /raid5
4
、性能测试对比
***************
普通磁盘:写入模拟
***************
[root@Eleven ~]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 48.9053 seconds, 21.4 MB/s
real 0m51.168s
user 0m0.004s
sys 0m2.359s
可以看出对普通磁盘写入1G的数据所需总时间为51.168秒
**************RAID 0
:写入模拟
***************
[root@Eleven ~]# cd /raid0/
[root@Eleven raid0]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 3.28209 seconds, 319 MB/s
real 0m3.369s
user 0m0.005s
sys 0m1.400s
可以看出对RAID 0写入1G数据所需总时间为3.369秒
**************RAID 5
:写入模拟
***************
[root@Eleven raid0]# cd ../raid5/
[root@Eleven raid5]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 6.78195 seconds, 155 MB/s
real 0m6.822s
user 0m0.002s
sys 0m1.413s
可以看出由于RAID 5需要生成校验位数据,所以写入数据的速度比RAID 0慢,但比普通磁盘快,写入1G数据所需总时间为6.822秒
5
、故障模拟(RAID 5)
[root@Eleven raid5]# mdadm /dev/md1 -f /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md1
说明:使用-f选项(failed)模拟磁盘sdb2的损坏
由于上面做性能测试时已经往RAID 5中写入了1G的数据,所以使用命令模拟磁盘损坏后,快速的查看RAID详细信息可以看出正在使用/dev/sde2重建数据(还原),而本来的/dev/sdb2成为了损坏的空闲设备
[root@Eleven raid5]# mdadm --detail /dev/md1
/dev/md1:
Version : 0.90
Creation Time : Wed Apr 4 12:36:49 2012
Raid Level : raid5
Array Size : 2216832 (2.11 GiB 2.27 GB)
Used Dev Size : 1108416 (1082.62 MiB 1135.02 MB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Wed Apr 4 12:53:32 2012
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 64K
Rebuild Status : 43% complete
UUID : 20eadcc6:dbfed0c1:eba76482:96d168ee
Events : 0.4
Number Major Minor RaidDevice State
3 8 66 0 spare rebuilding /dev/sde2
1 8 34 1 active sync /dev/sdc2
2 8 50 2 active sync /dev/sdd2
4 8 18 - faulty spare /dev/sdb2
激活磁盘:
[root@Eleven raid5]# mdadm -G /dev/md0 -n 3
mdadm: raid0 array /dev/md0 cannot be reshaped.
说明:-n 3 是激活的三个磁盘
查看具体信息:
[root@Eleven raid5]# mdadm --detail /dev/md1
/dev/md1:
Version : 0.90
Creation Time : Wed Apr 4 12:36:49 2012
Raid Level : raid5
Array Size : 2216832 (2.11 GiB 2.27 GB)
Used Dev Size : 1108416 (1082.62 MiB 1135.02 MB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Wed Apr 4 12:55:10 2012
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : 20eadcc6:dbfed0c1:eba76482:96d168ee
Events : 0.6
Number Major Minor RaidDevice State
0 8 66 0 active sync /dev/sde2
1 8 34 1 active sync /dev/sdc2
2 8 50 2 active sync /dev/sdd2
3 8 18 - faulty spare /dev/sdb2
说明:此博文参考互联网和一些博友文章。