@tony-yin
2019-05-05T00:37:49.000000Z
字数 16317
阅读 1482
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作为其中一个设备,相当于创建单盘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
算法级别类型和布局方式以及块大小等信息。设备状态信息分为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.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
的设备名,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/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: <none>
[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: <none>
并且还会展示阵列中一些状态,比如recvoery
,resync
等等,并且还有详细包括进度值、速度、完成块大小等。
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: <none>
[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: <none>
注意:
这个配置文件不是随着阵列信息随时变化的,而是可以手动修改的。所以根据配置文件组装未必百分百成功,因为之前可能阵列被手动修改过,所以建议在每一次改变阵列信息后,最好同步一下当前的阵列信息到配置文件中。
[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: <none>
还可以使用--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: <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.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: <none>
mdadm
还可以对RAID
阵列进行监控,监控程序定时查询指定的事件是否发生,然后根据配置来妥善处理。例如当阵列中的磁盘设备出现问题的时候,可以发送邮件给管理员;或者当磁盘出现问题的时候由回调程序来进行自动的磁盘替换,所有监控事件都可以记录到系统日志中。目前mdadm
支持的事件有:
RebuildStarted
RebuildNN
(NN is 20, 40, 60, or 80
)RebuildFinished
Fail
FailSpare
SpareActive
NewArray
DegradedArray
MoveSpare
SparesMissing
TestMessage
如果配置每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/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
的创建,删除,停止和扩展等操作进行了介绍和实践。