概述:将多块磁盘组合成一块逻辑磁盘,从而提高读写性能与安全性。
1.实现方式
软件实现:通过主机的RAID软件实现,易于实施但是性能有限
硬件实现:RAID控制卡,基于主机的硬件RAID技术,将硬盘连接到控制卡上控制卡和硬盘之间通过PCI总线交互;外部RAID控制卡,基于存储阵列的高级硬件RAID技术,想主机提供一个硬盘的接口界面,是主机看到一个普通的存储卷,主机通过它支持的协议对卷进行管理。
2.基本概念
条带(strip):磁盘上一块由若干地址连续的磁盘块构成的,大小固定的区域
分条(stripe):位于RAID集上的所有磁盘相同位置的条带(strip)组成的存储区域
条带尺寸:也叫分条深度,描述了构成条带的磁盘块的数目
分条尺寸:条带尺寸与RAID集中硬盘数量的乘积,即条带的容量。
数据镜像:将同一数据写入两块不同的磁盘,从而产生该数据的两个副本。
奇偶校验:对写入的数据进行运算得到一个校验值用于数据恢复
3.RAID级别
RAID0
无容错的条带阵列。读写性能很好,但是无安全性可言。一个文件块坏了真个档案文件就失效了,一个块磁盘坏了整个RAID集就失效了。建议使用相同大小的磁盘组建。如果1块100G的与1块200G的硬盘组建的话,前200G的数据是等量分别存储在两块硬盘上的,后100G容量只能存在200G容量的那块硬盘上。
软件RAID可以手工制定分条尺寸,硬件RAID由厂商设定分条尺寸
RAID1
磁盘镜像。读性能还可以,写性能相对较差,安全性很好。最好使用相同大小相同品牌的两块硬盘,如果容量不等的话,以容量较小的那块为准。写入数据被I/O总线复制两2份写到各个磁盘,如果使用磁盘阵列RAID卡的话会复制一份而不用I/O总线。
RAID3
带专用检验磁盘的并行访问阵列。数据读写以整个条带为单位进行,从而所有磁盘能够并发的执行操作,而不存在更新同一条带中某些存储带的部分写操作(这样存在一些磁盘空间浪费),即任何数据的读写操作都要访问整个条带。可以这么去理解,给RAID0加一个独立的校验磁盘。RAID3为传输大量数据提供了很高的带宽,因而常用于视频流服务等设计大量数据数据访问的场景中。
RAID4与RAID3唯一的差别就是支持数据磁盘的独立访问,也就是说某个数据单元可以从单块磁盘中读写而无需访问整个条带。RAID5相对于RAID4来说不同点在于它将校验值分布存储在所有的磁盘上,这样就避免了校验磁盘成为写性能的瓶颈。RAID6与RAID5也是基本类似,不同的地方是引入了第二个校验值,这样当两块磁盘同时失效它仍然可以恢复,因此最少需要四块磁盘来组建。
RAID0+1与RAID1+0
结合RAID0的性能优势和RAID1的安全优势。
RAID0+1,将所有磁盘分成两个小组,小组内部做RAID0,小组之间做RAID1;RAID1+0,将所有磁盘两个一组分开,小组内部做RAID1,小组之间做RAID0。
至少需要四块磁盘才能组建。
4.在linux上实现软RAID
在linux上实现软RAID只需要使用一个命令:mdadm
1.检测是否加载了mdadm
cat /proc/mdstat #还可以用cat /proc/devices | grep md或者lsmld | grep md
2.磁盘格式 FD
如果MD编译进入了内核,那么当内核调用MD驱动时会自动查找分区格式为FD格式的磁盘。所以一般用fdisk将MD磁盘设置为FD格式。


W保存退出后,使用partprobe命令强制内核刷新分区表,使得刚才创建的分区生效可用。
3.创建RAID
mdadm --create --auto=yes /dev/md0 --level=n --raid-devices=n1 --spare-devices=n3 /dev/sdb1 /dev/sdc1 /dev/sdd……
--auto=yes :决定建立后面接的软件磁盘阵列装置,即/dev/md0
--raid-devices :使用n1个磁盘作为磁盘阵列
--spare-devices :使用n2个磁盘做热备盘
--level :定义RAID级别,这里也可以直接写,如-l0,-l5
最后跟的几个磁盘是做RAID的磁盘,注意,也可以是分区。但是跟分区的话其实做RAID并没有什么意义,一个分区坏了还可以修复,一块磁盘坏了就不能发挥RAID在安全上的优势。所以本例中限于实验条件仅仅作为一个演示。如/dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb5,或写作/dev/sdb{1,2,3,5,}

224143345.jpg

4.检验
cat /proc/mdstat
这条命令可以查看大概的信息,阵列级别,磁盘对应号码,块大小等。

224215449.jpg

详细信息可以使用mdadm --detail /dev/md0。从这里可以看见RAID磁盘数,热
备盘数,UUID,磁盘状态等信息。

224251640.jpg

5.创建文件系统并挂载
mkfs.ext3 /dev/md0
mount /dev/md0 /mnt/raid
6.管理磁盘阵列
添加磁盘:mdadm --manage /dev/md0 --add /dev/sdb8 #新添加的磁盘的磁盘会成为热备盘
删除磁盘:mdadm --manage /dev/md0 --remove /dev/sdb1
设置错误磁盘:mdadm --manage /dev/md0 --fail /dev/sdb2 #设置一个磁盘错误然后可以换下这个磁盘
7.开机自启动并挂载RAID
编辑/etc/fstab文件
8.关闭软RAID
直接关闭:mdadm –stop /dev/md0


mdadm 主要命令说明模式(7种):

Assemble:加入一个以前定义的阵列

Build:创建一个没有超级块的阵列

Create:创建一个新的阵列,每个设备具有超级块

Manage: 管理阵列(如添加和删除)

Misc:允许单独对阵列中的某个设备进行操作(如停止阵列)

Follow or Monitor:监控RAID的状态

Grow:改变RAID的容量或阵列中的设备数目

选项:
-A, --assemble:加入一个以前定义的阵列
-B, --build:创建一个没有超级块的阵列(Build a legacy array without superblocks.)
-C, --create:创建一个新的阵列
-F, --follow, --monitor:选择监控(Monitor)模式
-G, --grow:改变激活阵列的大小或形态
-I, --incremental:添加一个单独的设备到合适的阵列,并可能启动阵列
--auto-detect:请求内核启动任何自动检测到的阵列
-h, --help:帮助信息,用在以上选项后,则显示该选项信息
--help-options:显示更详细的帮助
-V, --version:打印mdadm的版本信息
-v, --verbose:显示细节
-b, --brief:较少的细节。用于 --detail 和 --examine 选项
-Q, --query:查看一个device,判断它为一个 md device 或是 一个 md 阵列的一部分
-D, --detail:打印一个或多个 md device 的详细信息
-E, --examine:打印 device 上的 md superblock 的内容
-c, --config= :指定配置文件,缺省为 /etc/mdadm.conf
-s, --scan:扫描配置文件或 /proc/mdstat以搜寻丢失的信息。配置文件/etc/mdadm.conf


-C 创建Raid (/dev/md0是我的raid名称)
-n 磁盘阵列个数

-l raid的级别,-x hostspare,待机磁盘,

--size 指定每块磁盘大小

--add -a : hotadd subsequent devices to the array
--remove -r : remove subsequent devices, which must not be active
--fail -f : mark subsequent devices a faulty
--set-faulty : same as --fail
--run -R : start a partially built array
--stop -S : deactivate array, releasing all resources
--readonly -o : mark array as readonly
--readwrite -w : mark array as readwrite


Options that are valid with management mode are:
--add -a : hotadd subsequent devices to the array
--remove -r : remove subsequent devices, which must not be active
--fail -f : mark subsequent devices a faulty
--set-faulty : same as --fail
--run -R : start a partially built array
--stop -S : deactivate array, releasing all resources
--readonly -o : mark array as readonly
--readwrite -w : mark array as readwrite

使用cat /proc/mdstat命令来查看一下RAID的状态
配置完后,需mdadm -D --scan>/etc/mdadm.conf 进行配置更新

停止阵列前,需umount 执行mdadm -S /dev/mdX

重新启动 执行 mdadm -As /dev/mdX

阵列组中移除硬盘 mdadm /dev/mdX -r /dev/sdX

阵列组中添加硬盘 mdadm /dev/mdX -a /dev/sdX

查看单个分区 mdadm -E /dev/sdX


热备盘设置

[root@mail ~]# mdadm -C /dev/md5 -l 5 -n 3  -x 1 /dev/sd{b,c,d,e}1
mdadm: /dev/sdb1 appears to contain an ext2fs file system
    size=3132288K  mtime=Thu Jun 13 17:39:02 2013
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=4 ctime=Thu Jun 13 19:41:15 2013
mdadm: /dev/sdc1 appears to contain an ext2fs file system
    size=3132288K  mtime=Thu Jun 13 17:39:02 2013
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=4 ctime=Thu Jun 13 19:41:15 2013
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=4 ctime=Thu Jun 13 19:41:15 2013
mdadm: /dev/sde1 appears to be part of a raid array:
    level=raid5 devices=4 ctime=Thu Jun 13 19:41:15 2013
mdadm: largest drive (/dev/sdb1) exceed size (1044096K) by more than 1%
Continue creating array? yes
mdadm: array /dev/md5 started.


[root@mail ~]# mdadm -C /dev/md1 -l  1  -n 2   /dev/sd{f,g}1
mdadm: /dev/sdf1 appears to contain an ext2fs file system
    size=2096448K  mtime=Thu Jan  1 08:00:00 1970
mdadm: /dev/sdf1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Thu Jun 13 19:41:46 2013
mdadm: /dev/sdg1 appears to contain an ext2fs file system
    size=2096448K  mtime=Thu Jan  1 08:00:00 1970
mdadm: /dev/sdg1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Thu Jun 13 19:41:46 2013
mdadm: largest drive (/dev/sdg1) exceed size (2096384K) by more than 1%
Continue creating array? yes
mdadm: array /dev/md1 started.

[root@mail ~]# mdadm -Ds >> /etc/mdadm.conf 

[root@mail ~]# cat  /etc/mdadm.conf 
ARRAY /dev/md5 level=raid5 num-devices=3 metadata=0.90 spares=1 UUID=1fb23f21:7be94495:e13cb744:a208b440
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=0.90 UUID=9ae7eff0:81a98310:014c7156:78c847c7


[root@mail ~]# mdadm -Ds  /dev/md5 
/dev/md5:
        Version : 0.90
  Creation Time : Thu Jun 13 21:03:51 2013
     Raid Level : raid5
     Array Size : 2088192 (2039.59 MiB 2138.31 MB)
  Used Dev Size : 1044096 (1019.80 MiB 1069.15 MB)
   Raid Devices : 3
  Total Devices : 4
Preferred Minor : 5
    Persistence : Superblock is persistent

    Update Time : Thu Jun 13 21:04:17 2013
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : 1fb23f21:7be94495:e13cb744:a208b440
         Events : 0.4

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1

       3       8       65        -      spare   /dev/sde1

[root@mail ~]# mdadm   /dev/md5 -f /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md5


[root@mail ~]# mdadm -Ds  /dev/md5 
/dev/md5:
        Version : 0.90
  Creation Time : Thu Jun 13 21:03:51 2013
     Raid Level : raid5
     Array Size : 2088192 (2039.59 MiB 2138.31 MB)
  Used Dev Size : 1044096 (1019.80 MiB 1069.15 MB)
   Raid Devices : 3
  Total Devices : 4
Preferred Minor : 5
    Persistence : Superblock is persistent

    Update Time : Thu Jun 13 21:08:03 2013
          State : clean, degraded, recovering
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 64K

 Rebuild Status : 10% complete

           UUID : 1fb23f21:7be94495:e13cb744:a208b440
         Events : 0.6

    Number   Major   Minor   RaidDevice State
       3       8       65        0      spare rebuilding   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1

       4       8       17        -      faulty spare   /dev/sdb1
 

[root@mail init.d]# cat  /etc/mdadm.conf 
MAILADDR root@localhost                 //当一个磁盘坏了的话,就会发送邮件
ARRAY /dev/md5 level=raid5 num-devices=3 metadata=0.90 spares=1 UUID=1fb23f21:7be94495:e13cb744:a208b440 auto=yes spare-group=group1
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=0.90 UUID=9ae7eff0:81a98310:014c7156:78c847c7   auto=yes spare-group=group1
   
[root@mail ~]# service mdmonitor  start            //启动mdmonitor服务
Starting mdmonitor:                                        [  OK  ]


当md1的一个盘坏了的话,md5的磁盘的空闲盘就会飘逸过来


6个问题

1. Soft Raid 是否一定需要 mdadm.conf 的配置文件才能启动(也就是重启后怎么自动启动Raid)


答案是,不一定.

如下rc.sysinit,是Centos的系统,如果有mdadm.conf才能启动raid.

1
2
3
if [ -f /etc/mdadm .conf ]; then
/sbin/mdadm -A -s
fi

但是,你可以没有配置文件,在启动后,用下面的方法启动

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


另外,如果你的Soft Raid是在系统安装时建的,那么没有mdadm.conf也能启动raid.为什么啦,看日志
kernel: md: Autodetecting RAID arrays.

在内核的编译中有这么一句"Autodetect RAID arrays during kernel boot",所以会自动的加载.所以重起系统后raid都需要有配置文件.但这个必须文件类型为fd.也就是Linux raid auto.


2. Soft Raid 的本身的信息是记录在什么地方?


这个是建议在Raid的成员中,每个硬盘有一个叫超级块(zero-superblock )的东西.记录在这个上面.所以如果给raid成员恢复成普通硬盘时,记的删除zero-superblock.
所以删除RAID中的硬盘的方法如下

1
2
3
mdadm --stop /dev/md0
mdadm --remove /dev/md0
mdadm --zero-superblock /dev/sda


3. 重装系统后, raid 是否还能使用?


答案一样是不一定

当你给系统也做进来,当然那个有系统的不行,但你只做数据分区,基本都是没有问题的.只要你重装系统后,使用原来的启动命令(配置文件也行),来启动就可以了.

1
2
mdadm -A /dev/md0 /dev/sd [bcde]
mdadm -As /dev/md0 (有配置文件时)


4. 软 Raid 中,分区表中的分区类型是否一定要修改成 Linux raid auto?


答案一样是不一定

在安装系统时选择raid时,一定要转成raid的分区类型,但如果安装完系统后自己使用命令来建,就不用.但最好是.


5. 是否一定要分区,才能建 Soft Raid?


答案一样是不一定

和上面一样,分为安装系统时建soft raid,和安装后在建raid.在安装系统时,一定是在分区上建的,但安装完系统后手工建的raid,没有分区也行.但最好分一下修改成linux raid auto,这样可以不需要配置文件也能启动

6. 在没有同步完(rebuilding)成前是否能重起


在同步rebuilding的过程中,重起是没有问题的,重起完,会从上次同步的地方起开始同步