2013年(11)
分类: LINUX
2013-04-17 11:49:51
原文地址:RedHat官方文档:RAID阵列 作者:顽主
4.00 本章概述:
-了解RedHat Linux下各种类型的RAID阵列;
-学习如何管理高级的软RAID;
-学习如何优化软RAID阵列;
-规划和实现存储阵列的增长;
4.01 独立的磁盘冗余阵列(RAID):
RAID是Redundant Array of Independent Disk的缩写,中文翻译过来就叫做“独立的冗余磁盘阵列”。磁盘技术还没发展到如今这样强大的时候,磁盘的价格非常昂贵,尤其是大容量的磁盘,更是天价。为了满足企业级的存储需求,早期的RAID产生了,最初只是为了组合廉价的小容量磁盘,以代替昂贵的大容量磁盘,后来随着数据存储的发展,RAID才慢慢突出其在提高数据访问速度、提高数据可用性上的特点。
RAID可以将多个物理磁盘组合成一个逻辑单元,对于操作系统来说,它将RAID看成一个块设备,而在RAID底层其实是由多个块设备通过不同的冗余算法组合而成的逻辑设备。本章中讲的RAID是围绕软件级RAID展开的,因为软RAID是由操作系统层提供,不需要RAID卡等硬件设备也能轻松做实验,其次是软件RAID比硬件RAID在类型上和功能上都要丰富,更利于我们充分深入地理解RAID阵列。
软RAID有以下几种类型:
RAID0,RAID1,RAID5,RAID6,RAID10等等,这些具有代表性的RAID我们会在下面几节内容中详细讲解。
对于RAID的功能相信大家一定不陌生:首先是其冗余校验算法在保证数据完整性上的作用,同时也实现了容错的功能,提高了阵列的吞吐率,最实在的是提高了存储阵列的容量。
很多朋友搞不清楚软件RAID和硬件RAID的本质区别,我这里做个讲解。软件级的RAID是基于操作系统层面的,它的RAID抽象层是由系统实现的,它的各磁盘之间的数据分布、校验码运算、阵列修复等都是由系统内核及系统CPU提供的,只要操作系统出现了问题,这个RAID也将朝不保夕,所以软件RAID的可靠性是完全达不到企业级要求的;硬件级的RAID则是将很多重要功能抽离出来,嵌入到硬件RAID卡上,最重要一点是硬件RAID卡自身带有专门设计用于RAID算法运算的CPU,这样就不需要占用系统CPU的资源,解决了可能因系统CPU中断调度阻塞而造成的数据瓶颈。
在RadHat Linux下的软件RAID工具是mdadm,通过这个工具我们可以创建各种RAID阵列,查看详细RAID信息等等重要操作,后面我们会详细说明使用方法。
4.02 RAID0条带卷:
RAID0又叫做Stripe,即条带卷,是所有RAID级别中性能最好的阵列类型。RAID0之所以具有很高的性能,是因为RAID0实现了带区组,它将连续的数据分散地存储到多个磁盘驱动器中。
当系统有数据请求时,就可以同时由多个磁盘中并行读取数据。这种数据上的并行操作充分地利用了总线的带宽,所以数据吞吐率大大提高。同时磁盘驱动器也能相对地负载均衡,从而显著地提高磁盘的整体存取性能。
要实现RAID0起码要两个以上的磁盘驱动器,如果某次请求所需的数据刚好分布在不同的驱动器上时,此时效率性能最佳,因为此时可以进行并行的读取;如果所需数据恰好在同一个驱动器上,则无法并行读取。
虽然RAID0在存取性能上有优势,但是其弱点也相当明显。RAID0没有数据的差错控制,不能保证数据的完整性可靠性,当阵列中某个驱动器损坏时,将无法读取正确的数据。但是RAID0应用在一些对于数据可靠性要求不高的应用上还是不错的,例如电影存储、图片站存储等等。
RAID0配置实例:
# mdadm --create /dev/md0 --level=0 --raid-devices=2 --chunk=64 /dev/sd[ab]1
# mke2fs -j -b 4096 -E stride=16 /dev/md0
在RAID中有block、chunk和stride这个3个重要参数,它们描述了数据在底层的组织和分布。在创建RAID设备的阶段首先要指定chunk的大小,如--chunk=64,chunk块其实是RAID数据分布的基本单位,如上面创建的RAID0,数据是分散存储在2个磁盘中的,如在第一块盘写入了一个chunk时,就转到第二块盘继续写数据,也就是以chunk为单位轮转地在多块磁盘上写数据。
而block和stride则是在格式化创建文件系统时指定的,block好理解,就是文件系统层面上划分的基本块,你可以针对你所要存储的数据的特点来指定更为合适的Block Size;而stride也成为跨步数,stride=chunk/block,就是说,当你的chunk=64,block=4096时,你在第一块的文件系统上写了16个Block(16个跨步)才达到一个Chunk,也就是在磁盘上进行16个跨步的写操作才轮转到下一块磁盘。
4.03 RAID1镜像卷:
RAID1又称为镜像卷,使用RAID1至少需要2块以上的磁盘,当数据写入时,会在两块盘中写入完全相同的数据,形成镜像结构,当一组盘出现问题时,可以使用镜像盘,以此提高存储的容错能力。
RAID1的容错策略是完全备份,同样的数据在RAID1阵列中有两份,这样也使得读性能有了很大的提高,因为在读取数据时可以使主磁盘和镜像盘两个驱动器并行地进行读取。这样使得RAID1具有极佳的读性能。
RAID1支持热替换,即可以在在线的状态下取下受损的磁盘,替换上新的磁盘,此时RAID将自动进行镜像修复。但是由于RAID1是完全备份的策略,且出错校验较为严格,如果是软件级的RAID1则将会大大影响服务器的性能,尤其是在服务器负载高峰期。
RAID1配置实例:
# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sd[ab]1
4.04 RAID5奇偶校验卷:
RAID5是带有分布式奇偶校验位的块级别条带卷,需要3块及以上个磁盘,RAID5具有很高的读性能,但是写性能则一般,因为在数据写入的过程中要进行奇偶校验运算并将校验码写到磁盘中。
RAID5在物理底层数据存储是以“异或”运算来实现校验的,如下表,该RAID5是由以下3块磁盘组成的,数据的写入都是分布式的,并没有哪一块盘是专门用于存放校验码的。
Disk 1 |
Disk2 |
Disk3 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
如第一行,假如1,2号盘写入的是数据,则第3块盘则根据前两个数据做“异或”运算的结果存放起来,即 1 XOR 1 = 0,当任一盘出现问题,例如Disk1损坏,则将Disk2和Disk3上的数据进行“异或”运算就能得出Disk1上的数据,即 1 XOR 0 = 1。
RAID5在检测到某盘损坏时将自动进入降级模式,限制读写速度以保证现有已损坏的阵列不会出现更大的问题;RAID5支持热备盘,即当检测到某磁盘损坏时,阵列会自动将热备盘顶上,并自动进行数据修复动作。
RAID5的磁盘利用率:(N-1/N)*100% (N为磁盘数)
RAID5配置实例:
# mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sd[abc]1
如图就是我上面提到过的底层数据分布,该RAID5阵列是由4个磁盘组成的,其中白色的框代表奇偶校验信息,可以看出数据的分布式存储以及条带的组成。以上数据分布模型采用的是“左对称奇偶校验”策略,这在RHEL中是默认使用的策略。
4.06 RAID5的数据排列算法:
RAID阵列的数据分布有以下4种算法,分别是左对称、右对称、左非对称、右非对称,而RAID5默认使用左对称的数据分布算法。
Left Asymmetric左非对称 Right Asymmetric右非对称
sda1 sdb1 sdc1 sde1 sda1 sdb1 sdc1 sde1
D0 D1 D2 P P D0 D1 D2
D3 D4 P D5 D3 P D4 D5
D6 P D7 D8 D6 D7 P D8
P D9 D10 D11 D9 D10 D11 P
D12 D13 D14 P P D12 D13 D14
=================================================================
Left Symmetric左对称 Right Symmetric右对称
sda1 sdb1 sdc1 sde1 sda1 sdb1 sdc1 sde1
D0 D1 D2 P P D0 D1 D2
D4 D5 P D3 D5 P D3 D4
D8 P D6 D7 D7 D8 P D6
P D9 D10 D11 D9 D10 D11 P
D12 D13 D14 P P D12 D13 D14
在使用mdadm创建RAID阵列时,可以使用--layout=
Left-asymmetric:对照上面的左非对称算法的数据分布实例,该算法描述的数据分布是,在阵列上从第一个阵列段到最后一个阵列段依次的存入数据块,与此同时,奇偶校验块P也从最后一个阵列段到第一个阵列段依次写入。
Right-asymmetric:数据块在阵列上从第一个阵列段到最后一个阵列段依次的存入数据块,与此同时,奇偶校验块P也从第一个阵列段到最后一个阵列段依次写入。
Left-symmetric:这个是RAID5默认的分布算法,也是对于读请求性能最佳的数据分布机制。奇偶校验信息P从最后一个阵列段到第一个阵列段依次写入。数据块从左向右写,且每行的数据块都先在校验块P后面开始写,直到写满。
Right-symmetric:奇偶校验信息P从第一个阵列段到最后一个阵列段依次写入。数据块从左向右写,且每行的数据块都先在校验块P后面开始写,直到写满。
4.07 RAID5数据更新的开销:
对于RAID5来说,每次数据更新需要如下4次I/O操作:
-从磁盘上读出需要更新的某个数据;
-更新该数据,但是此时奇偶校验信息还没更新过来;
-读出其他块的数据并计算出校验信息;
-写回更新后的信息和校验信息;
RAID5的数据更新开销相对较大,以上4次I/O操作对于读写操作频繁的应用是致命,其性能的下降被操作系统层强大的cache所掩盖了,对于性能的下降感觉不明显。
4.08 RAID6双份校验卷:
RAID6即带有双份分布式奇偶校验信息的块级别条带卷。它与RAID5很相似,但是比RAID5多设了一个校验位,也就是存储了两份的校验信息。所以RAID6阵列最少需要4块磁盘。
由于RAID6在进行写操作时需要计算两个校验码,所以其写性能较RAID5要差,但是容错能力却有了大大的提升。RAID6可以允许2块以上的磁盘出现问题,当磁盘损坏时,阵列进入降级模式,直到阵列修复后才会取消降级保护模式。
RAID6的磁盘利用率:(1-2/N)*100% (N为磁盘数)
RAID6配置实例:
# mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sd[abcd]1
4.09 RAID6的校验和数据分布:
上图是RAID6的数据块分布图,了解RAID6的关键在于了解其如何在损坏2个以上的磁盘时依然保证数据的完整性。如图Stripe1中,Device1和Divice2上保存了数据块,Device3和Device4上则是校验信息。Device3的校验信息可以由Device1-3计算所得,Device4的校验信息可以由Device2-4计算所得。
当Device1和Device2损坏时,Device4上的校验信息就可以结合Device3和Device4来计算出Device2上的数据,Device1则利用Device2和3来计算,实现数据的冗余校验,保证数据的完整性。
4.10 RAID10阵列卷:
RAID10是一种嵌套的RAID阵列,结合了RAID1和RAID0的特点,既有RAID1的高容错能力,也具有RAID0的高性能。RAID10需要4块及以上个磁盘。
RAID10磁盘利用率:(1/N)*100% (N为磁盘数)
以下是一个RAID10配置实例:
磁盘sda1和sdb1创建成RAID1阵列,设备为/dev/md0;磁盘sdc1和sdd1创建成RAID1阵列,设备为/dev/md1;再将两个RAID1阵列组合成一个RAID0阵列:
# mdadm -C /dev/md0 --level=1 --raid-devices=2 /dev/sd[ab]1
# mdadm -C /dev/md1 -a yes --level=1 --raid-devices=2 /dev/sda[cd]1
# mdadm -C /dev/md2 -a yes --level=10 --raid-devices=2 /dev/md[01]
查看RAID设备的详细信息:
# mdadm -D /dev/md2
4.11 条带阵列的参数:
调整条带卷的参数对于优化阵列的性能是相当重要的。对于RAID0、RAID5、RAID6阵列主要有Chunk Size和Stride两个重要参数。
Chunk Size是指阵列中在每个物理磁盘上分布的数据块的大小,通常默认为64K,可以根据所提供服务的需求来进行适当的优化。Stride即跨步数,是在为阵列创建文件系统时可以指定的参数,由Chunk Size / Block Size计算所得。
减小Chunk Size的大小意味着文件在存储阵列中被分得更小,增大Chunk Size则可以使得文件保存在一个Chunk中,虽然设置大的Chunk有利于写操作,但是过大的Chunk会使得RAID的读性能不能很好地发挥,所以,盲目地加大Chunk Size有时会有反效果。
4.12 RAID状态信息/proc/mdstat:
/proc/mdstat中保存了当前所有RAID阵列的详细信息,我们可以通过查看该文件来获取RAID的状态信息。可以通过下面这条命令做实时监控:
# watch -n .5 'cat /proc/mdstat' (每隔0.5秒查看一次)
以下是各种状态信息的实例:
Initial sync'ing of a RAID1 (mirror):
Personalities : [raid1]
md0 : active raid1 sda5[1] sdb5[0]
987840 blocks [2/2] [UU]
[=======>.............] resync = 35.7% (354112/987840) finish=0.9min (RAID1修复中。。。)
speed=10743K/sec
-----------------------------------------------------------------
Active functioning RAID1:
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda5[1] sdb5[0]
987840 blocks [2/2] [UU]
unused devices:
-----------------------------------------------------------------
Failed half of a RAID1:
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda5[1](F) sdb5[0]
987840 blocks [2/1] [U_] (该RAID1损坏了一个磁盘)
unused devices:
4.13 详细的RAID状态信息:
要想获取详细的RAID信息,可以使用如下命令:
# mdadm --detail /dev/md0 (--detail可以简写为-D)
/dev/md0:
Version : 00.90.03
Creation Time : Tue Mar 13 14:20:58 2007
Raid Level : raid1
Array Size : 987840 (964.85 MiB 1011.55 MB)
Device Size : 987840 (964.85 MiB 1011.55 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Mar 13 14:25:34 2007
State : clean, degraded, recovering
Active Devices : 1
Working Devices : 2
Failed Devices : 0
Spare Devices : 1
Rebuild Status : 60% complete
UUID : 1ad0a27b:b5d6d1d7:296539b4:f69e34ed
Events : 0.6
Number Major Minor RaidDevice State
0 3 5 0 active sync /dev/sda5
1 3 6 1 spare rebuilding /dev/sdb5
由以上的RAID信息,我们可以看出,这是一个由两个磁盘组成的RAID1阵列,该RAID1状态为Clean、degraded、recovering,即表示阵列数据没有遭到污染,目前进入降级保护模式,且正在处于修复RAID过程中,目前已修复完成60%。
磁盘/dev/sda5处于活跃状态,而/dev/sdb5则正在参与修复,一旦修复完成,RAID将取消降级模式,恢复原有的RAID性能。
4.14 SYSFS接口:
SYSFS即为/sys,是在系统启动后根据系统信息实时更新的文件信息库,这些信息只能查看,不能随意修改,否则可能导致块设备损坏。我们可以通过查看RAID在SYSFS上的信息来更加全面地了解RAID阵列。
# cat /sys/block/mdX/md
通过以上命令可以查看到该阵列保存了以下信息:
Level:指定了RAID阵列的级别;
raid_disks:该阵列所组成的磁盘;
chunk_size (RAID0,5,6,10):对于RAID0,5,6,10则有指定Chunk Size;
component_size:本参数是针对镜像卷的,指定各盘统一的可用容量大小;
new_dev:可写的文件,里面可以用“major:minor”这样的字段来描述要添加到阵列中的新磁盘;
safe_mode_delay:文件内容是一个时间参数,默认是200ms,如果经过了200ms时间没有对阵列有写请求,则该阵列将会被认定为clean状态;
sync_speed_{min,max}:当阵列损坏,进入修复模式的时候,该文件内显示当前阵列修复的速度。单位为kiB/s。
sync_action:用于监控和控制阵列修复重建的过程。里面可以设置为resync、recover、idle、check、repair 5项中的任一项。
Stripe_cache_size:用于为所有的读写操作做同步。增加这个数值可以提升该阵列的读写性能,但是将消耗较多的系统内存。
在阵列信息目录,即/sys/block/mdX/目录中,以上阵列信息保存在以它们命名的文件中,可以如此查看:
# cat /sys/block/mdX/level
4.15 RAID的配置文件:
对于软件级RAID来说,其在操作系统层最重要的配置文件就是/etc/mdadm.conf。这个配置文件用来简化配置RAID阵列的架构,可以使得多个RAID阵列可以共享热备盘,可以通过以下命令创建一个已经存在的阵列的信息:
# mdadm --verbose --examine --scan
配置文件示例:
DEVICE partitions
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=c5dac4d3:2d6b9861:ab54c1f6:27c15a12
devices=/dev/sda2,/dev/sdc2
ARRAY /dev/md1 level=raid0 num-devices=2 UUID=4ed6e3cc:f12c94b1:a2044461:19e09821
devices=/dev/sda1,/dev/sdc1
每个RAID阵列在配置文件中都是以ARRAY开头指定,每个阵列信息包括以下几个参数信息:uuid、super-minor、name、devices、level、num-devices、spares、spare-group、auto、bitmap、metadata等。
4.16 监控RAID:
RAID阵列提供了事件的通知功能,其实就是对RAID阵列状态的监控,在设置对某个RAID阵列做监控之前,首先应确定本机的邮件功能是否可以正常工作。
设置邮件做事件的通知需要在/etc/mdadm.conf中加入相应的参数,如下3个参数:
MAILADDR root@example.com
MAILFROM root@node1.example.com
PROGRAM /usr/sbin/script.sh
其中的PROGRAM参数指的是当事件发生时将执行script.sh这个脚本,如果该阵列中有某部分数据非常重要,那么当磁盘损坏的时候,可以使用这个参数执行脚本,自动地备份重要的数据。
可以通过以下命令测试设置:
# mdadm --monitor --scan --oneshot --test
为了设置的监控生效,必须保证mdmonitor进程正确地运行:
# chkconfig mdmonitor on ; service mdmonitor start
4.17 重新条带化/重塑RAID设备:
重新条带化或重塑RAID阵列其实就是将原来阵列中的数据重新以新的层次排列成新的阵列。当开始重新条带化的时候,阵列的关键信息所在的关键区(Critical Section)将会被重新写入新阵列的架构信息,但是在重写关键区的过程中,一旦遇到系统崩溃或者掉电的情况,原本阵列的关键区信息将会被损毁,导致阵列无法使用。
为了避免关键区数据的丢失,mdadm有以下措施:
1. 关闭对阵列关键区的写操作;
2. 在重新条带化之前备份关键区的信息;
3. 若发生掉电等情况时,可以继续之前的重新条带化;
4. 最后作废备份的关键区信息,回复对关键区的写操作;
Mdadm提供了一个机制用于对重新条带化过程中发生了中断的阵列恢复关键区。
例如为RAID5增加磁盘这样的动作就需要重新条带化,重新条带化和重塑是不一样的概念,重新条带化需要改变关键区的信息,因为整个RAID阵列的底层数据分布和架构都发生了改变,但是重塑却不同,它不会改变阵列的大小(例如Chunk Size等),不会改变关键区信息,重塑发生在磁盘的扇区上,用于对阵列中的磁盘的数据分布进行调整。
4.18 在线拉伸RAID5:
本小节主要讲如何在线拉伸RAID5阵列,即在线地为RAID5增加磁盘数,以实现RAID阵列的容量增长。
在2.6.17和更新的linux内核中,软件级RAID5才能在文件系统在线的情况下为阵列增加磁盘。在增加磁盘之前需要为原阵列中的数据做重塑(Reshaping),RAID5的重塑过程将比较慢,可以通过以下的内核参数优化重塑的速度,这是RAID数据传输的最小值限制,默认是1000:
# echo 25000 > /proc/sys/dev/raid/speed_limit_min
首先先向RAID5阵列添加一块新的磁盘:
# mdadm --add /dev/md0 /dev/hda8
重塑RAID5阵列:
# mdadm --grow /dev/md0 --raid-devices=4
监控重塑的过程和估算重塑完成的时间:
# watch -n 1 'cat /proc/mdstat'
拉伸RAID阵列上的文件系统:
# resize2fs /dev/md0
4.19 关键扇区备份:
重塑操作的第一阶段就是对震了关键区的备份,默认地,关键区将备份到阵列的空闲磁盘上,如果没有空闲磁盘则会备份到内存中,但是关键区备份在内存是不够安全的,一旦发生断电,内存中的关键区备份也将损毁。
可以用以下命令在重塑阵列的过程中将关键区备份到一个文件中:
# mdadm --grow /dev/md0 --raid-devices=4 --backup-file=/tmp/md0.tmp
当磁盘重新条带化完成时,mdadm将自动删除该关键区备份文件。
若在重新条带化对关键区进行操作的时候发生了系统崩溃或掉电的情况,则可以利用关键区备份文件进行恢复,命令如下:
# mdadm --assemble /dev/md0 --backup-file=/tmp/md0.tmp /dev/sd[a-d]
4.20 在RAID5中拉伸磁盘的大小:
本小节要讲的是如何将一个RAID5阵列中的每一个磁盘都替换成更大的磁盘,或者更换老化的磁盘,做这样的拓展的操作思路是这样的,首先在阵列中停用某块磁盘,然后把磁盘拆下来,换上一个更大容量的新磁盘,将新磁盘添加到阵列中,此时将进行RAID的修复动作,等到修复完成时,再用以上的方法替换掉其余两块磁盘,至此,RAID阵列中的全部磁盘都换成了大容量的新磁盘。下一步是拉伸RAID阵列,之后是拉伸RAID上的文件系统。
值得注意的时,在新磁盘还没有完成数据修复之前,千万不要急着停用下一块磁盘,我们知道,RAID5阵列坏了2个磁盘便彻底损坏了。
停用RAID5阵列中的/dev/vg0/disk1:
# mdadm --manage /dev/md0 --fail /dev/vg0/disk1 --remove /dev/vg0/disk1
将新磁盘添加到RAID5阵列:
# mdadm --manage /dev/md0 --add /dev/vg0/disk2
监控数据修复的过程:
# watch -n 1 'cat /proc/mdstat'
当RAID5阵列中的全部磁盘都被替换成了新磁盘,此时可以将RAID阵列空间拉伸到最大:
# mdadm --grow /dev/md0 --size=max
拉伸RAID5上的文件系统:
# resize2fs /dev/md0
4.21 在RAID设备中共享热备盘:
共享热备盘应用挺广泛的,硬件级的RAID也提供了这样的功能,共享热备盘就是指多个RAID阵列可以共享一块热备盘,而不需要为每个阵列都分配热备盘,这样可以节省成本,又不会影响RAID的使用。
在企业级应用中,你的热备盘数量应该大于等于你阵列的数量,才能保证足够的可靠性。
首先应该将当前的RAID信息刷新到配置文件中:
# mdadm --verbose --examine --scan >> /etc/mdadm.conf
选择一个共享热备盘组的名字(例如share1)。
在需要加入共享热备盘的阵列的阵列信息后加入如下参数:
Spare-group=share1
添加了热备盘之后,就可以通过停用某块磁盘来测试热备盘是否成功设置:
# mdadm /dev/md0 --fail /dev/sda1 --remove /dev/sda1
当停用并移除了/dev/sda1时,热备盘自动地加入到该阵列并自动地开始阵列的修复工作。
热备盘的设置也可以在RAID震了创建的时候设置:
# mdadm -C /dev/md0 -l 5 -n 4 -x 1 -c 64 spare-group=share1 /dev/sd[a-e]1
其中,-x指定了热备盘的数量,spare-group=share1指定了加入到的共享热备盘组。
4.22 重命名RAID阵列:
当我们需要把本系统中的RAID阵列移植到另一个系统中,但是该系统中已经存在了同名的RAID阵列时,我们就需要先对本系统的RAID进行重命名。
以下我们将把/dev/md0重命名为/dev/md3。
首先我们要了解RAID由哪些磁盘组成:
# mdadm -D /dev/md0
停止RAID阵列:
# mdadm --stop /dev/md0
将该RAID阵列重新组装:
# mdadm --assemble /dev/md3 --super-minor=0 --update=super-minor /dev/sda5 /dev/sdb5
此处的--super-minor=0是指定了原来的命名信息(参照/dev/md0),--update=super-minor则是指更新阵列中的超级快信息。
4.23 RAID的Write-intent位图:
RAID的位图功能是用来记录哪个RAID的区域自从上一次同步之后发生了改变,RAID阵列会周期性地将这些信息写入到位图中。
当RAID阵列在做同步的时候发生了掉电,那么在重新启动阵列时将需要一次完全的数据同步,如果设置了Write-intent位图,则可以知道哪些是没有同步的,就不需要完全的数据同步,就可以极大地减少修复的时间。
如果将一个RAID阵列中的某块磁盘停用移除,再重新添加到该RAID阵列时,RAID阵列将重新为其做数据同步,但是如果该阵列设置了Write-intent位图,重新添加进去后则只需要简单的同步便实现了修复。
4.24 在RAID1开启Write-intent位图功能:
位图文件在创建它之前是没有存在的。Internal bitmap是存放在阵列的metadata中的,External bitmap是存放在磁盘上的位图文件,该文件必须保存在除自身RAID阵列以外的介质上。
在为RAID阵列开启Write-intent位图功能之前,首先要保证阵列已经同步了的且superblock超级块信息是完好的。
保证RAID阵列处于良好的状态:
# mdadm --detail /dev/mdX
添加一个Internal bitmap位图:
# mdadm /dev/md0 --grow --bitmap=internal
监控位图的状态:
#watch -n 1 'cat /proc/mdstat'
关闭位图功能:
# mdadm /dev/md0 --grow --bitmap=none
4.25 在RAID1开启Write-behind位图功能:
该位图功能默认是--write-behind=256,即每当有256个对阵列的写请求时才进行RAID阵列的同步写操作。
该功能对于利用RAID1实现异地备份是非常有效的,RAID1的异地备份常常是通过光纤或高速以太网来使本地和异地的磁盘形成RAID1镜像备份,但是因为网络的延时,若每次写入数据时都要进行数据的同步则大大影响了写入的性能,设置了这个位图功能则可以使得达到一定的写请求时再进行同步操作,可以提高阵列的写性能。
# mdadm /dev/md0 --grow --write-behind=512
4.26 RAID的错误处理和数据一致性检查:
RAID阵列总是被动地检查坏道,RAID的检查可以修复逻辑层的坏道,但却不能修复物理坏道。
可以通过以下命令开始坏道的检查:
# echo check >> /sys/block/mdX/md/sync_action
监控数据一致性检查的过程:
# watch -n 1 'cat /proc/mdstat'