分享

Linux中Software RAID的实现和性能分析

 农夫子oice 2007-05-02
 Linux中Software RAID的实现和性能分析

摘  要:本文详细介绍了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读写数据的速度有所提高,从盘面读写数据的速度有所下降。总的来说,差距不是太大,在可以接受的范围内。

 
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多