Linux软件磁盘阵列(RAID)管理

admin 2022年08月31日 586次浏览

1、磁盘阵列简介

磁盘阵列(Redundant Arrays of Inexpensive Disks,RAID)可以通过软件或硬件技术,将多个较小的磁盘整合成为一个较大的磁盘设备,而这个较大的磁盘不仅具有存储功能,同时还具有数据保护的功能,整个 RAID 由于选择的级别不同,而使得整合后的磁盘具有不同的功能,常见的 RAID 级别有:

  • RAID0

    该级别称为 等量模式 RAID ,在这种模式中,至少需要2块相同容量的硬盘,该 RAID 级别的读写效果最好。该模式的 RAID 会将磁盘先切出等量的区块 (chunk,一般可设定 4K~1M 之间),然后当一个文件要写入 RAID 时,该文件会依据 chunk 的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据, 因此当数据写入 RAID 时,数据会被等量的放置在各个磁盘上面。该级别的 RAID 硬盘数量越多,性能越好,最终 RAID 的使用空间等于所有硬盘空间之和

    该级别 RAID 最大的风险在于,由于数据是被按顺序分散在每块磁盘上,所以只要有一块硬盘损坏,那么所有的数据都将会丢失

  • RAID1

    该级别称为 镜像模式 RAID ,在这种模式中,至少需要2块相同容量的硬盘,最好是一模一样的磁盘,如果是不同容量的磁盘组成 RAID1 时,那么总容量将以最小的那一块磁盘为准,在该模式下,一份数据将会被制作成两份,同时写入两块硬盘,因此,这种模式的读写性能是最差的,但是可靠性相对较高,因为数据被同时写入两块硬盘,那么即使有一块硬盘损坏也不会影响数据的完整性。该级别 RAID 最终的使用空间等于所有硬盘空间之和的二分之一

  • RAID10,RAID01

    RAID0 的性能好但是数据不安全,RAID1 的数据安全但是性能不好,因此可以将两个级别组合一下,那就是 RAID10 或 RAID01,所谓的 RAID10 就是:先让两块磁盘组成 RAID1,并且这样的设置共有两组,然后再将这两组 RAID1 组成一组 RAID0。反之,RAID01 就是先组成 RAID0 再组成 RAID1

  • RAID5(常用)

    该级别 RAID 是性能与数据备份的均衡考虑,RAID5 至少需要三块以上的磁盘组成。这种磁盘阵列的数据写入有点类似 RAID0,不过每个循环的写入过程中,还会在每块磁盘中加入一个奇偶校验数据,这个数据会记录其他磁盘的备份数据,用于当有磁盘损坏时的恢复

    由于有奇偶校验数据,因此 RAID5 的总容量会是所有磁盘数量的总和减一。而且当损坏的磁盘数量大于等于两块时,这整组 RAID5 的资料就损坏了。因为 RAID5 默认仅能支持一块磁盘的损坏

    由于 RAID 5 仅能支持一块磁盘的损坏,就有产生了 RAID6,RAID6 则使用两块磁盘的容量作为奇偶校验的储存,因此整体的磁盘容量就会少两块,但是允许出错的磁盘数量就可以达到两块了

  • Spare Disk(热备份磁盘)

    虽然在 RAID5、RAID6 中允许损坏一块或两块硬盘,但是出现硬盘损坏时,我们还得手动去将损坏的硬盘取下,然后换一块新的硬盘上去,如果我们很少去观察服务器,就会导致更多硬盘损坏最终丢失数据。

    所谓热备份盘,就是正常情况下,不包含在磁盘阵列组中,平时也不被使用,当阵列中出现故障盘时,这块热备份盘会立刻被拉入阵列中,同时将损坏的硬盘移除阵列,然后自动重组数据

2、软件磁盘阵列

2.1、软件磁盘阵列介绍

软件磁盘阵列主要是通过软件来模拟磁盘阵列的任务,因此会损耗较多的系统资源,例如 CPU 的运算与 I/O 总线的资源等

在 CentOS 中提供的软件磁盘阵列的软件是 mdadm,该软件会以分区或磁盘为单位,也就是不一定非得使用多块硬盘,而是用多个分区也是可以组建 RAID。 mdadm 同样支持 RAID0、RAID1、RAID5、spare disk 等,而且提供的管理机制还可以达到类似热拔插的功能,可以在线进行分区的抽换

软件磁盘阵列是系统模拟的,因此使用的设备文件名是系统的设备文件, 文件名为 /dev/md0、/dev/md1 等

2.2、软件磁盘阵列设置

2.2.1、语法

  • 查看磁盘阵列

    mdadm --detail /dev/mdN
    
  • 创建磁盘阵列

    mdadm --create /dev/mdN --auto=yes --level=[0|1|5] --chunk=NK --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...
    

    选项与参数

    –create :创建 RAID

    –auto=yes :决定建立后面接的软件磁盘阵列设备,如 /dev/md0、/dev/md1

    –chunk=Nk :决定这个设备的 chunk 大小,一般是 64K 或 512K

    –raid-devices=N :组建阵列的硬盘数

    –spare-devices=N :热备盘数量

    –level=[0|1|5] :磁盘阵列级别

2.2.2、使用mdadm创建RAID

  • 查看本机硬盘情况

    [root@localhost ~]# lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda               8:0    0   40G  0 disk 
    ├─sda1            8:1    0    1G  0 part /boot
    └─sda2            8:2    0   39G  0 part 
      ├─centos-root 253:0    0   37G  0 lvm  /
      └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
    sdb               8:16   0   10G  0 disk 
    sdc               8:32   0   10G  0 disk 
    sdd               8:48   0   10G  0 disk 
    sde               8:64   0   10G  0 disk 
    sr0              11:0    1 1024M  0 rom  
    
  • 创建磁盘阵列

    [root@localhost ~]# mdadm --create /dev/md0 --auto=yes --level=5 --raid-devices=3 --spare-devices=1 /dev/sd[b-e]
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    
  • 查看阵列信息

    [root@localhost ~]# mdadm --detail /dev/md0
    /dev/md0:											# RAID名称
               Version : 1.2
         Creation Time : Mon Aug 29 23:50:40 2022		# 创建时间
            Raid Level : raid5							# RAID级别
            Array Size : 20953088 (19.98 GiB 21.46 GB)	# 整个RAID的可用空间
         Used Dev Size : 10476544 (9.99 GiB 10.73 GB)	# 单块硬盘的大小
          Raid Devices : 3								# 组成RAID的硬盘数量
         Total Devices : 4								# 包括热备份盘总硬盘数量
           Persistence : Superblock is persistent
           Update Time : Mon Aug 29 23:51:32 2022
                 State : clean							# 目前RAID状态
        Active Devices : 3								# 激活的硬盘数量
       Working Devices : 4								# 目前使用此RAID的硬盘数量
        Failed Devices : 0								# 损坏的硬盘数量
         Spare Devices : 1								# 热备份盘数量
                Layout : left-symmetric
            Chunk Size : 512K							# chunk大小
    Consistency Policy : resync
                  Name : localhost.localdomain:0  (local to host localhost.localdomain)
                  UUID : a2bbc838:bb954843:2440daef:a1b65159
                Events : 18
        # -------------------- 硬盘具体分配情况 --------------------
        Number   Major   Minor   RaidDevice State
           0       8       16        0      active sync   /dev/sdb
           1       8       32        1      active sync   /dev/sdc
           4       8       48        2      active sync   /dev/sdd
           3       8       64        -      spare   /dev/sde
    

2.2.3、格式化与挂载使用RAID

RAID 的格式化与挂载和普通硬盘相同,但是,如果将 RAID 格式化成 XFS 文件系统,可以对其进行参数优化

  • xfs文件系统格式化参数优化

    [root@localhost ~]# mkfs.xfs -f -d su=512k,sw=2 -r extsize=1024k /dev/md0
    meta-data=/dev/md0               isize=512    agcount=16, agsize=327296 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=5236736, imaxpct=25
             =                       sunit=128    swidth=256 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=8 blks, lazy-count=1
    realtime =none                   extsz=1048576 blocks=0, rtextents=0
    

    参数解释

    -f -d su=512k,sw=2:由上面的 RAID 信息可知 Chunk 为 512K,那么 su 就是 512K;硬盘有3块,除去一块校验盘,可用盘为 2 块,sw 就为 2

    -r extsize=1024k:数据宽度为 Chunk 值乘以数量,那么就是 512K * 2 = 1024K

2.2.4、模拟 RAID 错误的恢复模式

  • 语法

    [root@localhost ~]# mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备] 
    选项与参数
    --add:将后面的设备加入到该 md 中
    --remove:将后面的设备从该 md 中移除
    --fail:将后面的设备设置成出错的状态
    
  • 设置磁盘为错误(fault)

    # 先往硬盘中写入点数据
    [root@localhost ~]# mkdir test_dir
    [root@localhost ~]# mount /dev/md0 test_dir/
    [root@localhost ~]# dd if=/dev/zero of=/root/test_dir/temp_file  bs=10M count=10
    [root@localhost ~]# df -lh
    文件系统               容量  已用   可用    已用%  挂载点
    /dev/md0              20G   133M   20G    1%     /root/test_dir
    
    # 将 /dev/sdc置为错误状态
    [root@localhost ~]#  mdadm --manage /dev/md0 --fail /dev/sdc
    mdadm: set /dev/sdc faulty in /dev/md0
    
    # 查看 RAID 现状
    [root@localhost ~]# mdadm --detail /dev/md0
    /dev/md0:
                 State : clean 
        Active Devices : 3
       Working Devices : 3
        Failed Devices : 1
         Spare Devices : 0
        Number   Major   Minor   RaidDevice State
           0       8       16        0      active sync   /dev/sdb
           # 已经将/dev/sdc替换掉了
           3       8       64        1      active sync   /dev/sde
           4       8       48        2      active sync   /dev/sdd
           # /dev/sdc 的状态为 faulty
           1       8       32        -      faulty   /dev/sdc
    
  • 将出错的磁盘移除并加入新磁盘

    因为我们的 /dev/sdc 并没有坏掉,所以我们可以通过下面的步骤将其重新加入

    • 先从 /dev/md0 中移除 /dev/sdc

    • 整个 Linux 系统关机,拔出/dev/sdc 这块盘,并安装上新的 /dev/sdc 这块盘,之后开机

    • 将新的 /dev/sdc 加入 /dev/md0 中

    # 从/dev/md0中移除/dev/sdc
    [root@localhost ~]#  mdadm --manage /dev/md0 --remove /dev/sdc
    mdadm: hot removed /dev/sdc from /dev/md0
    
    # 将新的/dev/sdc加入/dev/md0中
    [root@localhost ~]#  mdadm --manage /dev/md0 --add /dev/sdc
    mdadm: added /dev/sdc
    
    # 查看RAID状态
    [root@localhost ~]# mdadm --detail /dev/md0
    /dev/md0:
                 State : clean 
        Active Devices : 3
       Working Devices : 4
        Failed Devices : 0
         Spare Devices : 1
        Number   Major   Minor   RaidDevice State
           0       8       16        0      active sync   /dev/sdb
           3       8       64        1      active sync   /dev/sde
           4       8       48        2      active sync   /dev/sdd
           # /dev/sdc已经重新加入,成了热备份盘
           5       8       32        -      spare   /dev/sdc
    

2.2.4、开机自动启动RAID并自动挂载

通常情况下,软件磁盘阵列默认会被自动挂载,但是为了安全起见,我们可以自己通过配置文件来实现自动挂载

  • 查看 RAID 的 UUID

    [root@localhost ~]# mdadm --detail /dev/md0 | grep -i uuid
                  UUID : a2bbc838:bb954843:2440daef:a1b65159
    
  • 修改配置文件

    [root@localhost ~]# vi /etc/mdadm.conf
    ARRAY /dev/md0 UUID=a2bbc838:bb954843:2440daef:a1b65159
    
  • 查看挂载信息

    [root@localhost ~]#  blkid /dev/md0
    /dev/md0: UUID="5cb87416-0e6b-4d9d-9fd4-de225d6c06a9" TYPE="xfs"
    
  • 在/etc/fatab中添加挂载信息

    [root@localhost ~]# vim /etc/fstab
    UUID=5cb87416-0e6b-4d9d-9fd4-de225d6c06a9 /data xfs defaults 0 0
    

2.2.5、关闭软件RAID

  • 将 /dev/md0 从挂载点卸载

  • 在 /etc/fstab 中注释或删除挂载信息

  • 先覆盖掉 RAID 的 metadata 以及 XFS 的 superblock,然后才关闭 /dev/md0

    [root@localhost ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
    [root@localhost ~]# mdadm --stop /dev/md0
    mdadm: stopped /dev/md0
    [root@localhost ~]# dd if=/dev/zero of=/dev/sdb bs=1M count=10
    [root@localhost ~]# dd if=/dev/zero of=/dev/sdc bs=1M count=10
    [root@localhost ~]# dd if=/dev/zero of=/dev/sdd bs=1M count=10
    [root@localhost ~]# dd if=/dev/zero of=/dev/sde bs=1M count=10
    

    因为 RAID 的相关数据会存一份在磁盘当中,因此,如果只是将配置文件移除,同时关闭了 RAID,但是分区并没有重新规划过,那么重新启动过后,系统还是会将这个磁盘阵列建立起来,只是名称可能会变成 /dev/md127 就是了,因此,移除掉 Software RAID 时,需要执行上的 dd 命令 【切记:操作 dd 前一定要确认硬盘,不要把硬盘操作错了】