@tony-yin
        
        2019-05-04T16:37:49.000000Z
        字数 16317
        阅读 1829
    Linux RAID

随着数据日益增长,单块硬盘往往因为容量小而不能满足大部分人的需求,于是RAID就应运而生。RAID( Redundant Array of Independent Disks)即独立磁盘冗余阵列,简称磁盘阵列。简单地说,RAID是由多个独立的高性能磁盘驱动器组成的磁盘组,从而提供比单个磁盘更高的存储性能和数据冗余的技术。
这里要提一下JBOD(Just 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主要优势有如下几点
RAID扩大了磁盘的容量,由多个磁盘组成的RAID系统具有海量的存储空间。现在单个磁盘的容量就可以到10TB以上,这样RAID的存储容量就可以达到PB级,大多数的存储需求都可以满足。一般来说,RAID可用容量要小于所有成员磁盘的总容量。不同等级的RAID算法需要一定的冗余开销,具体容量开销与采用算法相关。如果已知RAID算法和容量,可以计算出RAID的可用容量。通常,RAID容量利用率在50% ~ 90%之间。RAID的高性能受益于数据条带化技术。单个磁盘的I/O性能受到接口、带宽等计算机技术的限制,性能往往很有 限,容易成为系统性能的瓶颈。通过数据条带化,RAID将数据I/O分散到各个成员磁盘上,从而获得比单个磁盘成倍增长的聚合I/O性能。RAID的另一个重要特征。从理论上讲,由多个磁盘组成的RAID系统在可靠性方面应该比单个磁盘要差。这里有个隐含假定:单个磁盘故障将导致整个RAID不可用。RAID采用镜像和数据校验等数据冗余技术,打破了这个假定。镜像是最为原始的冗余技术,把某组磁盘驱动器上的数据完全复制到另一组磁盘驱动器上,保证总有数据副本可用。 比起镜像50%的冗余开销,数据校验要小很多,它利用校验冗余信息对数据进行校验和纠错。RAID冗余技术大幅提升数据可用性和可靠性,保证了若干磁盘出错时,不会导致数据的丢失,不影响系统的连续运行。RAID是一种虚拟化技术,它对多个物理磁盘驱动器虚拟成一个大容量的逻辑驱动器。对于外部主机系统来说,RAID是一个单一的、快速可靠的大容量磁盘驱动器。这样,用户就可以在这个虚拟驱动器上来组织和存储应用系统数据。从用户应用角度看,可使存储系统简单易用,管理也很便利。由于RAID内部完成了大量的存储管理工作,管理员只需要管理单个虚拟驱动器,可以节省大量的管理工作。RAID可以动态增减磁盘驱动器,可自动进行数据校验和数据重建,这些都可以大大简化管理工作。
由于本篇文章主要讲解的是软RAID,所以就不展开赘述,对RAID想要深入了解或对RAID各种模式感兴趣的,可以阅读以下链接:
RAID分为软件RAID和硬件RAID。
硬件磁盘阵列(hardwareRAID)是通过磁盘阵列卡(RAID卡)来创建磁盘阵列的。在RAID卡上会有一个专门的芯片来处理RAID任务,可以大大减轻原来系统的计算压力和I/O压力,效率也会得到很好的提升;同时现在大部分的RAID卡都支持热拔插,所以在更换损坏磁盘时是非常方便的。但是不好的一点是RAID卡比较贵,特别是那些好一点的RAID卡就会特别贵,而且功能还不能保证特别齐全,所以在这种情况下就出现了软件RAID,来模拟硬件RAID。
软件RAID是一种模拟硬件RAID的产物,运行在操作系统上面,所有任务的处理都由CPU来完成,所以需要占用一定的系统资源,特别是计算和I/O资源,所以性能不如硬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是Linux操作系统上开源的软RAID用户层管理工具,允许用户创建和管理软RAID磁盘阵列。
目前,mdadm支持大部分常见的阵列类型,如JBOD、RAID0、RAID1、RAID4、RAID5、RAID6、MULTIPATH、RAID10等,创建和管理RAID也十分的方便,同时,mdadm使用非常灵活,磁盘或者分区都可以作为RAID的成员盘来创建软RAID。主要有7种使用模式:
| 模式名字 | 主要功能 | 
|---|---|
| Create | 使用空闲的设备创建一个新的阵列,每个设备具有元数据块 | 
| Assemble | 将原来属于一个阵列的每个块设备组装为阵列 | 
| Build | 创建或组装不需要元数据的阵列,每个设备没有元数据块 | 
| Manage | 管理已经存储阵列中的设备,比如增加热备磁盘或者设置某个磁盘失效,然后从阵列中删除这个磁盘 | 
| Misc | 报告或者修改阵列中相关设备的信息,比如查询阵列或者设备的状态信息 | 
| Grow | 改变阵列中每个设备被使用的容量或阵列中的设备的数目 | 
| Create | 使用空闲的设备创建一个新的阵列,每个设备具有元数据块 | 
| 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作为其中一个设备,相当于创建单盘raid1yes|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算法级别类型和布局方式以及块大小等信息。设备状态信息分为active,sync,spare,faulty,rebuilding,removing等等。
查询简要信息[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.03Creation Time : Sun Aug 22 17:49:53 2018Raid Level : raid10Array Size : 3145536 (3.00 GiB 3.22 GB)Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)Raid Devices : 6Total Devices : 7Preferred Minor : 0Persistence : Superblock is persistentUpdate Time : Sun Aug 22 21:55:02 1999State : cleanActive Devices : 6Working Devices : 7Failed Devices : 0Spare Devices : 1Layout : near=2, far=1Chunk Size : 64KUUID : 0cabc5e5:842d4baa:e3f6261b:a17a477aEvents : 0.122Number Major Minor RaidDevice State0 8 16 0 active sync /dev/sdb1 8 32 1 active sync /dev/sdc2 8 48 2 active sync /dev/sdd3 8 64 3 active sync /dev/sde4 8 80 4 active sync /dev/sdf5 8 96 5 active sync /dev/sdg6 8 112 - spare /dev/sdh
上面是查询阵列里面的详细信息,我们也可以查询阵列中具体设备的详细信息,使用命令--examine(或者其缩写-E)来检测当前的块设备上是否有阵列的元数据信息,包括设备RAID级别,设备UUID,阵列UUID等等。
[root@test ~]# mdadm -E /dev/sdb1/dev/sdb1:Magic : a92b4efcVersion : 1.2Feature Map : 0x1Array UUID : df3ceb66:95a8c503:9c6c41b2:db583c57Name : host244:rootCreation Time : Wed Apr 17 18:33:11 2019Raid Level : raid1Raid Devices : 2Avail Dev Size : 167772160 (80.00 GiB 85.90 GB)Array Size : 83886080 (80.00 GiB 85.90 GB)Data Offset : 131072 sectorsSuper Offset : 8 sectorsUnused Space : before=130992 sectors, after=0 sectorsState : cleanDevice UUID : 8054a66a:962c52e8:be0c8425:db207be4Internal Bitmap : 8 sectors from superblockUpdate Time : Sat May 4 16:13:56 2019Bad Block Log : 512 entries available at offset 16 sectorsChecksum : 6af807c8 - correctEvents : 207Device Role : Active device 1Array State : AA ('A' == active, '.' == missing, 'R' == replacing)
我们还可以通过cat /proc/mdstat查看所有运行的RAID阵列的状态,在第一行中首先是MD的设备名,active和inactive选项表示阵列是否能读写,接着是阵列的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/mdstatPersonalities : [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: <none>[root@test ~]# mdadm /dev/md0 -f /dev/sdh /dev/sdbmdadm: set /dev/sdh faulty in /dev/md0mdadm: set /dev/sdb faulty in /dev/md0[root@test ~]# cat /proc/mdstatPersonalities : [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/secunused devices: <none>
并且还会展示阵列中一些状态,比如recvoery,resync等等,并且还有详细包括进度值、速度、完成块大小等。
Linux系统目前支持sysfs也可以访问/sys/block/md0目录查询阵列信息。
[root@test ~]# ls -l /sys/block/md0/capability holders range size stat ueventdev md removable slaves subsystem[root@test ~]# ls /sys/block/md0/md/array_state dev-sdg rd1 suspend_lobitmap_set_bits dev-sdh rd2 sync_actionchunk_size layout rd3 sync_completedcomponent_size level rd4 sync_speeddev-sdb metadata_version rd5 sync_speed_maxdev-sdc mismatch_cnt reshape_position sync_speed_mindev-sdd new_dev resync_startdev-sde raid_disks safe_mode_delaydev-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/md0mdadm: fail to stop array /dev/md0: Device or resource busy[root@test ~]# umount /dev/md0[root@test ~]# mdadm --stop /dev/md0mdadm: 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/md0mdadm: no recogniseable superblock on /dev/sdamdadm: /dev/sda has wrong uuid.mdadm: no recogniseable superblock on /dev/sda1mdadm: /dev/sda1 has wrong uuid.mdadm: no RAID superblock on /dev/sdimdadm: /dev/sdi has wrong uuid.mdadm: /dev/sdi1 has wrong uuid.mdadm: no RAID superblock on /dev/sdjmdadm: /dev/sdj has wrong uuid.mdadm: /dev/sdj1 has wrong uuid.mdadm: no RAID superblock on /dev/sdkmdadm: /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 1mdadm: added /dev/sdd to /dev/md0 as 2mdadm: added /dev/sde to /dev/md0 as 3mdadm: added /dev/sdf to /dev/md0 as 4mdadm: added /dev/sdg to /dev/md0 as 5mdadm: added /dev/sdh to /dev/md0 as 6mdadm: added /dev/sdb to /dev/md0 as 0mdadm: /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 anacondaMAILADDR rootAUTO +imsm +1.x -allARRAY /dev/md/1 level=raid1 num-devices=2 UUID=fe796549:cdbe506c:51e5404e:fa40fee6ARRAY /dev/md/2 level=raid1 num-devices=2 UUID=60cecdc1:f115d9e5:f9ddfb52:c3c035abARRAY /dev/md/3 level=raid1 num-devices=2 UUID=df3ceb66:95a8c503:9c6c41b2:db583c57ARRAY /dev/md/4 level=raid0 num-devices=2 UUID=7c5f42c1:9b013ec0:b17b7337:33df22caARRAY /dev/md/5 level=raid1 num-devices=2 UUID=4cbb3226:c5acf9e3:fb156e23:9aa56a48
使用配置文件启动阵列时,mdadm会查询配置文件中的设备和阵列内容,然后启动运行所有能运行RAID阵列。如果指定阵列的设备名字,则只启动对应的阵列。
[root@test ~]# mdadm -Asmdadm: /dev/md1 has been started with 3 drives.mdadm: /dev/md0 has been started with 6 drives and 1 spare.[root@test ~]# cat /proc/mdstatPersonalities : [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 chunksunused devices: <none>[root@test ~]# mdadm -S /dev/md0 /dev/md1mdadm: stopped /dev/md0mdadm: stopped /dev/md1[root@test ~]# mdadm -As /dev/md0mdadm: /dev/md0 has been started with 6 drives and 1 spare.[root@test ~]# cat /proc/mdstatPersonalities : [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: <none>
注意: 
这个配置文件不是随着阵列信息随时变化的,而是可以手动修改的。所以根据配置文件组装未必百分百成功,因为之前可能阵列被手动修改过,所以建议在每一次改变阵列信息后,最好同步一下当前的阵列信息到配置文件中。
[root@test ~]# mdadm -Ds > /etc/mdadm.conf
mdadm可以在Manage模式下,对运行中的阵列进行添加及删除磁盘。常用于标识failed磁盘,增加spare(热备)磁盘,以及从阵列中移走已经失效的磁盘等等。 使用--fail(或者其缩写-f)指定磁盘损坏。
[root@test ~]# mdadm /dev/md0 --fail /dev/sdbmdadm: set /dev/sdb faulty in /dev/md0
当磁盘已经损坏时,使用--remove(或者其缩写-f)参数将这个磁盘从磁盘阵列中移走;但如果设备还正在被阵列使用(即不处于失效状态),则不能从阵列中移走。
[root@test ~]# mdadm /dev/md0 --remove /dev/sdbmdadm: hot removed /dev/sdb[root@test ~]# mdadm /dev/md0 --remove /dev/sdemdadm: hot remove failed for /dev/sde: Device or resource busy
如果阵列带有spare磁盘,那么自动将损坏磁盘上的数据重构到新的spare磁盘上
[root@test ~]# mdadm -f /dev/md0 /dev/sdb ; cat /proc/mdstatmdadm: set /dev/sdb faulty in /dev/md0Personalities : [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/secunused devices: <none>
还可以使用--add(或者其缩写-a)参数增加磁盘:
[root@test ~]# mdadm /dev/md0 --add /dev/sdhmdadm: 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/mdstatPersonalities : [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/secunused devices: <none>[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.03Creation Time : Sun Aug 22 22:16:19 1999Raid Level : raid5Array Size : 1024000 (1000.17 MiB 1048.58 MB)Used Dev Size : 204800 (200.03 MiB 209.72 MB)Raid Devices : 6Total Devices : 7Preferred Minor : 0Persistence : Superblock is persistentUpdate Time : Sun Aug 22 22:23:46 1999State : cleanActive Devices : 6Working Devices : 7Failed Devices : 0Spare Devices : 1Layout : left-symmetricChunk Size : 64KUUID : 53e6395c:1af16258:087cb2a0:b66b087fEvents : 0.12Number Major Minor RaidDevice State0 8 16 0 active sync /dev/sdb1 8 32 1 active sync /dev/sdc2 8 48 2 active sync /dev/sdd3 8 64 3 active sync /dev/sde4 8 80 4 active sync /dev/sdf5 8 96 5 active sync /dev/sdg6 8 112 - spare /dev/sdh[root@test ~]# ./mdadm --grow /dev/md0 --raid-disks=7mdadm: Need to backup 1920K of critical section..mdadm: ... critical section passed.[root@test ~]# cat /proc/mdstatPersonalities : [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/secunused devices: <none>
mdadm还可以对RAID阵列进行监控,监控程序定时查询指定的事件是否发生,然后根据配置来妥善处理。例如当阵列中的磁盘设备出现问题的时候,可以发送邮件给管理员;或者当磁盘出现问题的时候由回调程序来进行自动的磁盘替换,所有监控事件都可以记录到系统日志中。目前mdadm支持的事件有:
RebuildStartedRebuildNN(NN is 20, 40, 60, or 80)RebuildFinishedFailFailSpareSpareActiveNewArrayDegradedArrayMoveSpareSparesMissingTestMessage如果配置每300秒mdadm监控进程查询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/sdbmdadm: set /dev/sdb faulty in /dev/md0[root@test ~]# tail –f /var/log/messagesAug 22 22:04:12 fc5 mdadm: RebuildStarted event detected on md device /dev/md0Aug 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/sdbAug 22 22:04:14 fc5 mdadm: Rebuild80 event detected on md device /dev/md0Aug 22 22:04:16 fc5 mdadm: RebuildFinished event detected on md device /dev/md0Aug 22 22:04:16 fc5 mdadm: SpareActive event detected on md device /dev/md0, component device /dev/sdhAug 22 22:04:16 fc5 kernel: md: md0: recovery done.
回调程序从mdadm程序接受两个或者三个参数:事件名字,监控阵列的名字和特殊事件可能使用到的底层块设备名字。上面的事件返回的信息如下:
Eventname: RebuildStarted Device: /dev/md0 next:Eventname: Fail Device: /dev/md0 next: /dev/sdbEventname: Rebuild80 Device: /dev/md0 next:Eventname: RebuildFinished Device: /dev/md0 next:Eventname:SpareActive Device: /dev/md0 next: /dev/sdh
本文讲述了RAID的特点和优势,然后引入硬RAID和软RAID,并分析这两者的优劣势;最后着重对软RAID的创建,删除,停止和扩展等操作进行了介绍和实践。