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 [email protected]
MAILFROM [email protected]
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'
叶绍琛
2012年1月13日