Skip to content

RAID 管理

1. RAID 简介

1.1 RAID 概述

RAID 是独立磁盘冗余阵列(Redundant Array of Independent Disks)的缩写。RAID 设备是由多个存储设备按照特定的方式组合成的一个阵列,以单一设备出现在操作系统中,从而实现性能或冗余目标。 根据实现方式,RAID 可以分为软件 RAID 和硬件 RAID 两种形式:

软件 RAID

软件 RAID 设备通过内核 md (Multiple Devices) 设备驱动实现。

硬件 RAID

硬件 RAID 设备通过硬件设备(如 RAID 控制卡)实现。

1.2 RAID 级别

1.2.1 RAID0

RAID0 称为条带卷,它将多个磁盘并联,组成一个大容量磁盘。写入数据时,数据会并行分散存放在不同的设备上。如果组成 RAID0 的多个设备大小不同,每个设备的大小都被视为与最小设备大小相同。设备的总容量为最小设备大小和组成 RAID 设备数量的乘积。RAID0 的优点是写入性能好,其缺点是没有冗余和容错能力,如果一个磁盘损坏,所有数据都会丢失。 RAID0 示意图如下,设备 dev1 和 dev2 组成 RAID0,写入数据 A 时,A 被分成多个数据块 A1 ~ A6,A1、A3、A5 写入设备 dev1,A2、A4、A6 写入设备 dev2。

      RAID0
   +---------+
   |        |  
+----+    +----+
| A1 |    | A2 |
|----|    |----|
| A3 |    | A4 |
|----|    |----|
| A5 |    | A6 |
|----|    |----|
|    |    |    |
+----+    +----+
 dev1      dev2

1.2.2 RAID1

RAID1 称为镜像,组成 RAID1 的存储设备互为镜像,每个设备都保存数据的副本。RAID1 的优点是可靠性高,其中一个存储设备损坏后,不会导致数据丢失。RAID1 有较好的读取性能。其缺点是写入速度有小幅下降。另外,RAID1 没有校验机制,如果设备间存在数据不一致的情况,RAID1 只会从第一个工作的存储设备上提供数据。 RAID1 示意图如下,设备 dev1 和 dev2 组成 RAID1,写入数据 A 时,A 被分成多个数据块 A1 ~ A3,每个数据块都会分别写入设备 dev1 和 dev2。

      RAID1
   +---------+
   |        |  
+----+    +----+
| A1 |    | A1 |
|----|    |----|
| A2 |    | A2 |
|----|    |----|
| A3 |    | A3 |
|----|    |----|
|    |    |    |
+----+    +----+
 dev1      dev2

1.2.3 RAID4

RAID4 使用单独的磁盘保存奇偶校验信息块。写入数据时,RAID4 将数据分成多个区块依次写入多个磁盘,最后根据多个磁盘的值计算出奇偶校验值保存在最后一块磁盘。RAID4 最少需要 3 块磁盘,其中一块磁盘损坏时,可以根据其他磁盘重建数据。 RAID4 示意图如下,设备 dev1、dev2 和 dev3 组成 RAID4。dev1 和 dev2 保存数据,dev3 保存校验值。

           RAID4
   +---------+---------+
   |        |        |  
+----+    +----+    +----+
| A1 |    | A2 |    | Ap |
|----|    |----|    |----|
| B1 |    | B2 |    | Bp |
|----|    |----|    |----|
| C1 |    | C2 |    | Cp |
|----|    |----|    |----|
|    |    |    |    |    |
+----+    +----+    +----+
 dev1      dev2      dev3

1.2.4 RAID5

RAID5 使用奇偶校验信息块,将数据和奇偶校验信息均匀分布在各个磁盘上。RAID5 最少需要 3 块磁盘,其中一块磁盘损坏时,可以根据其他磁盘重建数据。 RAID5 示意图如下,设备 dev1、dev2 和 dev3 组成 RAID4。数据和校验值分散保存到了三个存储设备上。

           RAID5
   +---------+---------+
   |        |        |  
+----+    +----+    +----+
| A1 |    | A2 |    | Ap |
|----|    |----|    |----|
| B1 |    | Bp |    | B2 |
|----|    |----|    |----|
| Cp |    | C1 |    | C2 |
|----|    |----|    |----|
|    |    |    |    |    |
+----+    +----+    +----+
 dev1      dev2      dev3

1.2.5 RAID6

RAID6 使用使用两个奇偶校验信息块。但将数据和奇偶校验信息分散存储在各个磁盘上。RAID6 最少需要 4 块磁盘,其中两块磁盘损坏时,可以根据其他磁盘重建数据。 RIAID6 示意图如下:

                RAID6
   +---------+---------+---------+
   |        |        |         |  
+----+    +----+    +----+    +----+
| A1 |    | A2 |    | Ap |    | Aq |
|----|    |----|    |----|    |----|
| B1 |    | Bp |    | Bq |    | B2 |
|----|    |----|    |----|    |----|
| Cp |    | Cq |    | C1 |    | C2 |
|----|    |----|    |----|    |----|
|    |    |    |    |    |    |    |
+----+    +----+    +----+    +----+
 dev1      dev2      dev3      dev4

1.2.6 RAID10

RAID10 是组合 RAID,先组两个 RAID1 镜像卷,然后再组成 RAID0。 RAID10 示意图如下:

                RAID10
        +-------------------+
        |                  |
   +---------+         +---------+
   |        |        |         |  
+----+    +----+    +----+    +----+
| A1 |    | A1 |    | A2 |    | A2 |
|----|    |----|    |----|    |----|
| A3 |    | A3 |    | A4 |    | A4 |
|----|    |----|    |----|    |----|
| A5 |    | A5 |    | A6 |    | A6 |
|----|    |----|    |----|    |----|
|    |    |    |    |    |    |    |
+----+    +----+    +----+    +----+
 dev1      dev2      dev3      dev4

1.2.7 不同 RAID 级别的比较

RAID 级别 最小磁盘数 可用容量 随机读性能 随机写性能 容错性 应用场景
RAID0 2 n*单盘容量 适用于读写性能要求高,但容错性无要求的场景
RAID1 2 1*单盘容量 较低 允许 (n-1) 块磁盘损坏 适用于对读写性能要求不高,但容错性要求高的场景
RAID4 3 (n-1)*单盘容量 较高 较低 允许 1 块磁盘损坏 适用于对读性能和容错性有一定要求的场景
RAID5 3 (n-1)*单盘容量 较高 较低 允许 1 块磁盘损坏 适用于对读性能和容错性有一定要求的场景
RAID6 4 (n-2)*单盘容量 较高 较高 允许 2 块磁盘损坏 适用于对读性能和容错性有一定要求的场景
RAID10 4 (n/2)*单盘容量 互为镜像的磁盘中有一块磁盘正常即可 适用于对读写性能和容错性要求高的场景

2. 软 RAID 管理

2.1 创建软 RAID

可以使用 mdadm 命令创建软 RAID。 下面的示例通过 /dev/sdb1 和 /dev/sdb2 组建 RAID1:

$ mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

--level 指定 RAID 级别。 --raid-devices 指定组建 RAID 的设备数量。 创建成功后,/dev 下面会出现 md0 设备。lsblk 可以查看到设备信息:

sdb           8:16   0   64G  0 disk  
└─sdb1        8:17   0    8G  0 part  
  └─md0       9:0    0    8G  0 raid1 
sdc           8:32   0   64G  0 disk  
└─sdc1        8:33   0    8G  0 part  
  └─md0       9:0    0    8G  0 raid1 

2.2 查看软 RAID

2.2.1 查看软 RAID 信息

# mdadm --detail /dev/md0 
/dev/md0:
           Version : 1.2
     Creation Time : Wed May 31 20:26:56 2023
        Raid Level : raid1
        Array Size : 8379392 (7.99 GiB 8.58 GB)
     Used Dev Size : 8379392 (7.99 GiB 8.58 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Wed May 31 20:29:05 2023
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : OCS:0  (local to host OCS)
              UUID : 9ef0643d:4ea3897d:4ddd4305:de505872
            Events : 17

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1

2.2.2 查看软 RAID 中设备信息

$ mdadm --examine /dev/sdb1 /dev/sdc1
/dev/sdb1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 9ef0643d:4ea3897d:4ddd4305:de505872
           Name : OCS:0  (local to host OCS)
  Creation Time : Wed May 31 20:26:56 2023
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 16758784 sectors (7.99 GiB 8.58 GB)
     Array Size : 8379392 KiB (7.99 GiB 8.58 GB)
    Data Offset : 18432 sectors
   Super Offset : 8 sectors
   Unused Space : before=18352 sectors, after=0 sectors
          State : clean
    Device UUID : 82cd6042:2195b1a3:af8878c1:27adb01f

    Update Time : Wed May 31 20:29:05 2023
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : a83c205d - correct
         Events : 17


   Device Role : Active device 0
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)
/dev/sdc1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 9ef0643d:4ea3897d:4ddd4305:de505872
           Name : OCS:0  (local to host OCS)
  Creation Time : Wed May 31 20:26:56 2023
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 16758784 sectors (7.99 GiB 8.58 GB)
     Array Size : 8379392 KiB (7.99 GiB 8.58 GB)
    Data Offset : 18432 sectors
   Super Offset : 8 sectors
   Unused Space : before=18352 sectors, after=0 sectors
          State : clean
    Device UUID : 9ef0643d:4ea3897d:4ddd4305:de505872
           Name : OCS:0  (local to host OCS)
  Creation Time : Wed May 31 20:26:56 2023
     Raid Level : raid1
   Raid Devices : 2

 Avail D : 411e5461:7ae96988:623268d7:371605d1

    Update Time : Wed May 31 20:29:05 2023
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : 732bd83a - correct
         Events : 17


   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

2.3 在 RAID 设备上创建分区及文件系统

可以在 RAID 设备上创建文件系统。 下面的例子在 /dev/md0 上创建 ext4 文件系统,如下所示:

$ mkfs.ext4 /dev/md0

也可以在 RAID 设备上创建分区,如下所示:

$ parted /dev/md0 mkpart testmd0 1MiB 1024MiB

创建完成后,通过 lsblk 查看,可以看到出现一个 /dev/md0p1 设备,为 md0 设备的第一个分区:

sdb           8:16   0   64G  0 disk  
└─sdb1        8:17   0    8G  0 part  
  └─md0       9:0    0    8G  0 raid1 
    └─md0p1 259:1    0 1023M  0 part  
sdc           8:32   0   64G  0 disk  
└─sdc1        8:33   0    8G  0 part  
  └─md0       9:0    0    8G  0 raid1 
    └─md0p1 259:1    0 1023M  0 part

可以继续在分区上创建文件系统并挂载。

2.4 调整软 RAID 容量

可以使用如下命令调整 RAID 容量:

mdadm --grow --size=value md-device

--grow 表明调整容量。 --size 指定调整后的大小,单位为 KiB,小于当前容量实现缩容,大于当前容量实现扩容,容量需要小于组成 RAID 的设备容量。 下面的示例将 /dev/md0 缩容至 4GB(缩容前 8G):

mdadm --grow --size=4194304 /dev/md0

2.5 转换软 RAID 的级别

软 RAID 支持从一个级别转换成另一个级别,支持的软 RAID 转换如下:

源级别 目标级别
RAID0 RAID4, RAID5, RAID10
RAID1 RAID0, RAID5
RAID4 RAID0, RAID5
RAID5 RAID0, RAID1, RAID4, RAID6, RAID10
RAID6 RAID5
RAID10 RAID0
下面的示例将 RAID1 转换成 RAID5:
mdadm --grow /dev/md0 --level=5 --raid-devices=3 --force

由于 RAID5 至少需要 3 块磁盘,而转换前的 RAID1 由 2 块磁盘组成,还需要添加一块磁盘,命令如下:

mdadm --manage /dev/md0 --add /dev/sdb2

执行完成后,可以通过如下命令查看软 RAID 的最新状态:

$ mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed May 31 20:26:56 2023
        Raid Level : raid5
        Array Size : 4194304 (4.00 GiB 4.29 GB)
     Used Dev Size : 4194304 (4.00 GiB 4.29 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Thu Jun  1 10:16:43 2023
             State : clean, reshaping 
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 64K

Consistency Policy : resync

    Reshape Status : 42% complete
     Delta Devices : 1, (2->3)

              Name : OCS:0  (local to host OCS)
              UUID : 9ef0643d:4ea3897d:4ddd4305:de505872
            Events : 39

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       18        2      active sync   /dev/sdb2

2.6 替换软 RAID 中损坏的磁盘

下面的示例中 /dev/sdb1 和 /dev/sdc1 组成 RAID1:

$ mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Thu Jun  1 11:55:27 2023
        Raid Level : raid1
...

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1

假设 sdb1 分区出现问题,我们需要用 sdb2 替换 sdb1,操作流程如下: 首先需要将有问题的分区标记为故障:

$ mdadm --manage /dev/md0 --fail /dev/sdb1

然后从 RAID 中删除故障分区:

$ mdadm --manage /dev/md0 --remove /dev/sdb1

向 RAID 中添加新的设备:

$ mdadm --manage /dev/md0 --add /dev/sdb2

最后,查看 RAID 信息,验证是否添加成功:

$ mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Thu Jun  1 11:55:27 2023
        Raid Level : raid1
...

    Rebuild Status : 11% complete

              Name : OCS:0  (local to host OCS)
              UUID : 88e4b53b:05d6162b:b81126ea:bba23288
            Events : 29

    Number   Major   Minor   RaidDevice State
       2       8       18        0      spare rebuilding   /dev/sdb2
       1       8       33        1      active sync   /dev/sdc1

可以看到 /dev/sdb2 添加成功,正在重建数据。

2.7 删除软 RAID

下面的示例演示如何删除由 /dev/vdb、/dev/vdc、/dev/vdd 和 /dev/vde 组成的 raid6 级别软 RAID 设备 /dev/md0: 查看软 RAID 信息:

# mdadm --detail /dev/md0 
/dev/md0:
           Version : 1.2
     Creation Time : Wed Jun  7 12:55:57 2023
        Raid Level : raid6
        Array Size : 33519616 (31.97 GiB 34.32 GB)
     Used Dev Size : 16759808 (15.98 GiB 17.16 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Jun  7 12:58:58 2023
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : fa8f7b1f:4545ff4b:d2d7bfad:9249434a
            Events : 17

    Number   Major   Minor   RaidDevice State
       0     252       16        0      active sync   /dev/vdb
       1     252       32        1      active sync   /dev/vdc
       2     252       48        2      active sync   /dev/vdd
       3     252       64        3      active sync   /dev/vde

停止软 RAID 设备 /dev/md0:

$ mdadm --stop /dev/md0 
mdadm: stopped /dev/md0

清理磁盘上软 RAID 元数据:

$ mdadm --zero-superblock /dev/vdb /dev/vdc /dev/vdd /dev/vde

命令执行成功后,软 RAID 设备 /dev/md0 则被删除。