参考文献:http://blog.163.com/leekwen@126/blog/static/33166229200952105318806/
mdadm工具介绍:
描述:
mdadm(multiple devices admin)是 linux下标准的的软raid管理工具,是一个模式化工具(在不同的模式下);程序工作在内存用户程序区,为用户提供RAID接口来操作内核的模块,实现各种功能;
RedHat已经内置了该工具;官方最新的版本应该是3.2,需要最新版本可以到官方网站下载或http://www.kernel.org/pub/linux/utils/raid/mdadm/下载源码包进行编译安装(官网一直打不开o(╯□╰)o).
实验环境:RedHhat5.4 ;mdadm版本为v2.6.9 ;
可能不同的版本选项等略有变动,使用时请注意对照自己版本的man文档;
基本语法:
# mdadm [mode]
目前支持的模式:
LINEAR(线性模式)、RAID0(striping条带模式)、RAID1(mirroring)、 RAID-4、RAID-5、 RAID-6、 RAID-10、 MULTIPATH和FAULTY
LINEAR:线性模式,该模式不是raid的标准模式,其主要作用是可以实现将几块小的硬盘组合为一块大硬盘来使用;数组存储时一次存满一个硬盘在使用下一个硬盘;对上层来说操作的是一个大硬盘
模式(7种):
Assemble:装配模式:加入一个以前定义的阵列;可以使挺值得阵列或从其他主机移出的阵列
Build: 创建:创建一个没有超级块的阵列
Create: 创建一个新的阵列,每个设备具有超级块
Follow or Monitor: 监控RAID的状态,一般只对RAID-1/4/5/6/10等有冗余功能的模式来使用
Grow:(Grow or shrink) 改变RAID的容量或阵列中的设备数目;收缩一般指的是数据收缩或重建;
Manage: 管理阵列(如添加spare盘和删除故障盘)
Incremental Assembly:添加一个设备到一个适当的阵列。
Misc: 允许单独对阵列中的某个设备进行操作(如抹去superblocks 或停止阵列)
Auto-detect: 此模式不作用于特定的设备或阵列,而是要求在Linux内核启动任何自动检测到的阵列。
OPTIONS:
选择一个模式的选项:(Options for selecting a mode)
-A, --assemble: 加入并开启一个以前定义的阵列
-B, --build: 创建一个没有超级块的阵列(Build a legacy array without superblocks.)
-C, --create: 创建一个新的阵列
-F, --follow, --monitor:选择监控(Monitor)模式
-G, --grow: 改变激活阵列的大小或形态
-I, --incremental: 添加一个单独的设备到合适的阵列,并可能启动阵列
--auto-detect: 请求内核启动任何自动检测到的阵列
不特定于一个模式的选项:(Options that are not mode-specific)
-c, --config=: 指定配置文件,缺省为 /etc/mdadm.conf
-s, --scan: 扫描配置文件或 /proc/mdstat以搜寻丢失的信息。默认配置文件:/etc/mdadm.conf
-h, --help: 帮助信息,用在以上选项后,则显示该选项信息
-v, --verbose: 显示细节,一般只能跟 --detile 或 --examine一起使用,显示中级的信息;
-b, --brief: 较少的细节。用于 --detail 和 --examine 选项
--help-options: 显示更详细的帮助
-V, --version: 版本信息
-q,--quit: 安静模式;加上该选项能使mdadm不显示纯消息性的信息,除非那是一个重要的报告;
create build 或grow时使用的选项:
-n, --raid-devices=: 指定阵列中活动的device数目,不包括spare磁盘,这个数目只能由--grow修改
-x, --spare-devices=:指定初始阵列的冗余device 数目即spare device数目;
-c, --chunk=: Specify chunk size of kibibytes. 缺省为 64. chunk-size是一个重要的参数,决定了一次向阵列中每个磁盘写入数据的量
(Chunk :,可以理解为raid分储数据时每个数据段的大小(通常为32/64/128等这类数字大小);合理的选择chunk大小非常重要,若chunk过大可能一块磁盘上的带区空间就可以满足大部分的I/O操作,使得数据的读写只局限于一块硬盘上,这便不能充分发挥RAID并发的优势;如果chunk设置过小,任何很小的I/O指令都 可能引发大量的读写操作,不能良好发挥并发性能,占用过多的控制器总线带宽,也影响了阵列的整体性能。所以,在创建带区时,我们应该根据实际应用的需要,合理的选择带区大小。)
-z, --size=:组建RAID1/4/5/6后从每个device获取的空间总数;但是大小必须为chunk的倍数,还需要在每个设备最后给RAID的superblock留至少128KB的大小。
--rounding=: Specify rounding factor for linear array (==chunk size)
-l, --level=: 设定 raid level.raid的几倍
--create: 可用:linear, raid0, 0, stripe, raid1,1, mirror, raid4, 4, raid5, 5, raid6, 6, multipath, mp.
--build: 可用:linear, raid0, 0, stripe.
-p, --layout=:设定raid5 和raid10的奇偶校验规则;并且控制故障的故障模式;其中RAID-5的奇偶校验可以在设置为::eft-asymmetric, left-symmetric, right-asymmetric, right-symmetric, la, ra, ls, rs.缺省为left-symmetric
--parity: 类似于--layout=
--assume-clean:目前仅用于 --build 选项
-R, --run: 阵列中的某一部分出现在其他阵列或文件系统中时,mdadm会确认该阵列。此选项将不作确认。
-f, --force: 通常mdadm不允许只用一个device 创建阵列,而且此时创建raid5时会使用一个device作为missing drive。此选项正相反
-N,--name=: 设定阵列的名称
管理模式选项(For Manage mode):
-a, --add: 添加列出的设备到一个工作的阵列中;当阵列处于降级状态(故障状态),你添加一个设备,该设备将作为备用设备并且在该备用设备上开始数据重建。
-r, --remove:从阵列中移除列出的设备,并且该设备不能处于活动状态(是冗余盘或故障盘);
-f,--fail:将列出的设备标记为faulty状态,标记后就可以移除设备;(可以作为故障恢复的测试手段)
--set-faulty:同上
监控模式选项(For Monitor mode):
-m, --mail: 设置一个mail地址,在报警时给该mail发信;该地址可写入conf文件,在启动阵列是生效
-p, --program, --alert:当检测到一个事件时运行一个指定的程序
-y, --syslog: 设置所有的事件记录于syslog中
-t, --test: 给启动时发现的每个阵列生成test警告信息;该信息传递给mail或报警程序;(以此来测试报警信息是否能正确接收)
MISC模式选项:
Usage: mdadm options ... devices ...
-Q, --query: 查看一个device,判断它为一个 md device 或是 一个 md 阵列的一部分
-D, --detail: 打印一个或多个md device 的详细信息
-E, --examine:打印 device 上的 md superblock 的内容
创建一个软RAID的基本过程:
(以三个分区模拟创建一个raid5为操作示例,对于level0/1的How-To不再写出,如果理解原理,配置真的很简单;)
1. 生成raid组成:
linux中阵列组成单元是分区,分区可以是整个设备也可以是设备多个分区中的一个;在fdisk分区后需要将分区标志改为Linux raid auto类型;
- # 分区后如下:
- Device Boot Start End Blocks Id System
- /dev/sdb1 1 609 4891761 fd Linux raid autodetect
- /dev/sdc1 1 609 4891761 fd Linux raid autodetect
- /dev/sdd1 1 609 4891761 fd Linux raid autodetect
2. 建立磁盘阵列
- # mdadm -C /dev/md0 -a yes -l 5 -n 3 /dev/sd{b,c,d}1
- mdadm: array /dev/md0 started.
- -C :创建一个阵列,后跟阵列名称
- -l :指定阵列的级别;
- -n :指定阵列中活动devices的数目
3. 查看阵列状态
- [root@bogon ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sdd1[2] sdc1[1] sdb1[0]
- 9783296 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
- unused devices:
通过cat /proc/mdstat信息查看所有运行的RAID阵列的状态,在第一行中首先是MD的设备名md0,active和inactive选项表示阵列是否能读/写,接着是阵列的RAID级别raid5,后面是属于阵列的块设备,方括号[]里的数字表示设备在阵列中的序号,(S)表示其是热备盘,(F)表示这个磁盘是 faulty状态。下一行中首先是阵列的大小,用块数来表示;后面有chunk-size的大小,然后是layout类型,不同RAID级别的 layout类型不同,[3/3] [UUU]表示阵列有3个磁盘并且3个磁盘都是正常运行的,而[2/3]和[_UU] 表示阵列有3个磁盘中2个是正常运行的,下划线对应的那个位置的磁盘是faulty状态的。
- 查看阵列的详细信息:
- [root@bogon ~]# mdadm --detail /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Tue Mar 15 08:17:52 2011
- Raid Level : raid5
- Array Size : 9783296 (9.33 GiB 10.02 GB)
- Used Dev Size : 4891648 (4.67 GiB 5.01 GB)
- Raid Devices : 3
- Total Devices : 3
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Tue Mar 15 08:20:25 2011
- State : clean
- Active Devices : 3
- Working Devices : 3
- Failed Devices : 0
- Spare Devices : 0
- Layout : left-symmetric 校验规则
- Chunk Size : 64K
- UUID : e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d
- Events : 0.2
- Number Major Minor RaidDevice State
- 0 8 17 0 active sync /dev/sdb1
- 1 8 33 1 active sync /dev/sdc1
- 2 8 49 2 active sync /dev/sdd1
4. mdadm.conf配置:
mdadm.conf是该软件的默认配置文件,主要作用是方便跟踪软RAID的配置,尤其是可以配置监视和事件上报选项。其中写入每一个阵列组成的详细情况,用于在下次开启阵列后依据此文件重新装配(assemble)开启阵列,否则就需要在开启时手动定义阵列中的成员;当然是推荐创建该文件,防止出现意外情况,具体的详细配置及示例可以参看man文档# man mdadm.conf
- [root@bogon ~]# echo "DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 " >> /etc/mdadm.conf
- [root@bogon ~]# mdadm -Ds >> /etc/mdadm.conf
- [root@bogon ~]# echo "MAILADDR [email protected]" >> /etc/mdadm.conf
- MAILADDR指定出问题时监控系统发邮件的地址
- # 格式如下:
- DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1
- ARRAY /dev/md0 level=raid5 num-devices=3 metadata=0.90 UUID=e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d
- MAILADDR [email protected]
- #DEVICE行指明:依据该配置文件开启阵列时,去查找那些设备的超级快信息;若没有该行,
- 就去搜索mtab中所有设备分区的超级快信息;所以改行可以不写,但是只要写上,以后添加spare
- 设备时就需要同时修改改行信息;
- #ARRAY 行指明raid的名称,级别uuid等基本信息
- #可以添加诸如MAILADDR及PROGRAM等指定monitor状态下的监控报警信息;
磁盘阵列的管理:
可以在manage模式下对磁盘进行各种管理工作;
给raid-5新增一个spare盘:
- [root@bogon ~]# mdadm -a /dev/md0 /dev/sda5
- mdadm: added /dev/sda5
- 此时查看状态:
- [root@bogon ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sda5[3](S) sdd1[2] sdc1[1] sdb1[0]
- 9783296 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
- unused devices:
模拟硬盘故障:
- [root@bogon ~]# mdadm -f /dev/md0 /dev/sdd1
- mdadm: set /dev/sdd1 faulty in /dev/md0
- # 此时查看状态,发现概念刚才的热备盘已经顶替了故障盘的位置,
- # 并且进度条显示数据重建过程:
- [root@bogon ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sda5[3] sdd1[4](F) sdc1[1] sdb1[0]
- 9783296 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
- [>....................] recovery = 1.3% (66912/4891648) finish=6.0min speed=13382K/sec
- unused devices:
热移除故障的硬盘:
- [root@bogon ~]# mdadm -r /dev/md0 /dev/sdd1
- mdadm: hot removed /dev/sdd1
- [root@bogon ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sda5[3] sdc1[1] sdb1[0]
- 9783296 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
- [===>.................] recovery = 16.1% (792136/4891648) finish=4.6min speed=14828K/sec
- unused devices:
对于有冗余的raid形式,在单一磁盘故障时一般能在一段时间内重建数据;但是数据量非常大时,重建会非常缓慢,且重建过程系统压力比较大,此时需要多关注系统负载,防止重建过程出现错误;在热移除故障盘一户,也需要尽快的换上新硬盘,并且添加spare盘;在故障修复,重建重建之后,需要重新生成配置文件,防止在下次开启时,按照最初的定义模式开启;
停止RAID:
- # 指定停止某个阵列
- [root@bogon ~]# mdadm -S /dev/md0
- # 停止配置文件中定义的所有阵列
- [root@bogon ~]# mdadm -Ss
- mdadm: stopped /dev/md0
- # -s –scan去查询配置文件或没有配置文件时查询mdstat中的所有阵列
开启RAID:
- [root@bogon ~]# mdadm -As
- mdadm: /dev/md0 has been started with 2 drives (out of 3).
- # -s –scan:根据配置文件开启所有的阵列,此时由于故障恢复过,
- # 但是由于未重建配置文件,阵列我不能加载上新添加的硬盘;(需要停掉,重新手动指定)
- [root@bogon ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sdb1[0] sdc1[1]
- 9783296 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
- unused devices:
- 若此时没有配置文件,就需要手动指定设备名称:
- [root@bogon ~]# mdadm -A /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sda5
- mdadm: /dev/md0 has been started with 3 drives.
- # 注:将一个raid设备添加入md阵列后,md的信息会写入到该设备分区的superblock中;
- # 在手动装配时;mdadm工具会自动验证阵列配置是否合法,并且做出相应的动作;
若新接手一个raid,没有配置文件,或忘记设备的准确组成,就需要按分区逐个检查是否是raid设备及其他信息,然后根据信息装配阵列:
- [root@bogon ~]# mdadm -E /dev/sdb1
- /dev/sdb1:
- Magic : a92b4efc
- Version : 0.90.00
- UUID : e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d
- Creation Time : Tue Mar 15 08:17:52 2011
- Raid Level : raid5
- Used Dev Size : 4891648 (4.67 GiB 5.01 GB)
- Array Size : 9783296 (9.33 GiB 10.02 GB)
- Raid Devices : 3
- Total Devices : 3
- Preferred Minor : 0
- Update Time : Tue Mar 15 09:25:10 2011
- State : clean
- Active Devices : 3
- Working Devices : 3
- Failed Devices : 0
- Spare Devices : 0
- Checksum : b0cd088f - correct
- Events : 8
- Layout : left-symmetric
- Chunk Size : 64K
- Number Major Minor RaidDevice State
- this 0 8 17 0 active sync /dev/sdb1
- 0 0 8 17 0 active sync /dev/sdb1
- 1 1 8 33 1 active sync /dev/sdc1
- 2 2 8 5 2 active sync /dev/sda5
- # 该处显示出的是该分区superblock中包含的md信息;没有配置文件时,可以依据该信息装配md;
删除阵列:
若需要彻底清除这个阵列:
- [root@bogon ~]# umount /dev/md0
- mdadm -Ss /dev/md0
- [root@bogon ~]# mdadm --zero-superblock /dev/sd{b,c,d}1
- # --zero-superblock 加上该选项时,会判断如果该阵列是否包
- # 含一个有效的阵列超级快,若有则将该超级块中阵列信息抹除。
- [root@bogon ~]# rm /etc/mdadm.conf
RAID优化:
(1) 设置stride值
The stride is the software RAID device's chunk-size in filesystem blocks.For example,with an ext3 filesystem that will have an 4KB block size on a RAID device with a chunk-size of 64KB, the stride should be set to 16:(翻译的很纠结,就贴上教材原文了。)
- mk2fs -j -b 4096 -E stride=16 /dev/md0
- # 设置时,需要用-E选项进行扩展
设定良好的stride值,可以在后期使用时,减少写入数据时对数据块计算的负担,从而提高RAID性能;
附:RAID 1-0双层架构的方法:
首先创建两个底层RAID-1
- [root@bogon ~]# mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sd[bc]1
- mdadm: array /dev/md0 started.
- [root@bogon ~]# mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sd[bc]2
- mdadm: array /dev/md1 started.
用两个RAID-1实现上层RAID-0:
- [root@bogon ~]# mdadm -C /dev/md2 -a yes -l 0 -n 2 /dev/md[01]
- mdadm: array /dev/md2 started.
查看阵列状态:
- [root@bogon ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4] [raid0] [raid1]
- md2 : active raid0 md0[0] md1[1]
- 9783232 blocks 64k chunks
- md1 : active raid1 sdb2[0] sdc2[1]
- 4891712 blocks [2/2] [UU]
- md0 : active raid1 sdb1[0] sdc1[1]
- 4891648 blocks [2/2] [UU]
- unused devices:
创建配置文件:
- [root@bogon ~]# mdadm -Ds > /etc/mdadm.conf
停止与开启阵列:
- [root@bogon ~]# mdadm -Ss
- mdadm: stopped /dev/md2
- mdadm: stopped /dev/md1
- mdadm: stopped /dev/md0
- [root@bogon ~]# mdadm -As
- mdadm: /dev/md0 has been started with 2 drives.
- mdadm: /dev/md1 has been started with 2 drives.
- mdadm: /dev/md2 has been started with 2 drives.
- ##上述关闭与开启过程,系统能只能识别层级,关闭先关闭上层,
- ##后开启上层;防止了冲突;
参考:
软RAID0的技术概要及实现 : http://www.linuxsir.org/main/node/279
维基百科--RAID : http://zh.wikipedia.org/zh-cn/Raid
http://www.linuxidc.com/Linux/2009-12/23394p6.htm