Linux 下如何用mdadm实现软件RAID

转载:http://blog.sina.com.cn/s/blog_6a717d640101a89u.html

数据在现今企业中占有重要的地位,数据存储的安全性有而是人们使用计算机要注意的重要问题之一.通常情况下人们在服务器端采用各种冗余磁盘阵列RAID技术

来保护数据,中高档的服务器一般都提供了昂贵的硬件RAID控制器,但是很多中小企业没有足够的经费承受这笔开销.我们有没有方法可以通过软件来实现RAID呢?

实际上在Linux下可以通过软件来实现硬件的RAID功能,这样既节省了投资,又能达到很好的效果.今天就由我为大家介绍如何在网络环境中实现带有一块Spare-disk的软RAID1(数据镜像)阵列.

小提示:什么是RAID1(数据镜像)?RAID1是比较可靠的数据存储方式,每一个磁盘都具有一个对应的镜像盘.对任何磁盘的数据写入都会被复制镜像盘 中;系统可以从一组镜像盘中的任何一个磁盘读取数据,也就是说同一个数据会被重复写入两次,这样的磁盘镜像肯定会提高系统成本.因为我们所能使用的空间只 是所有磁盘容量总和的一半.

由于本文中会使用mdadm软件,而该软件一般情况下都会集成在Redhat linux中,所以可以直接使用.如果系统中没有安装可以到http://www.cse.unsw.edu.au/~neilb/source /mdadm来下载mdadm-xxx.tgz进行编译安装,也可以到http://www.cse.unsw.edu.au/~neilb /source/mdadm/rpm下载mdadm-xxx.i386.rpm直接安装.

作为一个面向服务器的网络型操作系统,Linux对数据的安全和存取速度给予了高度重视,从2.4版内核开始Linux就实现了对软件RAID的支 持,这让我们可以不必购买昂贵的硬件RAID设备,就能享受到增强的磁盘I/O性能和可靠性,进一步降低了系统的总体拥有成本.下面就让我们看一个

Redhat Linux AS 4下的软件RAID配置实例吧.

● 操作系统为RedHat Linux AS 4;

● 内核版本为2.6.9-5.EL;

● 支持RAID0、RAID1、RAID4、RAID5、RAID6;

● 五块36GB SCSI接口的磁盘,其中RedHat AS 4安装在第一块磁盘,其它四块组成RAID 5用来存放Oracle数据库.

在RedHatAS4下实现软件RAID是通过mdadm工具实现的,其版本为1.6.0,它是一个单一的程序,创建、管理RAID都非常方便,而且也很 稳定.而在早期Linux下使用的raidtools,由于维护起来很困难,而且其性能有限,在RedHat AS 4下已经不支持了.

实现过程

一.几种常用RAID的简介

RAID是冗余磁盘阵列(Redundant Array of InexpensiveDisk)的简称.它是把多个磁盘组成一个阵列,当作单一磁盘使用.它将数据以分段(striping)的方式分散存储在不同的磁 盘中,通过多个磁盘的同时读写,来减少数据的存取时间,并且可以利用不同的技术实现数据的冗余,即使有一个磁盘损坏,也可以从其他的磁盘中恢复所有的数 据.简单地说,其好处就是:安全性高、速度快、数据容量大.

磁盘阵列根据其使用的技术不同而划分了等级,称为RAID level,目前公认的标准是RAID0~RAID 5.其中的level并不代表技术的高低,RAID 5并不高于RAID 4 ,RAID 0并不低于RAID 2,至于选择哪一种RAID需视用户的需求而定.下面分别对常用的RAID 0、RAID 1、RAID 5进行简单的介绍.

1.RAID 0

特点:它是将多个磁盘并列起来,成为一个大硬盘.在存取数据时,将数据按磁盘的个数来进行分段,然后同时将这些数据写进这些盘中.在所有的级别中,RAID 0的速度是最快的.但没有数据冗余,阵列中任何一个磁盘坏掉,意味着所有数据丢失.

磁盘利用数:n(假设有n个磁盘).

配置条件:最低两块磁盘,且分区大小尽量相同.

应用领域:对高磁盘容量及高速磁盘存取有特殊需求,而又不计较其高故障率的工作.当然,如果你正在使用集群,RAID 0 无疑是提高磁盘I/O性能的最好方法,因为在这种情况下,你就不用担心冗余的问题了.

2.RAID 1

特点:使用磁盘镜像(disk mirroring)的技术,在一个磁盘上存放数据的同时也在另一个磁盘上写一样的数据.因为有了备份磁盘,所以RAID1的数据安全性在所有的RAID 级别上来说是最好的.尽管其写入数据的速度比较慢,但因其数据是以分段的方式作储存,因而在读取时,它几乎和RAID0有同样的性能.

磁盘利用数:n/2.

配置条件:最低两块磁盘,且分区大小尽量相同.

应用领域:数据库、金融系统等一些对数据有着高可靠性要求的领域.再者就是系统中写数据量比较少,而读数据量又比较多的情况下可以采用这一模式.

3.RAID 5

特点:以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位,而是将数据段的校验位交互存放于各个磁盘上.这样,任何一个磁盘损坏,都可以根据其他磁盘上的校验位来重建损坏的数据.并行读写数据,性能也很高.

磁盘利用数:n-1.

配置条件:最低三块硬盘,且分区大小尽量相同.

应用领域:适合于事务处理环境,如售票处、销售系统等.

二、模式

mdadm有6种模式,前两种模式:Create、Assemble用于配置和激活阵列;Manage模式用于操作在活动阵列中的设备;Follow或 Monitor模式允许管理员对活动阵列配置事件提醒和动作;Build模式用于对旧阵列使用旧版本的md驱动;还有Grow模式可以扩展阵列;剩下的是 Misc模式,它包括对多种内部的任务和没有指定特殊模式的一些操作.

三、部署

1、准备磁盘

只能使用Sofware RAID格式的磁盘才能组成阵列,所以,首先我们要把做好磁盘格式.正如上面提到的,除了系统盘sda外,我们需要对sdb、sdc、sdd进行操作

a)对sdb进行分区

fdisk /dev/sdb

Linux 下如何用mdadm实现软件RAID

分区前状态:

Linux 下如何用mdadm实现软件RAID

n,划分区:

Linux 下如何用mdadm实现软件RAID

t,修改分区格式为fd:

Linux 下如何用mdadm实现软件RAID

w,保存:

Linux 下如何用mdadm实现软件RAID

b)同样的方法,对sdc、sdd进行分区和保存

最后状态如下:

Linux 下如何用mdadm实现软件RAID

2、创建阵列

mdadm可以支持LINEAR、RAID0(striping)、 RAID1(mirroring)、 RAID4、RAID5、RAID6和MULTIPATH的阵列模式.

创建命令格式如下:

mdadm [mode] [options]

例如:创建一个RAID 0设备:

mdadm –create –verbose /dev/md0 –level=0 –raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

–level表示创建的阵列模式,–raid-devices表示参与阵列的磁盘数量.

Linux 下如何用mdadm实现软件RAID

也可以这样表达,意思是一样的:

mdadm -Cv /dev/md0 -l0 -n3 /dev/sd[bcd]1

还可以增加-c128参数,指定chunk size为128K(默认64K) –spare-devices是加入热备.

3、配置文件

mdadm不采用/etc/mdadm.conf作为主要配置文件,它可以完全不依赖该文件而不会影响阵列的正常工作.

该配置文件的主要作用是方便跟踪软RAID的配置.对该配置文件进行配置是有好处的,但不是必须的.推荐对该文件进行配置.

通常可以这样来建立:

echo DEVICE /dev/sd[bcd]1 > /etc/mdadm.conf

mdadm -Ds>> /etc/mdadm.conf

mdadm –detail –scan >> /etc/mdadm.conf

4、格式化阵列

后续,只要你把/dev/md0作为一个单独的设备来进行操作即可:

mkfs.ext3 /dev/md0

mkdir /mnt/test

mount /dev/md0 /mnt/test

5、若要开机自动挂载,请加入/etc/fstab中:

/dev/md0       /mnt/tes       auto defaults   0 0

四、监控和管理

mdadm可以非常方便的对阵列进行监控和管理的操作,也包括了停止和启动阵列等常用维护.

1、查看

cat /proc/mdstat

可以查看所有使用md驱动的阵列的状态:

Linux 下如何用mdadm实现软件RAID

mdadm –detail /dev/md0

查看指定阵列的详细信息(-D):

Linux 下如何用mdadm实现软件RAID

2、停止

mdadm -S /dev/md0

停止指定阵列,并释放磁盘(–stop):

Linux 下如何用mdadm实现软件RAID

※注意:停止后,原组成阵列的磁盘将处于空闲状态,一旦吾操作这些磁盘,将不能再重启激活原阵列.

3、启动

mdadm -A /dev/md0 /dev/sd[bcd]1

启动指定的阵列,也可理解为讲一个新阵列装配到系统中(–assemble):

Linux 下如何用mdadm实现软件RAID

若你已经在上面配置了/etc/mdadm.conf文件,也可用-s查找:

mdadm -As /dev/md0

Linux 下如何用mdadm实现软件RAID

4、测试

如果你没有配置/etc/mdadm.conf文件,而且又忘了某磁盘属于那个阵列,则你可以使用检测:(–examine)

mdadm -E /dev/sdb1

Linux 下如何用mdadm实现软件RAID

获得UUID后,也可以这样激活阵列:

mdadm -Av /dev/md0 –uuid=8ba81579:e20fb0e8:e040da0e:f0b3fec8 /dev/sd*

可以看到,只要磁盘没有损坏,这样装配是非常方便的:

Linux 下如何用mdadm实现软件RAID

5、添加及删除磁盘

mdadm可以在Manage模式下,对运行中的阵列进行添加及删除磁盘.常用于标识failed磁盘,增加spare(冗余)磁盘,以及替换磁盘等.

例如:原来状态是:

Linux 下如何用mdadm实现软件RAID

则可以使用–fail指定坏磁盘,并–remove走:

mdadm /dev/md0 –fail /dev/sdc1 –remove /dev/sdc1

Linux 下如何用mdadm实现软件RAID

Linux 下如何用mdadm实现软件RAID

等待同步完成后,结果:

Linux 下如何用mdadm实现软件RAID

※需要注意的是,对于某些阵列模式,如RAID0等,是不能用–fail和–remove的.

Linux 下如何用mdadm实现软件RAID

增加一个新的阵列用磁盘

mdadm /dev/md0 –add /dev/sdc1

Linux 下如何用mdadm实现软件RAID

※需要注意的是,对于某些阵列模式,如RAID0等,是不能用–add的.

6、监控

在Follow或Monitor状态下,可以使用mdadm对阵列进行监控,例如当阵列出现问题的时候,发送邮件给管理员;或者当磁盘出现问题的时候进行自动的磁盘替换.

nohup mdadm –monitor –mail=sysadmin –delay=300 /dev/md0 &

上述定义:没300秒监控一次,当阵列出现错误,会发送邮件给sysadmin用户.由于monitor启动后是不会自动退出的,所以需要加上nohup和&,使之持续在后台运行.

在Follow模式下,是允许共享冗余磁盘的.

例如,我们有两个阵列:/dev/md0、/dev/md1,而/dev/md0里面有一个spare磁盘.当我们在/etc/mdadm.conf中定义类似:

DEVICE/dev/sd*

ARRAY /dev/md0 level=raid1 num-devices=3 spare-group=database

 UUID=410a299e:4cdd535e:169d3df4:48b7144a

ARRAY/dev/md1 level=raid1 num-device=2 spare-group=database

 UUID=59b6e564:739d4d28:ae0aa308:71147fe7

也就是定义一个spare-group组.并运行上面的monitor模式命令.这样,当组成/dev/md1的其中一个磁盘出现问题的时候,mdadm会自动从/dev/md0上移走spare磁盘,并加入/dev/md1中,而不需要人工干预.(请注意,能实现这样工作的,只有在该阵列支持冗余的情况下才能实现,如raid1、raid5等.而对于raid0等阵列模式,是无效的)

五、其他

1、增加spare磁盘

可以通过在创建的时候指定冗余磁盘:

mdadm -Cv /dev/md0 -l1 -n2 -x1 /dev/sd[bcd]1

-x(–spare-devices)参数用于指定冗余磁盘的数量,结果:

Linux 下如何用mdadm实现软件RAID

另外,对于full的阵列(例如已经有2个磁盘的RAID1),则直接使用-add参数,mdadm会自动把冗余的磁盘作为spare disk.

2、删除阵列

mdadm -S /dev/md0

rm /dev/md0

修改/etc/mdadm.conf、/etc/fstab等配置文件,把相关的地方去掉;

最后,用fdisk对磁盘进行重新分区即可.

3、重建阵列

我们也可以在没有fdisk的情况下把使用过,但目前没有属于任何阵列的磁盘划分到新阵列中:

Linux 下如何用mdadm实现软件RAID

确认后即可.

六、附录

mdadm中文man文档

参考资料:

mdadm: A New Tool For Linux Software RAID Management

1.启用阵列 #mdadm -As /dev/md0 -A 启用已存在的阵列 -s 以/etc/mdadm.conf为依据 没有创建mdadm.conf文件,则采用如下方法启用

#mdadm -A /dev/md0 /dev/sd[bc]1

2.停止阵列 #mdadm -S /dev/md0

3.显示阵列详细信息 #mdadm -D /dev/md0

删除RAID中的硬盘

mdadm –stop /dev/md0 

mdadm –remove /dev/md0

mdadm –zero-superblock /dev/sda

上一篇:Design Pattern Explained 读书笔记二——设计模式序言


下一篇:《阿里巴巴Java Spring Boot 2.0开发实战课程》课程视频和例子代码下载