有时候我们需要容量较大或读写性能比较好的磁盘,特别是在服务器中,但这样的磁盘价格自然比较昂贵,比如说SSD。此时如果你手头有几块普通磁盘,RAID就可以派上用场了。


一、RAID是什么?

RAID(Redundant Arrays of Independent Disks)意思是廉价磁盘冗余阵列,它可将至少两个便宜的普通磁盘组合成容量巨大的磁盘组,以扩大存储空间或提升读写性能或让数据具有容错能力。磁盘可组成多种RAID级别。

评判RAID主要有三个标准:空间利用率读写性能容错性


二、RAID级别

1、RAID0/条带化

wKioL1YfksOgSsYXAACk-gigoAk987.jpg

这种模式的RAID会将数据以切片的方式依序平均分配到每个磁盘。如图,“A1”保存于磁盘1,“A2”保存于磁盘于2,然后“B1”保存于磁盘1,“B2”保存于磁盘于2,这样循环下去。如果其中一块磁盘损坏,就会丢失数据

◆至少需要两块磁盘;空间利用率:100%;读写性能最好;无容错能力;RAID0主要具有扩容和提速的功能,不能应用于要求数据高可用的环境


2、RAID1/镜像化

wKiom1YfksGR1HNhAAEVMF8Nq6s674.jpg

这种模式的RAID让同一份数据完整地保存于两个或多个磁盘上,即把一个或多个磁盘作为另一磁盘的镜像。

◆至少需要两块磁盘;空间利用率:1/n,不超过50%;读性能提升,写性略有下降;完全容错,数据恢复快;用于对数据安全性要求较高的环境中,如数据库


3、RAID5

wKiom1YfkwCypHT6AAFLu_EzezI320.jpg

这种RAID模式的数据写入类似于RAID0,但它会在每个循环写入过程中加入校验码,而且这些校验码也是分散于各个磁盘上的,如下图,这样当其中一块磁盘损坏时,使用完好的数据和校验码经过CPU计算后还能恢复丢失的数据。如果两个或两个以上磁盘损坏,则无法恢复。

◆至少需要三块磁盘;空间利用率:(n-1)/n;读性能很好,写性能平均水平;容错(允许坏一块磁盘);这种模式相当于RAID0和RAID1的折衷,即有较好的性能,也具备一定的容错能力,是比较通用的做法


4、RAID6

wKioL1Yfk2HyWJ0LAAUNZa73YGg470.jpg

RAID6类似于RAID5,只是有两块校验盘,允许同时坏两坏盘。

◆至少需要四块磁盘;空间利用率:(n-2)/n;读性能很好,写性能不如RAID5;容错能力比RAID强(允许坏两块磁盘)


5、RAID0+1和RAID10

wKiom1YflB-hfRfHAAGAh6QDGCo744.jpg         wKioL1YflEGjQALTAAGQHJHI2dQ255.jpg

RAID0+1容易理解,就是先组成RAID0,后组成RAID1,即先条带后镜像;RAID10刚好相反,先镜像后条带。如图,RAID0+1不允许disk1和disk3(或者disk2和disk4)同时坏掉,而RAID10不允许disk1和disk2(或者disk3和disk4)同时坏掉。因为在同一对磁盘中,两块磁盘都坏掉的概率很低,因此RAID10比RAID0+1安全

◆至少需要四块磁盘;空间利用率不超过50%;读性能好,写性能与RAID5相近;完全容错,数据恢复快;raid10既具有较高的性能,又有很好的容错性,因此应用广泛,缺点是成本高


三、spare disk(备用磁盘)

对于具有容错能力的RAID,当然需要一个或多个备用磁盘,这些磁盘平时并不使用,当 RAID中有磁盘损坏时才顶替上来。备用磁盘一般是预先装在主板上并设置为阵列的备用磁盘的,这样当阵列中某块磁盘损坏时,备用磁盘会被主动拉进阵列中重建数据,那块损坏的磁盘则会被移出阵列。如果系统支持热插拔,我们可直接拔出坏盘并再换上一个新的,否则需要关机处理。


四、硬RAID和软RAID

◆硬RAID:通过专门的RAID控制器实现,RAID控制器负责将各成员磁盘连接起来并虚拟成一个逻辑磁盘。操作系统只能识别到逻辑磁盘,而无法识别各物理成员盘。硬RAID需要在安装系统之前进入BIOS界面设置。硬RAID的设备名为/dev/sd[a-p]

◆软RAID:如果硬件条件不满足,可以在软件层面模拟实现RAID,这当然会消耗部分系统资源,且其性能自然不如硬RAID。创建软RAID仅需多个块设备,甚至只需要分区即可,但不宜将RAID创建在同一块磁盘上。Centos提供的配置软RAID的程序为mdadm,软RAID的设备名为/dev/md#(#为非负整数)


五、使用mdadm命令配置软RAID

mdadm:命令行工具,结合md(multidisks)模块实现软RAID,该模块由内核提供

主要用法:

①创建模式:创建RAID

    mdadm --create/-C RAID设备 options...

   主要选项:

       -l #(--level=#):指定RAID级别

       -c chunk_size(--chunk=chunk_size):指定chunk大小,默认为512K

       -n #(--raid-devices=#):用于创建raid设备的磁盘个数          

       -x #(--spare-devices=#):用于RAID的备用磁盘个数

       -a yes(--auto=yes):自动为创建的RAID生成设备文件

    例如 mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/sda /dev/sdb /dev/sdc

②管理模式

    mdadm [--manage] RAID设备 options...

    主要选项:

        --fail/-f DEVICE:将RAID设备中的指定磁盘手动设置为损坏

        --remove/-r DEVICE:将RAID设备中的指定非活动盘(损坏盘或备用盘)移出

        --add/-a DEVICE:给RAID设备添加磁盘

    例如:

        mdadm /dev/md0 -f /dev/sdc:将阵列md0中的sdc手动设置为损坏

        mdadm /dev/md0 -r /dev/sdc:将md0中的损坏状态的sdc移除

        mdadm /dev/md0 -a /dev/sde:给md0中添加sde

        可写入同一行,如mdadm /dev/md0 -f /dev/sdc -r /dev/sdc -a /dev/sde

③查看指定软RAID设备的详细信息

    mdadm --detail/-D RAID设备

④停止软RAID

    mdadm --stop/-S RAID设备

⑤重新启用软RAID

    mdadm --assemble/-A RAID设备 DEVICE

    后面指定的DEVICE当然是原来属于同一RAID中的磁盘

⑥查看某个磁盘的RAID superblock信息,一般用来确定某磁盘是否被现有RAID使用或者其到底属于哪个RAID

    mdadm --examine/-E DEVICE

mdadm --detail --scan:get a list of array devices from /proc/mdstat

⑦mdadm还有其它使用模式,如装配模式,管理模式,监控模式等,不在此详解,可查看帮助文档


◆cat /proc/mdstat:查看系统上所有已启用的软RAID设备及其相关信息

◆mdadm的配置文件:/etc/mdadm.conf,默认没有,需手动创建。mdadm的正常运行并不依赖此文件,该配置文件的主要作用是便于跟踪软RAID的配置。

几点说明:

1、当我们创建RAID时,该RAID的相关信息会被注入到各成员磁盘(包括备用盘)的RAID超级块当中。

2、一个磁盘只能属于一个RAID,将其RAID superblock中的信息冲掉才能被使用于其它RAID的创建中

2、停止RAID后,此RAID的成员磁盘也不能直接被系统挂载使用,需要重新格式化。


示例:使用4块磁盘配置RAID5,其中一块作为备用盘

注:因只作演示,此例中选用单个磁盘上的5个分区,实际环境中不可这样操作。前面说过,RAID不宜创建在同一块磁盘上

1、创建分区

[root@localhost ~]# fdisk /dev/sda   # 创建了5个逻辑分区
...
Command (m for help): n
First cylinder (1593-3916, default 1593): 
Using default value 1593
Last cylinder, +cylinders or +size{K,M,G} (1593-3916, default 3916): +2G
...
Command (m for help): p
...
/dev/sda5            1593        1854     2103487+  83  Linux
/dev/sda6            1855        2116     2104483+  83  Linux
/dev/sda7            2117        2378     2104483+  83  Linux
/dev/sda8            2379        2640     2104483+  83  Linux
/dev/sda9            2641        2902     2104483+  83  Linux

Command (m for help): w   # 保存退出
...
[root@localhost ~]# partx -a /dev/sda   # 重读分区表
...
[root@localhost ~]# kpartx -af /dev/sda   # 重读分区表
...

2、创建RAID并查看RAID相关信息

[root@localhost ~]# mdadm -E /dev/sda5   # 实际环境中,当我们不确定某设备是否被现有RAID使用时,可这样测试
mdadm: No md superblock detected on /dev/sda5.
[root@localhost ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sda{5,6,7,8}   #这里使用了5-8分区创建了一个RAID
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@localhost ~]# mdadm -D /dev/md0   # 查看该RAID的详细信息
/dev/md0:
        Version : 1.2
  Creation Time : Wed Sep 30 21:26:56 2015
     Raid Level : raid5   # RAID级别
     Array Size : 4202496 (4.01 GiB 4.30 GB)   # 该RAID的可用空间
  Used Dev Size : 2101248 (2.00 GiB 2.15 GB)
   Raid Devices : 3    # RAID磁盘数
  Total Devices : 4    # 包括备用盘的总磁盘数
    Persistence : Superblock is persistent

    Update Time : Wed Sep 30 21:28:31 2015
          State : clean 
 Active Devices : 3    # 活动磁盘数
Working Devices : 4    # 工作磁盘数
 Failed Devices : 0
  Spare Devices : 1    # 备用磁盘数

         Layout : left-symmetric
     Chunk Size : 512K

           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : b0f5f243:c7f4a4af:b9362bb5:e2d265e4   # 该RAID设备的UUID
         Events : 18

    Number   Major   Minor   RaidDevice State   # 各成员盘的信息
       0       8        5        0      active sync   /dev/sda5
       1       8        6        1      active sync   /dev/sda6
       4       8        7        2      active sync   /dev/sda7

       3       8        8        -      spare   /dev/sda8
[root@localhost ~]# mdadm -E /dev/sda8   # 查看某成员盘的RAID超级块信息
/dev/sda8:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : b0f5f243:c7f4a4af:b9362bb5:e2d265e4
           Name : localhost.localdomain:0  (local to host localhost.localdomain)
  Creation Time : Wed Sep 30 21:29:15 2015
     Raid Level : raid5
   Raid Devices : 3

 Avail Dev Size : 4204871 (2.01 GiB 2.15 GB)
     Array Size : 4202496 (4.01 GiB 4.30 GB)
  Used Dev Size : 4202496 (2.00 GiB 2.15 GB)
    Data Offset : 4096 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : 0c446570:f386af4d:095bb98b:4b8ab449  # 该成员磁盘的UUID

    Update Time : Wed Sep 30 21:31:03 2015
       Checksum : 5aeac748 - correct
         Events : 20

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : spare   # 在RAID中的角色
   Array State : AAA ('A' == active, '.' == missing)

[root@localhost ~]# cat /proc/mdstat    # 查看所有已启用的软RAID设备的相关信息
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sda7[4] sda8[3](S) sda6[1] sda5[0]
      4202496 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
# 中括号中的数字表示磁盘在RAID中的顺序,S表示spare即备用盘
unused devices: <none>
[root@localhost ~]# mdadm --detail --scan >> /etc/mdadm.conf   # 将RAID设备信息导入配置文件中
[root@localhost ~]# cat /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 spares=2 name=localhost.localdomain:0 UUID=b0f5f243:c7f4a4af:b9362bb5:e2d265e4

3、格式化并挂载

[root@localhost ~]# mke2fs -t ext4 -L mysr /dev/md0   # 对该RAID格式化
...
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
...
[root@localhost ~]# mkdir /softraid
[root@localhost ~]# mount /dev/md0 /softraid   # 挂载
[root@localhost ~]# mount
...
/dev/md0 on /softraid type ext4 (rw)   # 显示挂载成功
[root@localhost ~]# vim /etc/fstab    # 写入开机自动挂载配置文件
/dev/md0                /softraid               ext4    defaults        0 0
[root@localhost ~]# cp /etc/inittab /softraid   # 写入数据
[root@localhost ~]# ls /softraid
inittab  lost+found

4、模拟救援

[root@localhost ~]# mdadm /dev/md0 -f /dev/sda7   # 将sda7设置为损坏状态
mdadm: set /dev/sda7 faulty in /dev/md0
[root@localhost ~]# mdadm /dev/md0 -r /dev/sda7   # 移除sda7
mdadm: hot removed /dev/sda7 from /dev/md0
[root@localhost ~]# mdadm -D /dev/md0
...
    Number   Major   Minor   RaidDevice State
       0       8        5        0      active sync   /dev/sda5
       1       8        6        1      active sync   /dev/sda6
       3       8        8        2      spare rebuilding   /dev/sda8
       # 可以看到备用盘sda8自动顶替上来并重建数据
[root@localhost ~]# mdadm -D /dev/md0
...
    Number   Major   Minor   RaidDevice State
       0       8        5        0      active sync   /dev/sda5
       1       8        6        1      active sync   /dev/sda6
       3       8        8        2      active sync   /dev/sda8
       # 重建完毕
[root@localhost ~]# cat /softraid/inittab   # 文件正常显示,数据没有丢失
# inittab is only used by upstart for the default runlevel.
...
[root@localhost ~]# mdadm /dev/md0 -a /dev/sda9   将sda9加入到该RAID中
mdadm: added /dev/sda9
[root@localhost ~]# cat /proc/mdstat  # 显示添加成功,sda9被自动设为备用磁盘
Personalities : [raid6] [raid5] [raid4] [raid1] 
md0 : active raid5 sda9[4](S) sda8[3] sda6[1] sda5[0]
      4202496 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: <none>
[root@localhost ~]# umount /dev/md0   # 停止RAID前必先确保其离线
[root@localhost ~]# mdadm -S /dev/md0   # 若确定不再使用该RAID,卸载后务必将其关闭
mdadm: stopped /dev/md0
[root@localhost ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.306279 s, 171 MB/s
[root@localhost ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
[root@localhost ~]# dd if=/dev/zero of=/dev/sda5 bs=1M count=50
[root@localhost ~]# dd if=/dev/zero of=/dev/sda6 bs=1M count=50
[root@localhost ~]# dd if=/dev/zero of=/dev/sda7 bs=1M count=50
[root@localhost ~]# dd if=/dev/zero of=/dev/sda8 bs=1M count=50
[root@localhost ~]# dd if=/dev/zero of=/dev/sda9 bs=1M count=50
# 即使停止RAID后,各成员盘中的RAID相关信息还在,为防止这些成员磁盘被重新装配,最好将其RAID超级块中的信息都清除