软 RAID 详解

这篇文章聊聊软RAID

RAID & 软 RAID

RAID

随着数据日益增长,单块硬盘往往因为容量小而不能满足大部分人的需求,于是RAID就应运而生。RAIDRedundant Array of Independent Disks)即独立磁盘冗余阵列,简称磁盘阵列。简单地说,RAID是由多个独立的高性能磁盘驱动器组成的磁盘组,从而提供比单个磁盘更高的存储性能和数据冗余的技术。

Tips:JBOD

这里要提一下JBODJust a Bunch of Disks)。JBOD将多个物理磁盘串联起来,提供一个巨大的逻辑磁盘。JBOD的数据存放机制是由第一块磁盘开始按顺序往后存储,当前磁盘存储空间用完后,再依次往后面的磁盘存储数据。JBOD存储性能完全等同于单块磁盘,而且也不提供数据冗余。它只是简单提供一种扩展存储空间的机制,JBOD可用存储容量等于所有成员磁盘的存储空间之和,即拥有容量叠加的作用。目前JBOD常指磁盘柜,而不论其是否提供RAID功能。

关键技术

RAID中主要有三个关键概念和技术:镜像(Mirroring)、数据条带(Data Stripping)和数据校验(Data parity)。

  • 镜像,将数据复制到多个磁盘,一方面可以提高可靠性,另一方面可并发从两个或多个副本读取数据来提高读性能。显而易见,镜像的写性能要稍低,确保数据正确地写到多个磁盘需要更多的时间消耗。
  • 数据条带,将数据分片保存在多个不同的磁盘,多个数据分片共同组成一个完整数据副本,这与镜像的多个副本是不同的,它通常用于性能考虑。数据条带具有更高的并发粒度,当访问数据时,可以同时对位于不同磁盘上数据进行读写操作,从而获得非常可观的I/O性能提升。
  • 数据校验,利用冗余数据进行数据错误检测和修复,冗余数据通常采用海明码、异或操作等算法来计算获得。利用校验功能,可以很大程度上提高磁盘阵列的可靠性、鲁棒性和容错能力。不过,数据校验需要从多处读取数据并进行计算和对比,会影响系统性能。

不同等级的RAID采用一个或多个以上的三种技术,来获得不同的数据可靠性、可用性和I/O性能。至于采用何种模式的RAID,需要在深入理解系统需求的前提下进行合理选择,综合评估可靠性、性能和成本来进行折中的选择。

优势

随着处理器、内存、计算机接口等技术的不断发展,RAID不断地发展和革新,在计算机存储领域得到了广泛的应用,从高端系统逐渐延伸到普通的中低端系统。RAID技术如此流行,源于其具有显著的特征和优势,基本可以满足大部分的数据存储需求。总体说来,RAID主要优势有如下几点

  1. 大容量RAID扩大了磁盘的容量,由多个磁盘组成的RAID系统具有海量的存储空间。现在单个磁盘的容量就可以到10TB以上,这样RAID的存储容量就可以达到PB级,大多数的存储需求都可以满足。一般来说,RAID可用容量要小于所有成员磁盘的总容量。不同等级的RAID算法需要一定的冗余开销,具体容量开销与采用算法相关。如果已知RAID算法和容量,可以计算出RAID的可用容量。通常,RAID容量利用率在50% ~ 90%之间。
  2. 高性能RAID的高性能受益于数据条带化技术。单个磁盘的I/O性能受到接口、带宽等计算机技术的限制,性能往往很有 限,容易成为系统性能的瓶颈。通过数据条带化,RAID将数据I/O分散到各个成员磁盘上,从而获得比单个磁盘成倍增长的聚合I/O性能。
  3. 可靠性,可用性和可靠性是RAID的另一个重要特征。从理论上讲,由多个磁盘组成的RAID系统在可靠性方面应该比单个磁盘要差。这里有个隐含假定:单个磁盘故障将导致整个RAID不可用。RAID采用镜像和数据校验等数据冗余技术,打破了这个假定。镜像是最为原始的冗余技术,把某组磁盘驱动器上的数据完全复制到另一组磁盘驱动器上,保证总有数据副本可用。 比起镜像50%的冗余开销,数据校验要小很多,它利用校验冗余信息对数据进行校验和纠错。RAID冗余技术大幅提升数据可用性和可靠性,保证了若干磁盘出错时,不会导致数据的丢失,不影响系统的连续运行。
  4. 可管理性,实际上,RAID是一种虚拟化技术,它对多个物理磁盘驱动器虚拟成一个大容量的逻辑驱动器。对于外部主机系统来说,RAID是一个单一的、快速可靠的大容量磁盘驱动器。这样,用户就可以在这个虚拟驱动器上来组织和存储应用系统数据。从用户应用角度看,可使存储系统简单易用,管理也很便利。由于RAID内部完成了大量的存储管理工作,管理员只需要管理单个虚拟驱动器,可以节省大量的管理工作。RAID可以动态增减磁盘驱动器,可自动进行数据校验和数据重建,这些都可以大大简化管理工作。

由于本篇文章主要讲解的是软RAID,所以就不展开赘述,对RAID想要深入了解或对RAID各种模式感兴趣的,可以阅读以下链接:

  • RAID 有哪几种?有什么区别?
  • RAID 技术详解
  • RAID 及 mdadm 命令

软 RAID

RAID分为软件RAID和硬件RAID

硬 RAID

硬件磁盘阵列(hardwareRAID)是通过磁盘阵列卡RAID卡)来创建磁盘阵列的。在RAID卡上会有一个专门的芯片来处理RAID任务,可以大大减轻原来系统的计算压力和I/O压力,效率也会得到很好的提升;同时现在大部分的RAID卡都支持热拔插,所以在更换损坏磁盘时是非常方便的。但是不好的一点是RAID比较贵,特别是那些好一点的RAID卡就会特别贵,而且功能还不能保证特别齐全,所以在这种情况下就出现了软件RAID,来模拟硬件RAID

软 RAID

软件RAID是一种模拟硬件RAID的产物,运行在操作系统上面,所有任务的处理都由CPU来完成,所以需要占用一定的系统资源,特别是计算和I/O资源,所以性能不如硬RAID,但软RAID实现简单,不需要额外的硬件设备。。虽然说现在的机器计算速度都非常快了,但是对于一些要求较高的场景或企业,一般最好还是尽量不要选择软件RAID的,毕竟在总的使用成本上来说硬件RAID性价比还是蛮高的(硬RAID通过RAID卡解决了很多管理问题,大大地降低了后期运维成本)。

硬软 RAID 优劣比较

RAID优势:

  • 性能,所有RAID操作都由RAID控制芯片完成,不占用任何CPU和内存资源,而且RAID卡上一般还有额外的cache进一步提升性能,同时拥有独立的电池对缓存进行供电保护,系统重启/电源恢复的时候可以把缓存中未写入硬盘的数据写入硬盘。
  • 功能强大,硬RAID可以支持所有与RAID相关的功能和所有RAID级别,而软RAID只能支持几种基础的RAID级别,并且不具有硬RAID的许多高级功能,比如点灯、缓存、热插拔等等。
  • 兼容性,硬RAID独立于系统,例如windows/linux都可以用,本身拥有CPU、内存、电池等。软RAID依赖于操作系统,如果操作系统出问题,软RAID就挂了。硬RAID的兼容性要好很多,万一系统出了问题,也可以很方便地做系统维护和数据恢复。

RAID优势:

  • 免费!
  • 免费!
  • 免费!

重要的事情说三遍,软RAID最大的优势就是便宜!!!

总的来说,硬RAID功能上是完爆软RAID的,但是硬RAID比较昂贵,一般的RAID都需要几千元。企业级的核心应用推荐采用硬RAID的方案,花钱解决一切烦恼。而一些不是特别核心的应用或者个人推荐采用软RAID,软RAID目前大部分操作系统都支持,并且对基础的RAID的功能支持的也不错,能够满足大部分需求,最关键的还是不要钱!!!

mdadm

mdadmLinux操作系统上开源的软RAID用户层管理工具,允许用户创建和管理软RAID磁盘阵列。

目前,mdadm支持大部分常见的阵列类型,如JBODRAID0RAID1RAID4RAID5RAID6MULTIPATHRAID10等,创建和管理RAID也十分的方便,同时,mdadm使用非常灵活,磁盘或者分区都可以作为RAID的成员盘来创建软RAID。主要有7种使用模式:

模式名字 主要功能
Create 使用空闲的设备创建一个新的阵列,每个设备具有元数据块
Assemble 将原来属于一个阵列的每个块设备组装为阵列
Build 创建或组装不需要元数据的阵列,每个设备没有元数据块
Manage 管理已经存储阵列中的设备,比如增加热备磁盘或者设置某个磁盘失效,然后从阵列中删除这个磁盘
Misc 报告或者修改阵列中相关设备的信息,比如查询阵列或者设备的状态信息
Grow 改变阵列中每个设备被使用的容量或阵列中的设备的数目
Monitor 监控一个或多个阵列,上报指定的事件

创建阵列

mdadm使用--create(或其缩写-C)参数来创建新的阵列,并且将一些重要阵列的标识信息作为元数据可以写在每一个底层设备的指定区间。--level(或者其缩写-l)表示阵列的RAID级别,--chunk(或者其缩写-c)表示每个条带单元的大小,以KB为单位,默认为64KB,条带单元的大小配置对不同负载下的阵列读写性能有很大影响。--raid-devices(或者其缩写-n)表示阵列中活跃的设备个数,而--spare-devices(或者其缩写-x)表示阵列中热备盘的个数,一旦阵列中的某个磁盘失效,MD内核驱动程序自动用将热备磁盘加入到阵列,然后重构丢失磁盘上的数据到热备磁盘上。

创建RAID0:
mdadm --create /dev/md0 --level=0 --chunk=32 --raid-devices=3 /dev/sd[i-k]1
创建RAID1:
mdadm -C /dev/md0 -l1 -c128 -n2 -x1 /dev/sd[i-k]1
创建RAID5:
mdadm -C /dev/md0 -l5 -n5 /dev/sd[c-g] -x1 /dev/sdb 
创建RAID6:
mdadm -C /dev/md0 -l6 -n5 /dev/sd[c-g] -x2 /dev/sdb /dev/sdh
创建RAID10:
mdadm -C /dev/md0 -l10 -n6 /dev/sd[b-g] -x1 /dev/sdh

如果一个块设备元数据中含有其他旧阵列信息,这时候会需要交互式命令确认yes/no,如果想自动化,通过管道符的方式即可:

采用missing作为其中一个设备,相当于创建单盘raid1
yes|mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing

Build模式可以用来创建没有元数据(即没有superblock)的RAID0/1设备,不能创建RAID4/5/6/10等设备。由于不存在元数据块,很多区分和检查工作无法进行,需要对使用设备特别清楚,这种模式不常用,常用的还是Create模式,毕竟元数据块还是拥有很大的作用。

[root@test ~]# ./mdadm -BR /dev/md0 -l0 -n6 /dev/sd[b-g]
mdadm: array /dev/md0 built and started. 
[root@test ~]# ./mdadm -BR /dev/md0 -l1 -n2 /dev/sd[b-c]
mdadm: array /dev/md0 built and started.
[root@test ~]# ./mdadm -BR /dev/md0 -l5 -n6 /dev/sd[b-g]
mdadm: Raid level 5 not permitted with --build.
[root@test ~]# ./mdadm -BR /dev/md0 –l6 -n6 /dev/sd[b-g]
mdadm: Raid level 5 not permitted with --build.
[root@test ~]# ./mdadm -BR /dev/md0 –l10 -n6 /dev/sd[b-g]
mdadm: Raid level 10 not permitted with --build.

查询阵列

通过命令查询阵列信息

通过mdadm命令查看指定阵列的简要信息(使用--query或者其缩写-Q)和详细信息(使用--detail或者其缩写-D) 详细信息包括RAID的版本、创建的时间、RAID级别、阵列容量、可用空间、设备数量、超级块状态、更新时间、UUID信息、各个设备的状态、RAID算法级别类型和布局方式以及块大小等信息。设备状态信息分为activesyncsparefaultyrebuildingremoving等等。

查询简要信息
[root@test ~]# mdadm --query /dev/md0
/dev/md0: 2.100GiB raid10 6 devices, 1 spare. Use mdadm --detail for more detail.
查询详细信息
[root@test ~]# ./mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 17:49:53 2018
     Raid Level : raid10
     Array Size : 3145536 (3.00 GiB 3.22 GB)
  Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
   Raid Devices : 6
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
 
    Update Time : Sun Aug 22 21:55:02 1999
          State : clean
 Active Devices : 6
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 1
 
         Layout : near=2, far=1
     Chunk Size : 64K
 
           UUID : 0cabc5e5:842d4baa:e3f6261b:a17a477a
         Events : 0.122
 
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
 
       6       8      112        -      spare   /dev/sdh

通过命令查询阵列中设备信息

上面是查询阵列里面的详细信息,我们也可以查询阵列中具体设备的详细信息,使用命令--examine(或者其缩写-E)来检测当前的块设备上是否有阵列的元数据信息,包括设备RAID级别,设备UUID,阵列UUID等等。

[root@test ~]# mdadm -E /dev/sdb1
/dev/sdb1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
     Array UUID : df3ceb66:95a8c503:9c6c41b2:db583c57
           Name : host244:root
  Creation Time : Wed Apr 17 18:33:11 2019
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 167772160 (80.00 GiB 85.90 GB)
     Array Size : 83886080 (80.00 GiB 85.90 GB)
    Data Offset : 131072 sectors
   Super Offset : 8 sectors
   Unused Space : before=130992 sectors, after=0 sectors
          State : clean
    Device UUID : 8054a66a:962c52e8:be0c8425:db207be4

Internal Bitmap : 8 sectors from superblock
    Update Time : Sat May  4 16:13:56 2019
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : 6af807c8 - correct
         Events : 207


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

通过文件查询阵列信息

我们还可以通过cat /proc/mdstat查看所有运行的RAID阵列的状态,在第一行中首先是MD的设备名,activeinactive选项表示阵列是否能读写,接着是阵列的RAID级别,后面是属于阵列的块设备,方括号[]里的数字表示设备在阵列中的序号,(S)表示其是热备盘,(F)表示这个磁盘是faulty状态。在第二行中首先是阵列的大小,单位是KB,接着是chunk-size的大小,然后是layout类型,不同RAID级别的layout类型不同,[6/6][UUUUUU]表示阵列有6个磁盘并且6个磁盘都是正常运行的,而[5/6][_UUUUU]表示阵列有6个磁盘中5个都是正常运行的,下划线对应的那个位置的磁盘是faulty状态的。

[root@test ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
 
unused devices: 
[root@test ~]# mdadm /dev/md0 -f /dev/sdh /dev/sdb
mdadm: set /dev/sdh faulty in /dev/md0
mdadm: set /dev/sdb faulty in /dev/md0
[root@test ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid10 sdh[6] sdb[7](F) sdc[0] sdg[5] sdf[4] sde[3] sdd[2]
      3145536 blocks 64K chunks 2 near-copies [6/5] [U_UUUU]
      [=======>........]  recovery = 35.6% (373888/1048512) finish=0.1min speed=93472K/sec
unused devices: 

并且还会展示阵列中一些状态,比如recvoeryresync等等,并且还有详细包括进度值、速度、完成块大小等。

通过文件系统查询

Linux系统目前支持sysfs也可以访问/sys/block/md0目录查询阵列信息。

[root@test ~]# ls -l /sys/block/md0/
capability  holders  range      size    stat       uevent
dev         md       removable  slaves  subsystem
[root@test ~]# ls /sys/block/md0/md/
array_state      dev-sdg           rd1               suspend_lo
bitmap_set_bits  dev-sdh           rd2               sync_action
chunk_size       layout            rd3               sync_completed
component_size   level             rd4               sync_speed
dev-sdb          metadata_version  rd5               sync_speed_max
dev-sdc          mismatch_cnt      reshape_position  sync_speed_min
dev-sdd          new_dev           resync_start
dev-sde          raid_disks        safe_mode_delay
dev-sdf          rd0               suspend_hi
[root@test ~]# ls /sys/block/md0/slaves/
sdb  sdc  sdd  sde  sdf  sdg  sdh

停止 & 删除阵列

当阵列没有文件系统或者其他存储应用以及高级设备使用的话,可以使用--stop(或者其缩写-S)停止阵列;如果命令返回设备或者资源忙类型的错误,说明/dev/md0正在被上层应用使用,暂时不能停止,必须要首先停止上层的应用,这样也能保证阵列上数据的一致性。

[root@test ~]# mdadm --stop /dev/md0
mdadm: fail to stop array /dev/md0: Device or resource busy
[root@test ~]# umount /dev/md0
[root@test ~]# mdadm --stop /dev/md0 
mdadm: stopped /dev/md0

上面只是停止阵列,阵列其中的设备还存在着阵列元数据信息,如果需要彻底删除阵列,还需要--zero-superblock将阵列中所有设备的元数据块删除。

[root@test ~]# mdadm --zero-superblock /dev/sdb

组装阵列

模式--assemble或者其缩写(-A)主要是检查底层设备的元数据信息,然后再组装为活跃的阵列。如果我们已经知道阵列由那些设备组成,可以指定使用那些设备来启动阵列。

[root@test ~]# mdadm -A /dev/md0 /dev/sd[b-h]
mdadm: /dev/md0 has been started with 6 drives and 1 spare.

可以通过配置文件/etc/mdadm.conf重新组装,mdadm先检查mdadm.conf中的DEVICE信息,然后从每个设备上读取元数据信息,并检查是否和ARRAY信息一致,如果信息一致则启动阵列。

mdadm -As /dev/md0

如果没有配置/etc/mdadm.conf文件,而且又不知道阵列由那些磁盘组成,则可以使用上面提到的查询命令--examine(或者其缩写-E)来检测当前的块设备上是否有阵列的元数据信息,找到阵列的唯一标识UUID和阵列包含的设备名字,然后再使用上面的命令来组装阵列,也可以使用UUID标识来组装阵列。没有一致的元数据的信息设备(例如/dev/sda/dev/sda1等)mdadm程序会自动跳过。

[root@test ~]# ./mdadm -Av --uuid=0cabc5e5:842d4baa:e3f6261b:a17a477a /dev/md0 /dev/sd*
mdadm: looking for devices for /dev/md0
mdadm: no recogniseable superblock on /dev/sda
mdadm: /dev/sda has wrong uuid.
mdadm: no recogniseable superblock on /dev/sda1
mdadm: /dev/sda1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdi
mdadm: /dev/sdi has wrong uuid.
mdadm: /dev/sdi1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdj
mdadm: /dev/sdj has wrong uuid.
mdadm: /dev/sdj1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdk
mdadm: /dev/sdk has wrong uuid.
mdadm: /dev/sdk1 has wrong uuid.
mdadm: /dev/sdb is identified as a member of /dev/md0, slot 0.
mdadm: /dev/sdc is identified as a member of /dev/md0, slot 1.
mdadm: /dev/sdd is identified as a member of /dev/md0, slot 2.
mdadm: /dev/sde is identified as a member of /dev/md0, slot 3.
mdadm: /dev/sdf is identified as a member of /dev/md0, slot 4.
mdadm: /dev/sdg is identified as a member of /dev/md0, slot 5.
mdadm: /dev/sdh is identified as a member of /dev/md0, slot 6.
mdadm: added /dev/sdc to /dev/md0 as 1
mdadm: added /dev/sdd to /dev/md0 as 2
mdadm: added /dev/sde to /dev/md0 as 3
mdadm: added /dev/sdf to /dev/md0 as 4
mdadm: added /dev/sdg to /dev/md0 as 5
mdadm: added /dev/sdh to /dev/md0 as 6
mdadm: added /dev/sdb to /dev/md0 as 0
mdadm: /dev/md0 has been started with 6 drives and 1 spare.

配置文件:

/etc/mdadm.conf作为默认的配置文件,主要作用是方便跟踪软RAID的配置,尤其是可以配置监视和事件上报选项。Assemble命令也可以使用--config(或者其缩写-c)来指定配置文件。我们通常可以如下命令来建立配置文件。

[root@test ~]# mdadm -Ds > /etc/mdadm.conf
[root@test ~]# cat /etc/mdadm.conf
# mdadm.conf written out by anaconda
MAILADDR root
AUTO +imsm +1.x -all
ARRAY /dev/md/1 level=raid1 num-devices=2 UUID=fe796549:cdbe506c:51e5404e:fa40fee6
ARRAY /dev/md/2 level=raid1 num-devices=2 UUID=60cecdc1:f115d9e5:f9ddfb52:c3c035ab
ARRAY /dev/md/3 level=raid1 num-devices=2 UUID=df3ceb66:95a8c503:9c6c41b2:db583c57
ARRAY /dev/md/4 level=raid0 num-devices=2 UUID=7c5f42c1:9b013ec0:b17b7337:33df22ca
ARRAY /dev/md/5 level=raid1 num-devices=2 UUID=4cbb3226:c5acf9e3:fb156e23:9aa56a48

使用配置文件启动阵列时,mdadm会查询配置文件中的设备和阵列内容,然后启动运行所有能运行RAID阵列。如果指定阵列的设备名字,则只启动对应的阵列。

[root@test ~]# mdadm -As
mdadm: /dev/md1 has been started with 3 drives.
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10]
md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
 
md1 : active raid0 sdi1[0] sdk1[2] sdj1[1]
      7337664 blocks 32k chunks
 
unused devices: 
[root@test ~]# mdadm -S /dev/md0 /dev/md1
mdadm: stopped /dev/md0
mdadm: stopped /dev/md1
[root@test ~]# mdadm -As /dev/md0
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10]
md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
 
unused devices: 

注意:
这个配置文件不是随着阵列信息随时变化的,而是可以手动修改的。所以根据配置文件组装未必百分百成功,因为之前可能阵列被手动修改过,所以建议在每一次改变阵列信息后,最好同步一下当前的阵列信息到配置文件中。

[root@test ~]# mdadm -Ds > /etc/mdadm.conf

管理阵列

mdadm可以在Manage模式下,对运行中的阵列进行添加及删除磁盘。常用于标识failed磁盘,增加spare(热备)磁盘,以及从阵列中移走已经失效的磁盘等等。 使用--fail(或者其缩写-f)指定磁盘损坏。

[root@test ~]# mdadm /dev/md0 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0

当磁盘已经损坏时,使用--remove(或者其缩写-f)参数将这个磁盘从磁盘阵列中移走;但如果设备还正在被阵列使用(即不处于失效状态),则不能从阵列中移走。

[root@test ~]# mdadm /dev/md0 --remove /dev/sdb
mdadm: hot removed /dev/sdb
[root@test ~]# mdadm /dev/md0 --remove /dev/sde
mdadm: hot remove failed for /dev/sde: Device or resource busy

如果阵列带有spare磁盘,那么自动将损坏磁盘上的数据重构到新的spare磁盘上

[root@test ~]# mdadm -f /dev/md0 /dev/sdb ; cat /proc/mdstat
mdadm: set /dev/sdb faulty in /dev/md0
Personalities : [raid0] [raid10]
md0 : active raid10 sdh[6] sdb[7](F) sdc[0] sdg[5] sdf[4] sde[3] sdd[2]
      3145536 blocks 64K chunks 2 near-copies [6/5] [U_UUUU]
      [=======>........]  recovery = 35.6% (373888/1048512) finish=0.1min speed=93472K/sec
 
unused devices: 

还可以使用--add(或者其缩写-a)参数增加磁盘:

[root@test ~]# mdadm /dev/md0 --add /dev/sdh
mdadm: added /dev/sdh

扩展阵列

如果在创建阵列时不想使用整个块设备,可以指定用于创建RAID阵列每个块设备使用的设备大小。

[root@test ~]# mdadm -CR /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --size=102400

然后在阵列需要扩展大小时,使用模式--grow(或者其缩写-G)以及--size参数(或者其缩写-z)再加上合适的大小数值就能分别扩展阵列所使用每个块设备的大小。

[root@test ~]# mdadm -Q /dev/md0
/dev/md0: 500.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail. 
[root@test ~]# mdadm --grow /dev/md0 --size=204800
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      1024000 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
      [============>......]  resync = 69.6% (144188/204800) finish=0.0min speed=10447K/sec
 
unused devices: 
[root@test ~]# mdadm -Q /dev/md0
/dev/md0: 1000.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail.

如果上面是文件系统,在设备大小扩展后,文件系统也要同时扩展。

mdadm还提供增加或减少阵列中设备个数的功能(reshape),使用模式—grow--raid-disks(或者其缩写-n)参数再加上合适的设备个数。扩展后阵列中原来的热备盘变为活跃磁盘,所以阵列的设备个数增加,阵列的大小也相应增加。

[root@test ~]# ./mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 22:16:19 1999
     Raid Level : raid5
     Array Size : 1024000 (1000.17 MiB 1048.58 MB)
  Used Dev Size : 204800 (200.03 MiB 209.72 MB)
   Raid Devices : 6
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
 
    Update Time : Sun Aug 22 22:23:46 1999
          State : clean
 Active Devices : 6
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 1
 
         Layout : left-symmetric
     Chunk Size : 64K
 
           UUID : 53e6395c:1af16258:087cb2a0:b66b087f
         Events : 0.12
 
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
 
       6       8      112        -      spare   /dev/sdh
[root@test ~]# ./mdadm --grow /dev/md0 --raid-disks=7
mdadm: Need to backup 1920K of critical section..
mdadm: ... critical section passed.
[root@test ~]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      1024000 blocks super 0.91 level 5, 64k chunk, algorithm 2 [7/7] [UUUUUUU]
      [===>.............]  reshape = 19.4% (40256/204800) finish=0.7min speed=3659K/sec
 
unused devices: 

监控阵列

mdadm还可以对RAID阵列进行监控,监控程序定时查询指定的事件是否发生,然后根据配置来妥善处理。例如当阵列中的磁盘设备出现问题的时候,可以发送邮件给管理员;或者当磁盘出现问题的时候由回调程序来进行自动的磁盘替换,所有监控事件都可以记录到系统日志中。目前mdadm支持的事件有:

  • RebuildStarted
  • RebuildNN(NN is 20, 40, 60, or 80)
  • RebuildFinished
  • Fail
  • FailSpare
  • SpareActive
  • NewArray
  • DegradedArray
  • MoveSpare
  • SparesMissing
  • TestMessage

如果配置每300mdadm监控进程查询MD设备一次,当阵列出现错误,会发送邮件给指定的用户,执行事件处理的程序并且记录上报的事件到系统的日志文件。使用--daemonise参数(或者其缩写-f)使程序持续在后台运行。如果要发送邮件需要sendmail程序运行,当邮件地址被配置为外网地址应先测试是否能发送出去。

[root@test ~]# mdadm --monitor --mail=root@localhost --program=/root/md.sh --syslog --delay=300 /dev/md0 --daemonise

查看系统日志信息,可以看到哪个阵列或者阵列中的哪个设备发生过的哪些事件。

[root@test ~]# mdadm -f /dev/md0 /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@test ~]# tail –f /var/log/messages
Aug 22 22:04:12 fc5 mdadm: RebuildStarted event detected on md device /dev/md0
Aug 22 22:04:12 fc5 kernel: md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery.
Aug 22 22:04:12 fc5 kernel: md: using 128k window, over a total of 1048512 blocks.
Aug 22 22:04:14 fc5 mdadm: Fail event detected on md device /dev/md0, component device /dev/sdb
Aug 22 22:04:14 fc5 mdadm: Rebuild80 event detected on md device /dev/md0
Aug 22 22:04:16 fc5 mdadm: RebuildFinished event detected on md device /dev/md0
Aug 22 22:04:16 fc5 mdadm: SpareActive event detected on md device /dev/md0, component device /dev/sdh
Aug 22 22:04:16 fc5 kernel: md: md0: recovery done.

回调程序从mdadm程序接受两个或者三个参数:事件名字,监控阵列的名字和特殊事件可能使用到的底层块设备名字。上面的事件返回的信息如下:

Eventname: RebuildStarted  Device: /dev/md0  next:
Eventname: Fail  Device: /dev/md0  next: /dev/sdb
Eventname: Rebuild80  Device: /dev/md0  next:
Eventname: RebuildFinished  Device: /dev/md0  next:
Eventname:SpareActive  Device: /dev/md0  next: /dev/sdh

总结

本文讲述了RAID的特点和优势,然后引入硬RAID和软RAID,并分析这两者的优劣势;最后着重对软RAID的创建,删除,停止和扩展等操作进行了介绍和实践。

Refer

  1. RAID 有哪几种?有什么区别?
  2. RAID 技术详解
  3. 磁盘阵列(RAID)的原理与搭建
  4. Linux 中软件 RAID 的使用
  5. RAID 及 mdadm 命令
  6. RAID 方案总结
  7. 软件磁盘阵列(Software RAID)介绍
  8. 软 RAID 和硬 RAID 各有什么优劣?
  9. 硬RAID、软RAID的区别详解
  10. 三种 Linux RAID 简要说明
  11. XenServer 6.2 with Software RAID
  12. How to fix linux mdadm inactive array
  13. 针对mdadm的RAID1失效测试
  14. mdadm wiki

你可能感兴趣的:(raid)