RAID磁盘阵列
目录:
1. 摘要
2. RAID级别
3. Linux软件RAID实例
4. 性能测试对比
5. 故障模拟
1. 摘要
    早在1978年美国加州大学伯克利分校就提出了RAID虚拟存储系统。RAID全称:Redundant Array of Independent Disk,独立冗余磁盘阵列。其思想是将多块独立的磁盘按不同的方式组合为一个逻辑磁盘,从而提高存储容量或提升存储性能或提供数据备份功能。RAID存储系统的组合方式根据RAID级别定义。
    RAID种类:软件RAID,硬件RAID。在现有的操作系统中如Windows、Linux、Unix等已经集成了软RAID的功能。软RAID可以实现与硬件RAID相同的功能,但由于其没有独立的硬件控制设备,所以性能不如硬件RAID,但软RAID实现简单、不需要额外的硬件设备。硬件RAID通常需要有RAID卡,RAID卡本身会有独立的控制部件与内存,所以不会占有系统资源,效率高、性能强。当然目前市面上有很多主板已经集成了RAID卡,具体的使用方式可以参考硬件说明书。
    现在RAID存储系统被广泛应用于生产环境作为存储解决方案。
******************************************************************************************************
2. RAID级别
    RAID根据组合的方式不同有多种设计解决方案,以下介绍几种常见的RAID方案(RAID级别)。
  2.1. RAID 0(不含校验与冗余的条带存储)
    多块磁盘组合为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.2. RAID 1(不含校验的镜像存储)
     多块磁盘组合为RAID 1后,数据将被同时复制到每块硬盘中,制作这种磁盘阵列至少需要2块硬盘,该级别的RAID只要有一块磁盘可用即可正常工作,该级别的阵列安全行是最好的,磁盘利用率是最低的。
RAID 1
  |
      -------------------------
      |              |
  (_DATA1_)(_DATA1_)
  (_DATA2_)(_DATA2_)
  (_DATA3_)(_DATA3_)
  (_DATA4_)(_DATA4_)
   (       )         (       )
   (       )         (       )
     磁盘1    磁盘2
      说明:如果有一个文件要写入RAID 1,则该文件会被分成数据块写入磁盘1,同时写入磁盘2,DATA1与DATA2被同时存入磁盘1与磁盘2,其他部分依次类推。RAID 1写入数据的效率会降低,因为数据需要同时写入两块硬盘,但RAID 1读取数据的效率会提升,因为可以同时从两块硬盘读取数据。
  2.3 RAID 2(位级别的校验式条带存储)
      多块磁盘组合为RAID 2后,数据将以位(bit)为单位同步式分别存储在不同的硬盘上,并采用海明码对数据进行校验与恢复。
    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
      从这些数据可以看出任何一组数据丢失,都可以由另外两组数据运算恢复!
    2.4 RAID 3(字节级别的校验式条带存储)
          该级别的磁盘阵列可以参考RAID 2的读写原理,仅数据分割的单位为字节。
    2.5 RAID 4 (数据块级别的校验式条带存储)
          该级别的磁盘阵列与RAID 5类似,仅校验数据被写入至同一块硬盘中。
 RAID 4
     |
        ----------------------------------------------
                |      |           |     |
  (_DATA1_)(_DATA2_)(_DATA3_) (_Parity1_)
  (_DATA4_)(_DATA5_)(_DATA6_)(_Parity2_)
  (_DATA7_)(_DATA8_)(_DATA9_)(_Parity3_)
  (_DATA10_)(_DATA11_)(_DATA12_)(_Parity4_)
   (       ) (       ) (      )        (       )
           (       ) (       ) (      ) (       )
     磁盘1   磁盘2   磁盘3   磁盘4
    2.6 RAID 5 (数据块级别的分布式校验条带存储)
   RAID 5
       |
       -------------------------------
               |      |             |
  (_DATA1_)(_DATA2_)(_Parity1_) 
  (_DATA3_)(_Parity2_)(_DATA4_)
  (_Parity3_)(_DATA5_)(_Parity4_)
    (       )    (       ) (      )
    (       ) (       ) (      )
     磁盘1   磁盘2   磁盘3
******************************************************************************************************
3. Linux软件RAID实例(红色字体为自己输入的命令,其他为命令的输出)
第一步:
查看磁盘信息如下:
#[root@localhost ~]# 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        2610    20860402+  8e  Linux LVM
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
    由以上信息可以看出本机有sdb,sdc,sdd三块硬盘未分区,如果需要在Linux中实现软RAID,可以将每块硬盘分一个区组建RAID,同样可以对硬盘分多个区实现软RAID,这里我们每块硬盘分两个区。
第二步:
创建硬盘分区:
[root@localhost ~]# 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可选择的分区类型有Primary(主分区)和extended(扩展分区)
   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输入分区大小(注意+)
一下方法与上面相同,创建第二个分区:
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
这里输入t,用来改变分区类型
Command (m for help): t
Partition number (1-4): 1注明修改第一个分区的类型
Hex code (type L to list codes): fd格式为fd,即raid。不清楚格式时可以输入L查看所有分区类型
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@localhost ~]# partprobe -a自动识别新建的分区
第三步:
创建RAID,这里仅以RAID0与RAID5为例,其余级别的磁盘阵列操作方法类似
RAID 0
    1.创建RAID 0
[root@localhost ~]# mdadm  -C  /dev/md0 -l 0 -n 3  /dev/sdb1  /dev/sdc1  /dev/sdd1
mdadm: array /dev/md0 started.
注释:-C为创建(create), -l指定RAID级别(level),-n说明磁盘个数
    2.查看RAID 0详细信息
[root@localhost ~]# mdadm --detail  /dev/md0查看md0信息
/dev/md0:
        Version : 0.90
  Creation Time : Thu May 17 03:46:55 2012创建时间
     Raid Level : raid0        RAID级别
     Array Size : 2963520 (2.83 GiB 3.03 GB)RAID磁盘空间
   Raid Devices : 3磁盘个数
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Thu May 17 03:46:55 2012
          State : clean
 Active Devices : 3活动磁盘个数
Working Devices : 3        工作磁盘个数
 Failed Devices : 0错误磁盘个数
  Spare Devices : 0空闲磁盘个数
     Chunk Size : 64K
           UUID : 62e9bd3e:f4dcf02d:319e2a62:8099eb72设备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
格式化并使用:
[root@localhost ~]# mkfs.ext3 /dev/md0
[root@localhost ~]# mkdir  /raid0;  mount  /dev/md0   /raid0
RAID 5
    1.创建RAID 5
[root@localhost ~]# mdadm  -C  /dev/md1 -l 5 -n 3 -x 1  /dev/sdb2  /dev/sdc2  /dev/sdd2  /dev/sde2
mdadm: array /dev/md1 started.
注释:-C为创建(create), -l指定RAID级别(level),-n说明磁盘个数,x指定备用设备个数(因为RAID 5允许设备的损坏,因此指定一个备用设备,可以在活动设备损坏时自动替换为备用设备)
    2.查看RAID 5详细信息
[root@localhost ~]# mdadm --detail  /dev/md1
/dev/md1:
        Version : 0.90
  Creation Time : Thu May 17 03:55:31 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总磁盘数为4,1个为备用磁盘
Preferred Minor : 1
    Persistence : Superblock is persistent
    Update Time : Thu May 17 03:56:20 2012
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1
         Layout : left-symmetric
     Chunk Size : 64K
           UUID : 6c02bbcd:2a7a1d34:940e387b:ce0fa999
         Events : 0.2
    Number   Major   Minor   RaidDevice State
       0       8       18        0      active sync   /dev/sdb2
       1       8       34        1      active sync   /dev/sdc2
       2       8       50        2      active sync   /dev/sdd2
       3       8       66        -      spare   /dev/sde2该磁盘为备用磁盘
格式化并使用:
[root@localhost ~]# mkfs.ext3 /dev/md1
[root@localhost ~]# mkdir  /raid5;  mount  /dev/md1   /raid5
4.性能测试对比
**************************
**  普通磁盘:写入模拟  **
**************************
[root@localhost ~]# 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, 21.7965 seconds, 48.1 MB/s
real    0m23.262s
user    0m0.001s
sys     0m2.209s
可以看出对普通磁盘写入1G的数据所需总时间为23.262秒
*************************
**  RAID 0:写入模拟   **
*************************
[root@localhost 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.87193 seconds, 271 MB/s
real    0m4.308s
user    0m0.001s
sys     0m1.604s
可以看出对RAID 0写入1G数据所需总时间为4.308秒
*************************
**   RAID 5:写入模拟  **
*************************
[root@localhost 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, 12.5047 seconds, 83.9 MB/s
real    0m12.614s
user    0m0.004s
sys     0m3.705s
可以看出由于RAID 5需要生成校验位数据,所以写入数据的速度比RAID 0慢,但比普通磁盘快,写入1G数据所需总时间为12.614秒
5. 故障模拟(RAID 5)
[root@localhost 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@localhost ~]# mdadm --detail /dev/md1
... ... ... ... ... ... ...
... ... ... ... ... ... ...
... ... ... ... ... ... ...
    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
最后:现实生产环境中均使用安全、可靠、高效的硬件磁盘阵列,但通过以上实验可以让我们对整体的磁盘阵列的原理有个全面而充分的认知!
O了,洗洗睡吧。

 

本文出自 “丁丁历险” 博客,请务必保留此出处http://manual.blog.51cto.com/3300438/866143