分类: 系统运维
2013-09-02 10:16:03
一 前言
是Redundant Arrays of Independent Disks的简称,中文为廉价冗余磁盘阵列。明确标准级别分别是0、1、2、3、4、5等,为 使用者降低了成本、增加了执行效率,并提供了系统运 行的稳定性。RAID1又称为磁盘镜像,原理是在两个硬盘之间建立完全的镜像,即所有数据会被同时存放到两个物理硬盘上,当一个磁盘出故障时,仍可从另一 个硬盘中读取数据,因此安全性得到保障。但系统的成本大大提高。
本人一直维护 一台服 务器,提供WEB、FTP、TELNETD等服务。由于管理不善,未给服务器接UPS电源,某日突然停电,造成服务器硬盘物理损伤,数据 全部丢失。因为学业较重,服务器数据备份不及时,虽然马上重新恢复系统,提供服务,但是仍然丢失了很多重要数据。痛定思痛,决定给服务器做两块硬盘的 RAID1备份,以防此类事故再次发生。由于手头有空余硬盘,所使用的又是Redhat 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=
具体例子:
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读写数据的速度有所提高,从盘面读写数据的速度有所下降。总的来说,差距不是太大,在可以接受的范围内。