存储方式:简单来说就是,磁盘阵列的第一个磁盘分段是校验值,第二个磁盘至后一个磁盘再折回第一个磁盘的分段是数据,然后第二个磁盘的分段是校验值,从第三个磁盘再折回第二个磁盘的分段是数据,以此类推,直到放完数据为止。这样数据与校验值的循环分离存储就可以达到一定的故障重建功能;但是raid-5的控制较为复杂,且计算大量的校验码,可能给系统造成额外计算的负担(软raid来说,硬件有自己的数据处理能力)
对上面几种常用的RAID类型分析后,可知,RAID-0主要可以提高磁盘性能,RAID-1主要可以实现备份容错(RAID-5由于控制机制复杂在此暂不使用),所以可以在实际生产环境下考虑结合RAID-0和RAID-1来实现磁盘存储系统的高性能、高容错。
对于一:底层分别用有两块硬盘的raid0实现高并发,再集合两个raid0组实现冗余;下层的任意一个raid0组中有任意一块硬盘会使改组失效,但是两外一个组仍能提供全部数据;
对于二:底层用raid-1实现数冗余,上层用raid-2实现高并发,该种结构中任意一个硬盘的故障,不对本组整体数据工作构成破坏性影响;所以感觉该种方案更优异,在实际生产中有部分应用(具体配置过程再文章最后附);
mdadm工具介绍:
描述:mdadm(multipledevicesadmin)是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]<raid-device>[options]<component-devices>
目前支持的模式:LINEAR(线性模式)、RAID0(striping条带模式)、RAID1(mirroring)、RAID-4、RAID-5、RAID-6、RAID-10、MULTIPATH和FAULTY
LINEAR:线性模式,该模式不是raid的标准模式,其主要作用是可以实现将几块小的硬盘组合为一块大硬盘来使用;数组存储时一次存满一个硬盘在使用下一个硬盘;对上层来说操作的是一个大硬盘
模式(7种):Assemble:装配模式:加入一个以前定义的阵列;可以使挺值得阵列或从其他主机移出的阵列
Build:创建:创建一个没有超级块的阵列Create:创建一个新的阵列,每个设备具有超级块
FolloworMonitor:监控RAID的状态,一般只对RAID-1/4/5/6/10等有冗余功能的模式来使用
Grow:(Groworshrink)改变RAID的容量或阵列中的设备数目;收缩一般指的是数据收缩或重建;
Manage:管理阵列(如添加spare盘和删除故障盘)
IncrementalAssembly:添加一个设备到一个适当的阵列。
Misc:允许单独对阵列中的某个设备进行操作(如抹去superblocks或停止阵列)
Auto-detect:此模式不作用于特定的设备或阵列,而是要求在Linux内核启动任何自动检测到的阵列。
OPTIONS:
选择一个模式的选项:(Optionsforselectingamode)
-A,--assemble:加入并开启一个以前定义的阵列
-B,--build:创建一个没有超级块的阵列(Buildalegacyarraywithoutsuperblocks.)
-C,--create:创建一个新的阵列
-F,--follow,--monitor:选择监控(Monitor)模式-
G,--grow:改变激活阵列的大小或形态-I,
--incremental:添加一个单独的设备到合适的阵列,并可能启动阵列
--auto-detect:请求内核启动任何自动检测到的阵列
不特定于一个模式的选项:(Optionsthatarenotmode-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不显示纯消息性的信息,除非那是一个重要的报告;
createbuild或grow时使用的选项:
-n,--raid-devices=:指定阵列中活动的device数目,不包括spare磁盘,这个数目只能由--grow修改
-x,--spare-devices=:指定初始阵列的冗余device数目即sparedevice数目;
-c,--chunk=:Specifychunksizeofkibibytes.缺省为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=:Specifyroundingfactorforlineararray(==chunksize)
-l,--level=:设定raidlevel.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作为missingdrive。此选项正相反
-N,--name=:设定阵列的名称
管理模式选项(ForManagemode):
-a,--add:添加列出的设备到一个工作的阵列中;当阵列处于降级状态(故障状态),你添加一个设备,该设备将作为备用设备并且在该备用设备上开始数据重建。-r,--remove:从阵列中移除列出的设备,并且该设备不能处于活动状态(是冗余盘或故障盘);
-f,--fail:将列出的设备标记为faulty状态,标记后就可以移除设备;(可以作为故障恢复的测试手段)--set-faulty:同上
监控模式选项(ForMonitormode):
-m,--mail:设置一个mail地址,在报警时给该mail发信;该地址可写入conf文件,在启动阵列是生效
-p,--program,--alert:当检测到一个事件时运行一个指定的程序
-y,--syslog:设置所有的事件记录于syslog中
-t,--test:给启动时发现的每个阵列生成test警告信息;该信息传递给mail或报警程序;(以此来测试报警信息是否能正确接收)
MISC模式选项:Usage:mdadmoptions...devices...
-Q,--query:查看一个device,判断它为一个mddevice或是一个md阵列的一部分
-D,--detail:打印一个或多个mddevice的详细信息
-E,--examine:打印device上的mdsuperblock的内容创建一个软RAID的基本过程:
(以三个分区模拟创建一个raid5为操作示例,对于level0/1的How-To不再写出,如果理解原理,配置真的很简单;)
1.生成raid组成:linux中阵列组成单元是分区,分区可以是整个设备也可以是设备多个分区中的一个;在fdisk分区后需要将分区标志改为Linuxraidauto类型;
#分区后如下:
DeviceBootStartEndBlocksIdSystem
/dev/sdb116094891761fdLinuxraidautodetect
/dev/sdc116094891761fdLinuxraidautodetect
/dev/sdd116094891761fdLinuxraidautodetect
2.建立磁盘阵列
#mdadm-C/dev/md0-ayes-l5-n3/dev/sd{b,c,d}1
mdadm:array/dev/md0started.
-C:创建一个阵列,后跟阵列名称
-l:指定阵列的级别;
-n:指定阵列中活动devices的数目
3.查看阵列状态
[root@bogon~]#cat/proc/mdstat
Personalities:[raid6][raid5][raid4]
md0:activeraid5sdd1[2]sdc1[1]sdb1[0]
9783296blockslevel5,64kchunk,algorithm2[3/3][UUU]
unuseddevices:<none>
通过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
CreationTime:TueMar1508:17:522011
RaidLevel:raid5
ArraySize:9783296(9.33GiB10.02GB)
UsedDevSize:4891648(4.67GiB5.01GB)
RaidDevices:3
TotalDevices:3
PreferredMinor:0
Persistence:Superblockispersistent
UpdateTime:TueMar1508:20:252011
State:clean
ActiveDevices:3
WorkingDevices:3
FailedDevices:0
SpareDevices:0
Layout:left-symmetric校验规则
ChunkSize:64K
UUID:e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d
Events:0.2
NumberMajorMinorRaidDeviceState
08170activesync/dev/sdb1
18331activesync/dev/sdc1
28492activesync/dev/sdd1
4.mdadm.conf配置:mdadm.conf是该软件的默认配置文件,主要作用是方便跟踪软RAID的配置,尤其是可以配置监视和事件上报选项。其中写入每一个阵列组成的详细情况,用于在下次开启阵列后依据此文件重新装配(assemble)开启阵列,否则就需要在开启时手动定义阵列中的成员;当然是推荐创建该文件,防止出现意外情况,具体的详细配置及示例可以参看man文档#manmdadm.conf
[root@bogon~]#echo"DEVICE/dev/sdb1/dev/sdc1/dev/sdd1">>/etc/mdadm.conf
[root@bogon~]#mdadm-Ds>>/etc/mdadm.conf
[root@bogon~]#echo"MAILADDRmospiral@gmail.com">>/etc/mdadm.conf
MAILADDR指定出问题时监控系统发邮件的地址
#格式如下:
DEVICE/dev/sdb1/dev/sdc1/dev/sdd1
ARRAY/dev/md0level=raid5num-devices=3metadata=0.90UUID=e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d
MAILADDRmospiral@gmail.com
#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:activeraid5sda5[3](S)sdd1[2]sdc1[1]sdb1[0]
9783296blockslevel5,64kchunk,algorithm2[3/3][UUU]
unuseddevices:<none>
模拟硬盘故障:
[root@bogon~]#mdadm-f/dev/md0/dev/sdd1
mdadm:set/dev/sdd1faultyin/dev/md0
#此时查看状态,发现概念刚才的热备盘已经顶替了故障盘的位置,
#并且进度条显示数据重建过程:
[root@bogon~]#cat/proc/mdstat
Personalities:[raid6][raid5][raid4]
md0:activeraid5sda5[3]sdd1[4](F)sdc1[1]sdb1[0]
9783296blockslevel5,64kchunk,algorithm2[3/2][UU_]
[>....................]recovery=1.3%(66912/4891648)finish=6.0minspeed=13382K/sec
unuseddevices:<none>
热移除故障的硬盘:
[root@bogon~]#mdadm-r/dev/md0/dev/sdd1
mdadm:hotremoved/dev/sdd1
[root@bogon~]#cat/proc/mdstat
Personalities:[raid6][raid5][raid4]
md0:activeraid5sda5[3]sdc1[1]sdb1[0]
9783296blockslevel5,64kchunk,algorithm2[3/2][UU_]
[===>.................]recovery=16.1%(792136/4891648)finish=4.6minspeed=14828K/sec
unuseddevices:<none>
对于有冗余的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/md0hasbeenstartedwith2drives(outof3).
#-s–scan:根据配置文件开启所有的阵列,此时由于故障恢复过,
#但是由于未重建配置文件,阵列我不能加载上新添加的硬盘;(需要停掉,重新手动指定)
[root@bogon~]#cat/proc/mdstat
Personalities:[raid6][raid5][raid4]
md0:activeraid5sdb1[0]sdc1[1]
9783296blockslevel5,64kchunk,algorithm2[3/2][UU_]
unuseddevices:<none>
若此时没有配置文件,就需要手动指定设备名称:
[root@bogon~]#mdadm-A/dev/md0/dev/sdb1/dev/sdc1/dev/sda5
mdadm:/dev/md0hasbeenstartedwith3drives.
#注:将一个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
CreationTime:TueMar1508:17:522011
RaidLevel:raid5
UsedDevSize:4891648(4.67GiB5.01GB)
ArraySize:9783296(9.33GiB10.02GB)
RaidDevices:3
TotalDevices:3
PreferredMinor:0
UpdateTime:TueMar1509:25:102011
State:clean
ActiveDevices:3
WorkingDevices:3
FailedDevices:0
SpareDevices:0
Checksum:b0cd088f-correct
Events:8
Layout:left-symmetric
ChunkSize:64K
NumberMajorMinorRaidDeviceState
this08170activesync/dev/sdb1
008170activesync/dev/sdb1
118331activesync/dev/sdc1
22852activesync/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值
ThestrideisthesoftwareRAIDdevice'schunk-sizeinfilesystemblocks.Forexample,withanext3filesystemthatwillhavean4KBblocksizeonaRAIDdevicewithachunk-sizeof64KB,thestrideshouldbesetto16:(翻译的很纠结,就贴上教材原文了。)
mk2fs-j-b4096-Estride=16/dev/md0
#设置时,需要用-E选项进行扩展
设定良好的stride值,可以在后期使用时,减少写入数据时对数据块计算的负担,从而提高RAID性能;
附:RAID1-0双层架构的方法:
首先创建两个底层RAID-1
[root@bogon~]#mdadm-C/dev/md0-ayes-l1-n2/dev/sd[bc]1
mdadm:array/dev/md0started.
[root@bogon~]#mdadm-C/dev/md1-ayes-l1-n2/dev/sd[bc]2
mdadm:array/dev/md1started.
用两个RAID-1实现上层RAID-0:
[root@bogon~]#mdadm-C/dev/md2-ayes-l0-n2/dev/md[01]
mdadm:array/dev/md2started.
查看阵列状态:
[root@bogon~]#cat/proc/mdstat
Personalities:[raid6][raid5][raid4][raid0][raid1]
md2:activeraid0md0[0]md1[1]
9783232blocks64kchunks
md1:activeraid1sdb2[0]sdc2[1]
4891712blocks[2/2][UU]
md0:activeraid1sdb1[0]sdc1[1]
4891648blocks[2/2][UU]
unuseddevices:<none>
创建配置文件:
[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/md0hasbeenstartedwith2drives.
mdadm:/dev/md1hasbeenstartedwith2drives.
mdadm:/dev/md2hasbeenstartedwith2drives.
##上述关闭与开启过程,系统能只能识别层级,关闭先关闭上层,
##后开启上层;防止了冲突;