在 Linux 上配置软件 RAID

在 Azure 中的 Linux 虚拟机上使用软件 RAID 将多个附加的数据磁盘作为单个 RAID 设备呈现,这是一种常见方案。 通常,这可以用于提高性能,并在与仅使用单个磁盘相比能提高吞吐量。

添加数据磁盘

配置 RAID 设备需要两个或多个空数据磁盘。 创建 RAID 设备的主要原因是提高磁盘 IO 的性能。 根据您的 IO 需求,可以选择附加存储在标准存储中的磁盘,每个磁盘最多支持 500 IO/ps,或者选择高性能存储,每个磁盘最多支持 5000 IO/ps。 本文不详细介绍如何预配数据磁盘并将其附加到 Linux 虚拟机。 有关如何将空数据磁盘附加到 Azure 上的 Linux 虚拟机的详细说明,请参阅 Microsoft Azure 文章 附加磁盘

重要

不要混合不同大小的磁盘,这样做会导致 raidset 的性能限制为最慢的磁盘。

安装 mdadm 实用工具

  • Ubuntu

    sudo apt-get update
    sudo apt-get install mdadm
    
  • CentOS & Oracle Linux

    sudo yum install mdadm
    
  • SLES 和 openSUSE

    zypper install mdadm
    

创建磁盘分区

在此示例中,我们在 /dev/sdc 上创建单个磁盘分区。 新的磁盘分区将称为 /dev/sdc1。

  1. 使用 fdisk 开始创建分区

    sudo fdisk /dev/sdc
    Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
    Building a new DOS disklabel with disk identifier 0xa34cb70c.
    Changes will remain in memory only, until you decide to write them.
    After that, of course, the previous content won't be recoverable.
    
    WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
                    switch off the mode (command 'c') and change display units to
                    sectors (command 'u').
    
  2. 在提示符下按“n”创建 new 分区:

    Command (m for help): n
    
  3. 接下来,按“p”创建 p边缘分区:

    Command action
            e   extended
            p   primary partition (1-4)
    
  4. 按“1”选择分区号 1:

    Partition number (1-4): 1
    
  5. 选择新分区的起点,或按 <enter> 接受默认设置,将分区放置在驱动器上可用空间的开头:

    First cylinder (1-1305, default 1):
    Using default value 1
    
  6. 选择分区的大小,例如,键入“+10G”以创建 10 GB 的分区。 或者,按 <enter> 创建跨整个驱动器的单个分区:

    Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): 
    Using default value 1305
    
  7. 接下来,将分区的 ID 和 type 从默认 ID“83”(Linux)更改为 ID“fd”(Linux raid auto):

    Command (m for help): t
    Selected partition 1
    Hex code (type L to list codes): fd
    
  8. 最后,将分区表写入驱动器并退出 fdisk:

    Command (m for help): w
    The partition table has been altered!
    

创建 RAID 阵列

  1. 以下示例将采用 RAID 级别 0 对三个单独数据磁盘(sdc1、sdd1、sde1)上的三个分区进行分条处理。 运行此命令后,将创建名为 /dev/md127 的新 RAID 设备。 另请注意,如果这些数据磁盘之前是另一个已失效 RAID 阵列的一部分,则可能需要将 --force 参数添加到 mdadm 命令:

    sudo mdadm --create /dev/md127 --level 0 --raid-devices 3 \
        /dev/sdc1 /dev/sdd1 /dev/sde1
    
  2. 在新 RAID 设备上创建文件系统

    CentOS、Oracle Linux、SLES 12、openSUSE 和 Ubuntu

    sudo mkfs -t ext4 /dev/md127
    

    SLES 11

    sudo mkfs -t ext3 /dev/md127
    

    SLES 11 - 启用 boot.md 并创建 mdadm.conf

    sudo -i chkconfig --add boot.md
    sudo echo 'DEVICE /dev/sd*[0-9]' >> /etc/mdadm.conf
    

    注释

    在 SUSE 系统上进行这些更改后,可能需要重新启动。 此步骤 SLES 12 上不需要

将新文件系统添加到 /etc/fstab

重要

错误地编辑 /etc/fstab 文件可能会导致系统无法启动。 如果没有把握,请参考分发的文档来获取有关如何正确编辑该文件的信息。 另外,建议在编辑前备份 /etc/fstab 文件。

  1. 为新文件系统创建所需的装入点,例如:

    sudo mkdir /data
    
  2. 编辑 /etc/fstab 时,应使用 UUID 来引用文件系统而不是设备名称。 使用 blkid 实用工具确定新文件系统的 UUID:

    sudo /sbin/blkid
    ...........
    /dev/md127: UUID="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" TYPE="ext4"
    
  3. 在文本编辑器中打开 /etc/fstab 并添加新文件系统的条目,例如:

    UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee  /data  ext4  defaults  0  2
    

    SLES 11

    /dev/disk/by-uuid/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee  /data  ext3  defaults  0  2
    

    然后,保存并关闭 /etc/fstab。

  4. 测试 /etc/fstab 条目是否正确:

    sudo mount -a
    

    如果此命令导致错误消息,请检查 /etc/fstab 文件中的语法。

    接下来运行 mount 命令,以确保装载文件系统:

    mount
    .................
    /dev/md127 on /data type ext4 (rw)
    
  5. (可选)故障启动参数

    fstab 配置

    许多分发版包括可添加到 /etc/fstab 文件的 nobootwaitnofail 装载参数。 这些参数允许在装载特定文件系统时发生故障,并允许 Linux 系统继续启动,即使无法正确装载 RAID 文件系统也是如此。 有关这些参数的详细信息,请参阅分发的文档。

    示例(Ubuntu):

    UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee  /data  ext4  defaults,nobootwait  0  2
    

    Linux 启动参数

    除了上述参数,内核参数“bootdegraded=true”还可以允许系统启动,即使 RAID 被视为损坏或降级,例如,如果意外从虚拟机中删除了数据驱动器。 默认情况下,这还可能导致不可启动的系统。

    请参阅分发的文档,了解如何正确编辑内核参数。 例如,在许多分发版(CentOS、Oracle Linux、SLES 11)中,这些参数可以手动添加到“/boot/grub/menu.lst”文件中。 在 Ubuntu 上,可以将此参数添加到“/etc/default/grub”上的 GRUB_CMDLINE_LINUX_DEFAULT 变量。

TRIM/UNMAP 支持

某些 Linux 内核支持 TRIM/UNMAP 操作以放弃磁盘上未使用的块。 这些作主要用于标准存储,以通知 Azure 已删除的页面不再有效,并且可以丢弃。 如果创建大型文件,则放弃页面可以节省成本,然后删除它们。

注释

如果数组的区块大小设置为小于默认值(512KB),RAID 可能不会发出放弃命令。 这是因为主机上的未映射粒度也是 512KB。 如果通过 mdadm 的 --chunk= 参数修改了数组的区块大小,内核可能会忽略 TRIM/unmap 请求。

在 Linux VM 中有两种方法可以启用 TRIM 支持。 与往常一样,请参考您的发行版以获得推荐的方法。

  • /etc/fstab 中使用 discard 作为装载选项,例如:

    UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee  /data  ext4  defaults,discard  0  2
    
  • 在某些情况下,discard 选项可能会影响性能。 此处,还可以从命令行手动运行 fstrim 命令,或将其添加到 crontab 以定期运行:

    Ubuntu

    # sudo apt-get install util-linux
    # sudo fstrim /data
    

    RHEL/CentOS

    # sudo yum install util-linux
    # sudo fstrim /data