在linux中,可以使用软件的方法来实现raid,当然,这种软件方法的实现比不了服务器自带的阵列卡,一般X86服务器上(比如dell R720)上面就可以配一块硬件阵列卡,还可以加缓存,在回写模式下可以加速数据的读写,还有电池,可以保障缓存中的数据在突然断电情况下不丢失。而软raid没有加速和保护的功能,但确实能实现raid。比如常见的raid 0、1、5、10。下面简单介绍一下这几种raid的原理。

一、JBOD,这种模式其实不是一种真正的raid.但它能把多个物理磁盘的容量堆叠起来,让它们形成一个逻辑的磁盘,数据在写满一个盘再转到下一个盘。但如果磁盘损坏的话,数据就丢失了,这种模式在企业中使用较少

二、raid 0,这是一种不包含数据冗余的raid.至少使用两块硬盘来实现,它不会造成磁盘容量的减少,并且能加速磁盘的读写速度,但是数据的安全得不到保障,如果阵列中的一块硬盘故障,整个阵列中的数据都丢失了。这是一种条带化的技术,比如一个文件100M,而每个条带大小为32K,那么它会以32K为一个单位来分开存储,即每在物理磁盘0上面写32K数据以后,再到物理磁盘1上写32K数据,依此类推。

三、raid 1,这是一种镜像的raid技术,至少2块硬盘,磁盘使用率为50%。因为是镜像的,所以磁盘坏一块没有关系,一般用来安装操作系统,读取速度增加,写入速度与一块磁盘持平或者稍慢

四、raid 5,带有校验的条带化raid。raid 5没有专门的检验盘,它把数据和检验数据每个盘写一部分,依此类推。磁盘使用率为(n-1)/n,即会少一块磁盘的容量,读写的速度都提高了。在企业中,此技术也使用得比较多,如果损坏一块磁盘,可以使用其他磁盘的校验信息来恢复数据

五、raid 10,即raid 1与raid 0的组,有人把raid 10和raid 01说成一种,其实它们也稍有一同,10指的是把这些物理磁盘的做成两个raid 1,再把两个raid 1 组成成一个raid 0。除了磁盘使用率只有一半以后,读、写速度都提高了,然后因为有镜像,数据安全得到保障。


使用mdadm来实验软raid

在我的实验环境中,有五块磁盘,sda安装了linux,sdb-sde用来做软件raid。

mdadm的用法

语法:# mdadm  -C  -v  /dev/mdX  -lY  -nZ  -cK  RAID成员

-C 即创建一个raid,此种方法将raid的信息写入到superblock中,如果将来重装或者重新启用raid,非常方便

-v 显示详细信息

/dev/mdX,即指定这个设备为mdX,X一般取值从0-127

-l 指定raid的级别,比如0 1 5

-n  指定一共有几个设备来构建这个raid,在linux中可以使用磁盘或者一个分区来做为源盘

-c 指定条带的大小,默认为64K

后面跟着的是组成raid的磁盘的成员,这些成员数目要等于在-n后面指定的数

-x 如果是做有检验的raid,比如5,可以指定热备盘,即一个在raid中已经被使用磁盘出现故障后,可以自动替换进raid中


在本例中,我使用三个磁盘做一个raid 5,然后把/dev/sde做成一个热备盘,指定条带大小为32K

然后把raid 中的/dev/sdd模拟故障,看/dev/sde能否自动替换进去,再查看数据的完整性

[root@Centos ~]# mdadm -C /dev/md0 -v -a yes -l 5 -c 32K -n 3 /dev/sd{b,c,d} -x 1 /dev/sde

mdadm: layout defaults to left-symmetric

mdadm: layout defaults to left-symmetric

mdadm: size set to 2096096K

mdadm: Defaulting to version 1.2 metadata

mdadm: array /dev/md0 started.


接下来使用fdisk -l来查看是否有md0这个设备

Disk /dev/md0: 4292 MB, 4292804608 bytes

2 heads, 4 sectors/track, 1048048 cylinders

Units = cylinders of 8 * 512 = 4096 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 32768 bytes / 65536 bytes

Disk identifier: 0x00000000


再接下来,我们查看一下这个md0的相关信息

[root@Centos ~]# mdadm -D /dev/md0

[root@Centos ~]# mdadm -D /dev/md0

/dev/md0:

      Version : 1.2

Creation Time : Wed Mar  522:43:51 2014

  Raid Level : raid5

   Array Size : 4192192 (4.00 GiB 4.29 GB)

Used Dev Size : 2096096 (2047.31 MiB 2146.40 MB)

 Raid Devices : 3

Total Devices : 4

  Persistence : Superblock is persistent


  Update Time : Wed Mar  5 22:44:162014

        State : clean

Active Devices : 3

Working Devices : 4

Failed Devices : 0

Spare Devices : 1


       Layout : left-symmetric

 Chunk Size : 32K


         Name : Centos.abc.com:0  (local tohost Centos.corun.com)

         UUID : 5e6594f3:3ad4713d:1476a99a:3a65e231

       Events : 18


  Number   Major   Minor  RaidDevice State

     0       8       16       0      active sync   /dev/sdb

     1       8       32       1      active sync   /dev/sdc

     4       8       48       2      active sync   /dev/sdd


     3       8       64       -     spare  /dev/sde



接下来,我们对/dev/md0进行分区、格式化、挂载

fdisk /dev/md0

创建一个主分区,大小为全部大小,也就是说为4G

fdisk -l  显示这个已经创建的分区名称,还有使用命令显示这个分区的UUID


Disk /dev/md0: 4292 MB, 4292804608 bytes

2 heads, 4 sectors/track, 1048048 cylinders

Units = cylinders of 8 * 512 = 4096 bytes

Sector size (logical/physical): 512 bytes /512 bytes

I/O size (minimum/optimal): 32768 bytes /65536 bytes

Disk identifier: 0x327efd65


  Device Boot      Start         End     Blocks   Id  System

/dev/md0p1              17     1048048    4192128   83  Linux


[root@Centos dev]# blkid /dev/md0p1

/dev/md0p1: UUID="5876338a-afca-44e9-b9ce-1cee32c22026" TYPE="ext3"



[root@Centos dev]# e2label /dev/md0p1 liuqing

[root@Centos dev]# blkid /dev/md0p1

/dev/md0p1: UUID="5876338a-afca-44e9-b9ce-1cee32c22026" TYPE="ext3" LABEL="liuqing"


挂载这个文件系统到/mnt

mount UUID=5876338a-afca-44e9-b9ce-1cee32c22026 /mnt


在/mnt这个目录中,复制几个文件进来,分别是/etc/inittab /etc/fstab /etc/passwd

[root@Centos dev]# cd /mnt

[root@Centos mnt]# cp /etc/passwd .

[root@Centos mnt]# cp /etc/inittab .

[root@Centos mnt]# cp /etc/fstab .

[root@Centos mnt]# ls

fstab  inittab  lost+found  passwd

[root@Centos mnt]#


最后面这一部分是要模拟磁盘故障,我们将/dev/sdd模拟故障

[root@Centos mnt]# mdadm /dev/md0 --fail /dev/sdd  --remove /dev/sdd

mdadm: set /dev/sdd faulty in /dev/md0

mdadm: hot removed /dev/sdd from /dev/md0

[root@Centos mnt]# mdadm --detail /dev/md0

/dev/md0:

       Version : 1.2

 Creation Time : Wed Mar  5 22:43:51 2014

    Raid Level : raid5

    Array Size : 4192192 (4.00 GiB 4.29 GB)

 Used Dev Size : 2096096 (2047.31 MiB 2146.40 MB)

  Raid Devices : 3

 Total Devices : 3

   Persistence : Superblock is persistent


   Update Time : Wed Mar  5 23:04:46 2014

         State : clean

Active Devices : 3

Working Devices : 3

Failed Devices : 0

 Spare Devices : 0


        Layout : left-symmetric

    Chunk Size : 32K


          Name : Centos.corun.com:0  (local to host Centos.corun.com)

          UUID : 5e6594f3:3ad4713d:1476a99a:3a65e231

        Events : 38


   Number   Major   Minor   RaidDevice State

      0       8       16        0      active sync   /dev/sdb

      1       8       32        1      active sync   /dev/sdc

      3       8       64        2      active sync   /dev/sde