创建RAID阵列(Linux)

更新时间:
复制 MD 格式

独立冗余磁盘阵列RAID(Redundant Array of Independent Disks)是将多块云盘按一定的方式组成一个磁盘阵列组。相比单块云盘,RAID能够有效地提高磁盘的容量、读写带宽、可靠性和可用性。

前提条件

已按需创建并挂载多块具有相同容量和类型的数据盘。具体操作,请参见创建空数据盘挂载数据盘

RAID使用建议

RAID级别

下表对比了RAID常见的几种级别优缺点以及适用场景。

级别

优势

劣势

适用场景

RAID 0(条带)

提供了数据条带化和并行读/写操作,从而提高了性能。

说明

RAID条带化是指将数据分成固定大小的块(条带),然后将这些块依次分配到不同的磁盘驱动器上。

没有冗余功能,如果其中一块云盘出现故障,所有数据都将丢失。

适用于需要高性能但无需数据冗余的场景,如临时数据存储、缓存等。

RAID 1(镜像)

通过数据镜像提供了高可靠性。所有数据都会被复制到多块云盘上,当一块云盘故障时,数据仍然可用。

成本较高,因为至少需要两倍的云盘容量来存储镜像数据。

适用于对数据保护和可靠性要求较高的应用,如数据库、文件服务器等。

RAID 10

结合了RAID 1RAID 0,提供了数据冗余和高性能。RAID 10的优点是具有较高的可靠性和较好的读/写性能。

成本较高,因为需要两倍的云盘容量来存储镜像数据。至少需要四块云盘。

适用于对性能和冗余性要求较高的应用。

在选择适当的RAID级别时,需要综合考虑数据保护需求、性能需求、可用磁盘容量和成本等因素。最好评估不同RAID级别的优缺点,并根据具体的应用需求作出选择。

假如要按序存储A、B、C、D、E、F等数据块,不同RAID模式的表现情况如下图所示。

image
说明

在您使用多块云盘做RAID来提高磁盘的容量、读写带宽的同时,请同时考虑实例整体对云盘带宽的限制。不同实例规格的云盘带宽限制,请参见实例规格族

RAID条带大小

通过使用合适的条带大小,可以获得最佳的应用实践。最适合的条带大小可能因不同的环境和应用而异。因此,建议在实际使用之前进行测试和性能评估,以确定最佳的条带大小设置。

根据应用的工作负载类型、I/O模式和系统的特定需求,推荐以下条带大小:

  • 对于大多数通用用途的工作负载,推荐的条带大小是64 KB128 KB。这个范围在大多数情况下可以提供良好的性能和均衡的读/写性能。

  • 如果工作负载主要是顺序读取(例如大型文件传输、视频编辑等),则更大的条带大小(例如256 KB512 KB)可能会提供更好的性能。

  • 如果您的工作负载主要是随机读取(例如数据库应用等),则较小的条带大小(例如32 KB)可能会提供更好的性能。

重要

在使用过程中,条带不宜太小。如果条带太小:

  • 可能会导致文件在磁盘上的碎片化,从而浪费了磁盘空间。

  • 可能会导致磁盘IOPS(每秒读写次数)能力先于吞吐带宽被打满。较大的条带大小可以在顺序读取工作负载中提供更高的数据吞吐量。

云盘快照使用限制

如果要使用快照备份RAID阵列中云盘上的数据,必须保证快照的一致性。默认各云盘的快照是相互独立创建的,如果从多个不同步的快照恢复RAID阵列,会影响阵列的完整性。

RAID场景下,建议使用快照一致性组,以确保多块云盘数据能够恢复到同一个时间点,以提供数据的一致性和可靠性。更多信息,请参见使用快照一致性组

操作步骤

本操作以Ubuntu 22.04版本的ECS实例为例,介绍如何使用Linux系统内置的mdadm命令为数据盘创建一个名称为/dev/md0RAID阵列。

  1. 远程连接ECS实例。

    关于连接方式的介绍,请参见选择ECS远程连接方式

  2. 运行以下命令,查看ECS实例上所有云盘信息。

    lsblk

    结果如下所示。

    $ lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
    loop0    7:0    0 79.9M  1 loop /snap/lxd/22923
    loop1    7:1    0 61.9M  1 loop /snap/core20/1405
    loop2    7:2    0 44.7M  1 loop /snap/snapd/15534
    loop3    7:3    0  111.9M  1 loop /snap/lxd/24322
    vda    252:0    0   40G  0 disk
    ├─vda1 252:1    0    1M  0 part
    ├─vda2 252:2    0  200M  0 part /boot/efi
    └─vda3 252:3    0 39.8G  0 part /
    vdb    252:16   0   40G  0 disk
    vdc    252:32   0   40G  0 disk
    vdd    252:48   0   40G  0 disk
    vde    252:64   0   40G  0 disk
    vdf    252:80   0   40G  0 disk
  3. 使用mdadm命令创建RAID阵列/dev/md0。

    请根据您的实际情况,创建RAID 0、RAID 1或者RAID 10级别。

    说明

    如果提示未安装mdadm,请先运行sudo apt-get install mdadm命令安装mdadm工具。

    RAID 0级别

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=5 --chunk=512 /dev/vd[bcdef]
    • --level=0:表示使用阵列条带化的RAID 0级别。

    • --raid-devices=5:表示RAID阵列由五块云盘组成。

    • --chunk=512:表示设置RAID阵列的条带大小为512 KB,请您根据实际需求进行设置。

    • /dev/vd[bcdef]:表示使用/dev/vdb、/dev/vdc、/dev/vdd、/dev/vde和/dev/vdf五块云盘组成一个RAID阵列。

    结果如下所示。

    $ sudo mdadm --create /dev/md0 --level=0 --raid-devices=5 --chunk=512 /dev/vd[bcdef]
    mdadm: /dev/vdb appears to be part of a raid array:
           level=raid0 devices=5 ctime=Thu Oct 19 14:29:32 2023
    mdadm: /dev/vdc appears to be part of a raid array:
           level=raid0 devices=5 ctime=Thu Oct 19 14:29:32 2023
    mdadm: /dev/vdd appears to be part of a raid array:
           level=raid0 devices=5 ctime=Thu Oct 19 14:29:32 2023
    mdadm: /dev/vde appears to be part of a raid array:
           level=raid0 devices=5 ctime=Thu Oct 19 14:29:32 2023
    mdadm: /dev/vdf appears to be part of a raid array:
           level=raid0 devices=5 ctime=Thu Oct 19 14:29:32 2023
    Continue creating array?
    Continue creating array? (y/n) y
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.

    RAID 1级别

    sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/vd[bc]
    • --level=1:表示使用阵列镜像化的RAID 1级别。

    • --raid-devices=2:表示RAID阵列由两块云盘组成。

    • /dev/vd[bc]:表示使用/dev/vdb和/dev/vdc两块云盘组成一个RAID阵列。

    RAID 10级别

    sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 --chunk=512 /dev/vd[bcde]
    • --level=10:表示使用RAID 10级别。

    • --raid-devices=4:表示RAID阵列由四块云盘组成。

    • --chunk=512:表示设置RAID阵列的条带大小为512 KB,请您根据实际需求进行设置。

    • /dev/vd[bcde]:表示使用/dev/vdb、/dev/vdc、/dev/vdd和/dev/vde四块云盘组成一个RAID阵列。

  4. 运行以下命令,查看创建的RAID阵列/dev/md0信息。

    sudo mdadm --detail /dev/md0

    结果如下所示。

    $ sudo mdadm --detail /dev/md0
    /dev/md0:
               Version : 1.2
         Creation Time : Thu Oct 19 14:31:31 2023
            Raid Level : raid0
            Array Size : 209546240 (199.84 GiB 214.58 GB)
          Raid Devices : 5
         Total Devices : 5
           Persistence : Superblock is persistent
    
           Update Time : Thu Oct 19 14:31:31 2023
                 State : clean
        Active Devices : 5
       Working Devices : 5
        Failed Devices : 0
         Spare Devices : 0
    
                Layout : -unknown-
            Chunk Size : 512K
    
    Consistency Policy : none
    
                  Name : iZ2zeihn2xxx  (local to host iZ2zeihn2xxx)
                  UUID : 3e1ba29b:d55xxx
                Events : 0
    
        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
           4      252      80        4      active sync   /dev/vdf
  5. 运行以下命令,在RAID阵列上创建一个文件系统,例如ext4文件系统。

    您也可以创建其他类型的文件系统。

    sudo mkfs.ext4 /dev/md0

    结果如下所示。

    $ sudo mkfs.ext4 /dev/md0
    mke2fs 1.46.5 (30-Dec-2021)
    Creating filesystem with 52386560 4k blocks and 13099008 inodes
    Filesystem UUID: 4f76b923-73ac-4a9b-838d-ef9be692b0b4
    Superblock backups stored on blocks:
    	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    	4096000, 7962624, 11239424, 20480000, 23887872
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (262144 blocks): done
    Writing superblocks and filesystem accounting information: done
  6. 运行以下命令,创建一份包含RAID信息的配置文件,设置RAID阵列在启动ECS实例时自动重组。

    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
  7. 挂载RAID阵列的文件系统。

    1. (可选)运行以下命令,创建挂载点,例如/media/raid0

      sudo mkdir /media/raid0
      说明

      您也可以将云盘挂载到已有目录下,例如/mnt

    2. 运行以下命令挂载文件系统,例如将/dev/md0挂载至/media/rad0。

      使用如下mount命令挂载文件系统时,请根据实际需求选择对应的挂载参数,以满足您对文件系统的数据安全性以及性能的要求。更多信息,请参见ext4文件系统挂载参数说明

      • (推荐)对文件系统的数据安全性和性能都有一定要求(数据安全性和性能适中)

        sudo mount /dev/md0 /media/raid0
      • 对文件系统的数据安全性要求较高(数据安全性较高、性能偏低)

        sudo mount -o rw,atime,sync,barrier,data=journal /dev/md0 /media/raid0
      • 对文件系统的性能要求较高(性能较高、数据安全性偏低)

        sudo mount -o defaults,noatime,nodiratime,nobarrier,nodelalloc,data=writeback /dev/md0 /media/raid0
    3. 运行以下命令,查看RAID阵列的挂载信息。

      df -h

      结果如下所示,返回信息中,文件系统已经挂载到指定的挂载点。

      $ df -h
      Filesystem      Size  Used Avail Use% Mounted on
      tmpfs           170M  1.1M  169M   1% /run
      /dev/vda3        40G  2.7G   35G   8% /
      tmpfs           846M     0  846M   0% /dev/shm
      tmpfs           5.0M     0  5.0M   0% /run/lock
      /dev/vda2       197M  6.1M  191M   4% /boot/efi
      tmpfs            50M     0   50M   0% /usr/local/aegis/cgroup
      tmpfs           170M  4.0K  170M   1% /run/user/1000
      /dev/md0        196G   28K  186G   1% /media/raid0
  8. 配置开机自动挂载。

    如果您需要设置开机自动挂载RAID阵列,需要在/etc/fstab中添加RAID阵列的挂载信息。

    1. 运行以下命令,向/etc/fstab配置文件写入RAID阵列信息。

      sudo sh -c "echo `blkid /dev/md0 | awk '{print $2}' | sed 's/\"//g'` /media/raid0 ext4 defaults 0 0 >> /etc/fstab"
      • /dev/md0:磁盘阵列名称。

      • /media/raid0:挂载点信息,您需要根据实际环境进行替换。如果需要挂载到其他路径,您需要修改成对应路径。

      • ext4:RAID阵列的文件系统类型,您需要根据已创建的文件系统类型进行修改。

      • defaults:文件系统的挂载参数。请您根据实际需求选择对应的挂载参数,以满足您对文件系统的数据安全性以及性能的要求。更多信息,请参见ext4文件系统挂载参数说明

      说明

      如果您需要在未挂载RAID阵列的情况下启动ECS实例,可以添加nofail配置。即使在安装云盘时出现错误,nofail配置也允许启动ECS实例。如果您使用的是Ubuntu系统,还需要额外添加nobootwait配置。

    2. 运行以下命令,查询RAID阵列的挂载信息是否添加成功。

      cat /etc/fstab

      结果如下所示,返回结果里出现了/media/raid0的信息,说明已添加挂载信息至/etc/fstab文件。

      ecs-user@iz2xxx:~$ cat /etc/fstab
      # /etc/fstab: static file system information.
      #
      # Use 'blkid' to print the universally unique identifier for a
      # device; this may be used with UUID= as a more robust way to name devices
      # that works even if disks are added and removed. See fstab(5).
      #
      # <file system> <mount point>   <type>  <options>       <dump> <pass>
      # / was on /dev/vda3 during curtin installation
      UUID=8b4ea6af-xxx               / ext4 defaults 0 1
      # /boot/efi was on /dev/vda2 during curtin installation
      UUID=41xx   /boot/efi vfat errors=remount-ro 0 1
      UUID=4f76b923-73ac-4a9b-xxx               /media/raid0 ext4 defaults 0 0
    3. 运行以下命令,挂载/etc/fstab配置文件中的所有文件系统。如果无报错输出,表示您的/etc/fstab配置无误。

      sudo mount -a
    4. 运行以下命令,检查挂载结果是否符合您的预期。

      df -Th

      结果如下所示,出现新建文件系统的信息,表示文件系统挂载成功。

      ecs-user@iZ2xxx pZ:~$ df -Th
      Filesystem      Type   Size  Used Avail Use% Mounted on
      tmpfs           tmpfs  170M  1.1M  169M   1% /run
      /dev/vda3       ext4    40G  2.7G   35G   8% /
      tmpfs           tmpfs  846M     0  846M   0% /dev/shm
      tmpfs           tmpfs  5.0M     0  5.0M   0% /run/lock
      /dev/vda2       vfat   197M  6.1M  191M   4% /boot/efi
      tmpfs           tmpfs   50M     0   50M   0% /usr/local/aegis/cgroup
      tmpfs           tmpfs  170M  4.0K  170M   1% /run/user/1000
      /dev/md0        ext4   196G   28K  186G   1% /media/raid0