• raid简介

RAID全称为 Redundent Array of Idependent Disk(独立硬盘冗余阵列)。RAID是通过专门的RAID控制器或适配器把多块硬盘封装起来,在操作系统看来,一个RAID就相当于一个硬盘。raid可以提升硬盘的读写性能,或者提升数据安全性,或者二者兼有之。

  • raid基本概念

条带:raid 0 主要用到的原理。把2个硬盘完全对称的划分为固定大小的条带(chunck),当内核需要对硬盘进行写操作时,raid控制器会先把这些数据切分为和条带同样大小的数据块,然后同时写入2块硬盘。raid 0 会大幅度提高数据的读写性能,尤其对于写性能提升近2倍。然而2块硬盘作为一个整体,任意一个硬盘坏了整个RAID就都不能用了。数据的安全性风险就增大了。

镜像:raid 1 主要用到的原理。2个硬盘完全对等的写入同样的数据,数据的存储位置都是一模一样,就像镜像一样。raid 1 由于同样的数据要写2次,因此写性能相比单个硬盘会有些下降,而读性能提升2倍。raid 1 中,任何一个硬盘坏了,raid都可以继续使用,对操作系统没有影响。数据安全性提升,但对硬盘使用效率比较低。

  • raid分类

目前应用较多的raid包括raid 0、raid 1、raid 4、raid 5、raid 6、raid 0+1、raid 1+0。

raid 0 :前面已经提到过,主要使用条带化技术,将n块硬盘并联起来,从而读写性能都大大提升。

raid 1 :利用镜像技术,使2快硬盘互为备份。其中任意一块坏了,都不影响系统正常运行。系统可用性,数据安全性都大大提升。

raid 4 :使用校验码技术。n块硬盘,前面n-1块作为条带,最为一块盘作为校验码盘。其中任何一块盘损坏,都可以使用算法将数据恢复出来。但如果坏掉两块盘,那么数据就丢失无法恢复了。条带的性能提升较大,校验码盘还要对数据进行计算并存储,成为性能瓶颈。

raid 5 :对raid 4 进行改进,每个硬盘都轮流作为校验码盘。

raid 6 :对raid 5 进行改进,使用2种校验算法,2块校验码盘,即使坏掉2块盘,也可以将数据恢复。

raid 0+1 :先条带后镜像,至少需要4块硬盘。同组内的2个硬盘坏了都可以继续运行,但如果坏的2块硬盘是不同组,数据就无法恢复了。性能、安全性都有很大提升。

raid 1+0 : 先镜像后条带,至少需要4块硬盘。不同组的硬盘各坏掉一个都没事,但是同组互为镜像的2个硬盘都坏了,数据就丢失了。性能、安全性都有很大提升。raid 0+1 和raid 1+0 性能提升上差不多。安全性两个各有千秋,在伯仲之间。如果有一个硬盘损坏,raid 1+0 只需要修复一个硬盘的数据,而raid 0+1 需要修复这一组N个硬盘的数据,因为无法确定是数据在哪一块有损坏,raid 1+0 的修复速度是优于raid 0+1的。从这一点来讲,raid 1+0 更加优越,使用更加广泛。

  • 在LINUX下实现软raid

软raid相对于硬raid来说的。硬raid就是通过硬件的方式来实现raid,就是我们前面说的需要相应的适配器或控制器,来操控数据的分组、读写、校验等。那么软raid就是以软件模拟的方式来实现。linux对设备都是以文件的方式来体现,一个分区在linux中就是一个设备文件,这是linux实现软raid的基础。在内核中有raid的模拟控制算法,通过CPU来模拟计算。软raid实际用途很小,软raid基本都是在一块物理硬盘上实现的,一块盘坏了数据就都用不了了,并不因为做了软raid 1而又所改变。而且软raid并不会提升读写性能,因为硬盘和系统之间的接口还是只有一个,并没有改变。相反,raid因为还要占用CPU,而使得性能有所下降。

通过软raid来模拟raid的实现,以便我们更好的理解raid。

1、使用fdisk命令来建立多个分区

[root@localhost ~]# fdisk /dev/sdb


WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').


Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-3916, default 1): 

Using default value 1

Last cylinder, +cylinders or +size{K,M,G} (1-3916, default 3916): +500M

如此建立5个分区后,将1、2、3、5、6分区类型改为Linux raid autodetect。w保存退出。

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1          65      522081   fd  Linux raid autodetect

/dev/sda2              66         130      522112+  fd  Linux raid autodetect

/dev/sda3             131         195      522112+  fd  Linux raid autodetect

/dev/sda4             196        1305     8916075    5  Extended

/dev/sda5             196         260      522081   fd  Linux raid autodetect

/dev/sda6             261         325      522081   fd  Linux raid autodetect

partprobe通知内核重读分区表。cat /proc/partition看看内核是否已经读到分区。

2、使用mdadm命令建立raid 1+0 

[root@localhost ~]# mdadm -C /dev/md0 -a yes -l 10 -n 4 -x 1 /dev/sda{1,2,3,5,6}

mdadm: Defaulting to version 1.2 metadata

mdadm: array /dev/md0 started.

mdadm -D /dev/md0 查看raid建立信息。

/dev/md0:

        Version : 1.2

  Creation Time : Tue Sep 13 06:29:57 2016

     Raid Level : raid10

     Array Size : 1043456 (1019.17 MiB 1068.50 MB)

  Used Dev Size : 521728 (509.59 MiB 534.25 MB)

   Raid Devices : 4

  Total Devices : 5

    Persistence : Superblock is persistent


    Update Time : Tue Sep 13 06:30:06 2016

          State : clean 

 Active Devices : 4

Working Devices : 5

 Failed Devices : 0

  Spare Devices : 1


         Layout : near=2

     Chunk Size : 512K


           Name : localhost.localdomain:0  (local to host localhost.localdomain)

           UUID : 4a7990f6:00fe2a66:f979de7d:86bc6375

         Events : 17


    Number   Major   Minor   RaidDevice State

       0       8        1        0      active sync   /dev/sda1

       1       8        2        1      active sync   /dev/sda2

       2       8        3        2      active sync   /dev/sda3

       3       8        5        3      active sync   /dev/sda5


       4       8        6        -      spare   /dev/sda6

可以看出磁盘sda1,2,3,5组成raid 1+0,linux识别为md0。有一个空闲磁盘sda6,作为替补。cat /proc/mdstat检查内核是否读取到raid信息。

3、格式化raid,挂载(raid作为一个整体,被系统识别为一个设备,相当于一个硬盘)

[root@localhost ~]# mke2fs -j /dev/md0

mke2fs 1.41.12 (17-May-2010)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=128 blocks, Stripe width=256 blocks

65280 inodes, 260864 blocks

13043 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=268435456

8 block groups

32768 blocks per group, 32768 fragments per group

8160 inodes per group

Superblock backups stored on blocks: 

        32768, 98304, 163840, 229376


Writing inode tables: done                            

Creating journal (4096 blocks): done

Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 30 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

You have new mail in /var/spool/mail/root

继续挂载,挂载成功

[root@localhost ~]# mount /dev/md0 /mnt/

[root@localhost ~]# ls /mnt/

lost+found

4、模拟一个磁盘坏掉,空闲磁盘可以自动顶上,形成一个完整的raid。

[root@localhost ~]# mdadm /dev/md0 -f /dev/sda5

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

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

/dev/md0:

        Version : 1.2

  Creation Time : Tue Sep 13 06:29:57 2016

     Raid Level : raid10

     Array Size : 1043456 (1019.17 MiB 1068.50 MB)

  Used Dev Size : 521728 (509.59 MiB 534.25 MB)

   Raid Devices : 4

  Total Devices : 5

    Persistence : Superblock is persistent


    Update Time : Tue Sep 13 06:45:11 2016

          State : clean 

 Active Devices : 4

Working Devices : 4

 Failed Devices : 1

  Spare Devices : 0


         Layout : near=2

     Chunk Size : 512K


           Name : localhost.localdomain:0  (local to host localhost.localdomain)

           UUID : 4a7990f6:00fe2a66:f979de7d:86bc6375

         Events : 36


    Number   Major   Minor   RaidDevice State

       0       8        1        0      active sync   /dev/sda1

       1       8        2        1      active sync   /dev/sda2

       2       8        3        2      active sync   /dev/sda3

       4       8        6        3      active sync   /dev/sda6


       3       8        5        -      faulty spare   /dev/sda5

5、将坏掉的磁盘sda5移除,新增一个sda,作为空闲磁盘,进行热备。

[root@HF ~]# mdadm /dev/md0 -r /dev/sda5

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

[root@HF ~]# mdadm /dev/md0 -a /dev/sda7

mdadm: added /dev/sda7

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

/dev/md0:

        Version : 1.2

  Creation Time : Wed Sep 14 02:02:26 2016

     Raid Level : raid10

     Array Size : 1043456 (1019.17 MiB 1068.50 MB)

  Used Dev Size : 521728 (509.59 MiB 534.25 MB)

   Raid Devices : 4

  Total Devices : 5

    Persistence : Superblock is persistent


    Update Time : Wed Sep 14 02:06:21 2016

          State : clean 

 Active Devices : 4

Working Devices : 5

 Failed Devices : 0

  Spare Devices : 1


         Layout : near=2

     Chunk Size : 512K


           Name : HF:0  (local to host HF)

           UUID : 44370f88:855b7e5e:9e2d49d9:2d7c76b2

         Events : 38


    Number   Major   Minor   RaidDevice State

       0       8        1        0      active sync   /dev/sda1

       1       8        2        1      active sync   /dev/sda2

       2       8        3        2      active sync   /dev/sda3

       4       8        6        3      active sync   /dev/sda6


       5       8        7        -      spare   /dev/sda7