![]() 摘 要:本文详细介绍了Linux下Software RAID的实现,进行了性能分析,对数据的安全性及访问的效率都进行了深入的讨论。 关键词:Linux;RAID; 磁盘镜像;性能分析 一 前言 RAID是Redundant Arrays of Independent Disks的简称,中文为廉价冗余磁盘阵列。明确标准级别分别是0、1、2、3、4、5等,RAID为使用者降低了成本、增加了执行效率,并提供了系统运行的稳定性。RAID1又称为磁盘镜像,原理是在两个硬盘之间建立完全的镜像,即所有数据会被同时存放到两个物理硬盘上,当一个磁盘出故障时,仍可从另一个硬盘中读取数据,因此安全性得到保障。但系统的成本大大提高。 本人一直维护一台Linux服务器,提供WEB、FTP、TELNETD等服务。由于管理不善,未给服务器接UPS电源,某日突然停电,造成服务器硬盘物理损伤,数据全部丢失。因为学业较重,服务器数据备份不及时,虽然马上重新恢复系统,提供服务,但是仍然丢失了很多重要数据。痛定思痛,决定给服务器做两块硬盘的RAID1备份,以防此类事故再次发生。由于手头有空余硬盘,所使用的又是Redhat Linux 9.0操作系统,为了节约成本,选择了软件实现RAID1。 二 具体实现 1 服务器配置服务器型号为IBM的Netfinity 5100,具体配置是:CPU:Pentium III XeonTM 900MHz;内存:512M;磁盘控制器:U2SCSI;网络:内置10/100M以太网;硬盘:IBM SCSI 36G 一块。装Redhat Linux 9.0操作系统,主要为同学提供WEB服务,后台还有数据库服务Mysql。 现在用手头空余的IBM SCSI 36G和以前的那块硬盘一起做成RAID1。制作过程首先要保证原始数据不丢失,并在不重新安装系统的基础上。 服务器磁盘分区情况见表1:
DEVICE MOUNTPOINT SIZE /dev/sda1 / 6000MB /dev/sda2 /boot 200MB /dev/sda3 /var 15000MB /dev/sda4 SWAP 1024MB 表1 服务器磁盘分区 2 前期准备工作制作RAID之前,需要对系统进行一些测试,看其是否支持RAID磁盘分区,及从RAID分区启动。需要进行以下检测: (1) 需要检查内核是否支持自动识别RAID设备。 (2) 在创建RAID分区时必须使用持久化设备类型。 (3) 用来制作RAID分区的磁盘分区类型必须被设置成0xFD(可以使用fdisk程序,并设置磁盘分区类型为“fd”)。 如果是默认安装系统,并直接运行服务,之前没有做过RAID的机器,以上都是默认不支持的,因此你必须完成以下的预备工作: (1) 在Redhat Linux下有一个非常有用的命令:mkinitrd,该命令可以创建一个镜像,在启动的时候自动加载你所需要加载的内核模块。使用方式如下: mkinitrd –with=<module> <ramdisk name> <kernel> 具体例子: mkinitrd –preload raid1 –with=raid1 raid-ramdisk 2.2.5-22(注:raid-ramdisk 2.2.5-22是启动时使用的initimg) 这样就能保证在启动的时候,内核自动识别RAID设备,并能够把根目录挂载到RAID磁盘分区上头。这样就保证了,能让两块硬盘完全一样,当一块硬盘出故障时,能从令一块硬盘直接启动。 (2) 要创建RAID分区时使用持久化设备类型,就需要在RAID配置文件中加上以下语句: Persistent-superblock 1 (3) 使用fdisk程序,能够修改磁盘分区的类型,把所有的Linux分区都改成fd类型,此修改不会伤及磁盘分区上的数据。 3 具体步骤(1) 用Redhat的安装启动盘启动机器,在启动前需要选择启动模式,输入:linux rescue,进入救援模式,需要注意的是,不要选择挂载磁盘分区,磁盘分区必须在没有挂载的情况下,才能做成RAID。 (2) 用fdisk对新硬盘进行分区,保证新硬盘的每个分区的大小都和老硬盘分区大小都相近。具体步骤就不详细介绍了。需要注意的是,在新硬盘上头最好也分处SWAP分区,如果老硬盘出故障,需要从新硬盘启动,但是新硬盘又没有SWAP分区,这样对系统性能会有影响。 (3) 创建RAID配置文件。该文件默认是没有的,需要自己创建,默认的配置文件保存在/etc目录下,文件名为raidtab,详细见表2。 (4) 创建md设备,即RAID设备,执行以下命令: (rescue)# mknod /dev/md0 b 9 0 (rescue)# mknod /dev/md1 b 9 0 (rescue)# mknod /dev/md2 b 9 0 (5) 开始创建RAID设备,使用mkraid命令,执行如下: (rescue)# mkdir -really-force /dev/md0 (rescue)# mkdir -really-force /dev/md1 (rescue)# mkdir -really-force /dev/md2 注意,在执行完以上一条命令的时候,可以使用命令:cat /proc/mdstat 察看制作RAID分区的完成程度,一般10G的分区大概需要20-30分钟,视机器性能而定。当制作完一个分区,才能继续制作下一个RAID分区,不要同时执行两条命令。
raiddev /dev/md0 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 chunk-size 4 persistent-superblock 1 device /dev/sda1 raid-disk 0 device /dev/sdb1 raid-disk 1 raiddev /dev/md1 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 chunk-size 4 persistent-superblock 1 device /dev/sda2 raid-disk 0 device /dev/sdb2 raid-disk 1 raiddev /dev/md2 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 chunk-size 4 persistent-superblock 1 device /dev/sda3 raid-disk 0 device /dev/sdb3 raid-disk 1
表2 /etc/raidtab文件 (6) 挂载做好的RAID磁盘分区,对应的分区和系统目录的关系是:md0对应根目录,md1对应/boot目录,md2对应/var目录。挂载好分区后,用chroot命令切换到根目录下。 (7) 接下来你需要修改两个配置文件:/etc/fstab和/boot/grub/grub.conf。 /etc/fstab文件是系统分区的配置文件,修改它的目的是在启动的时候挂载各个RAID磁盘分区。修改后的/etc/fstab文件见表3:
/dev/md0 / ext3 defaults 1 1 /dev/md1 /boot ext3 defaults 1 2 /dev/md2 /var ext3 defaults 1 2 /dev/sda4 swap swap defaults 0 0 表3 /etc/fstab文件
/boot/grub/grub.conf文件是启动时候的配置文件,修改它的目的是在启动的时候能找到RAID磁盘的根目录,并找到启动的镜像文件。修改后的/boot/grub/grub.conf见表4: # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/md1 # initrd /initrd-version.img #boot=/dev/sda1 default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux AS (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=/dev/md1 initrd /initrd-2.6.9-5.EL.img 表4:/boot/grub/grub.conf文件 (8) 制作完RAID磁盘分区后,由于做成一个RAID分区的两个物理磁盘分区大小不可能完全一样,一般都会偏小,因此要重新调整文件系统的大小。以/dev/md0为例,需要执行以下命令: (rescue)# e2fsck -f /dev/md0 (rescue)# resize2fs /dev/md0 对其他的RAID磁盘分区也执行同样的命令,然后你就可以重新启动机器了,如果顺利的话,机器就运行在RAID1状态下了。 (9) 收尾工作,你可能希望机器可以从任何一快硬盘启动,因为如果主硬盘出故障,只需要重新启动,就可以继续提供服务,因此,你必须在辅硬盘上把启动程序grub重新安装一遍。 三 分析 1 安全性分析在使用了RAID磁盘分区后,只要是对该类分区进行的数据写操作,数据会被写到两块硬盘的对应分区上,两块硬盘保持同步更新。这样就保证了数据的安全性,也无需经常备份数据了。制作过程中使用的是一块空余硬盘,RAID1的实现是系统提供的软件方式,节省了RAID卡的开销,以最小的成本实现了我们的目标。 2 效率分析在选择RAID1方式的时候,一直担心它的效率问题,RAID1只提供数据冗余备份,RAID0能提供较高的数据访问速度,如果选择实现RAID0+1的话,至少需要4块硬盘。成本将大大提高。在制作完RAID1后,马上进行了磁盘读些测验,分析性能。 进行磁盘性能测验是使用Linux自带的工具hdparm。该命令的测试原理是往磁盘分区上反复读写大量数据,并计算时间,以此来测试磁盘性能。在系统下执行该命令,则可以得到硬盘数据读写的测验结果。实验数据见表5:
[root@panda ~]# hdparm -Tt /dev/sda1
/dev/sda1: Timing cached reads: 696 MB in 2.01 seconds = 346.67 MB/sec Timing buffered disk reads: 154 MB in 3.01 seconds = 51.10 MB/sec [root@panda ~]# hdparm -Tt /dev/sdb1
/dev/sdb1: Timing cached reads: 796 MB in 2.01 seconds = 396.28 MB/sec Timing buffered disk reads: 146 MB in 3.03 seconds = 48.21 MB/sec [root@panda ~]# hdparm -Tt /dev/md0
/dev/md0: Timing cached reads: 824 MB in 2.01 seconds = 410.22 MB/sec Timing buffered disk reads: 130 MB in 3.00 seconds = 43.31 MB/sec 表5 硬盘性能测验数据 从上表的实验数据看出,第一行数据是对主硬盘性能测验的数据,从硬盘cache读写数据的速度是346.67 MB/sec,从硬盘盘面上读写数据的速度是51.10 MB/sec;第二行是对辅硬盘性能测验的数据,从硬盘cache读写数据的速度是396.28 MB/sec,从硬盘盘面上读写数据的速度是48.21 MB/sec;第三行是对RAID磁盘分区性能测验的数据,从cache读写数据的速度是410.22 MB/sec,从盘面读写数据的速度是43.31 MB/sec。可以看出从cache读写数据的速度有所提高,从盘面读写数据的速度有所下降。总的来说,差距不是太大,在可以接受的范围内。 |
|