一、RAID(独立冗余磁盘阵列)概述

raid技术通过把多个硬盘设备组合成一个容量更大的,安全性更好的磁盘阵列。把数据切割成许多区段后分别放在不同的物理磁盘上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理设备上,从而起到了非常好的数据冗余备份效果。缺点就是磁盘利用率低。

二、RAID的分类

(1)RAID 0

RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术。RAID 0是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID 0没有提供冗余或错误修复能力,但实现成本是最低的。

工作原理如图:

(2)RAID 1

RAID 1称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行,当一块硬盘失效时,系统会忽略该硬盘,转而使用剩余的镜像盘读写数据,具备很好的磁盘冗余能力。虽然这样对数据来讲绝对安全,但是成本也会明显增加,磁盘利用率为50%。

工作原理如图:

(3)RAID 0+1

RAID 0+1名称上我们便可以看出是RAID0与RAID1的结合体。在我们单独使用RAID 1也会出现类似单独使用RAID 0那样的问题,即在同一时间内只能向一块磁盘写入数据,不能充分利用所有的资源。为了解决这一问题,我们可以在磁盘镜像中建立带区集。因为这种配置方式综合了带区集和镜像的优势,所以被称为RAID 0+1。把RAID0和RAID1技术结合起来,数据除分布在多个盘上外,每个盘都有其物理镜像盘,提供全冗余能力,允许一个以下磁盘故障,而不影响数据可用性,并具有快速读/写能力。RAID0+1要在磁盘镜像中建立带区集至少4个硬盘。也有一种叫法叫raid10.

工作原理如图:

(4)RAID 5

RAID 5:分布式奇偶校验的独立磁盘结构 它的奇偶校验码存在于所有磁盘上。RAID5的读出效率很高,写入效率一般,块式的集体访问效率不错。因为奇偶校验码在不同的磁盘上,所以提高了可靠性。但是它对数据传输的并行性解决不好,而且控制器的设计也相当困难。在RAID 5中有“写损失”,即每一次写操作,将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。

工作原理如图:

总结:raid0大幅度提升了设备的读写性能,但不具备容错能力。raid1虽然十分注重数据安全,但磁盘利用率太低。raid5就是raid0和raid5的一种折中,既提升了磁盘读写能力,又有一定的容错能力,成本也低。raid10就是raid0和raid1的组合,大幅度提升读写能力,较强的容错能力,成本也较高。一般中小企业用raid5,大企业采用raid10。

如图:

三、部署RAID 5卷

首先为服务器添加4块硬盘

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xb0813467 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd                        #磁盘类型改为raid
已将分区“Linux”的类型更改为“Linux raid autodetect”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xb0813467

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   fd  Linux raid autodetect

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

其他三块也是一样!

[root@localhost ~]# fdisk -l | grep sd[b-e]
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdb1            2048    41943039    20970496   fd  Linux raid autodetect
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdc1            2048    41943039    20970496   fd  Linux raid autodetect
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdd1            2048    41943039    20970496   fd  Linux raid autodetect
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sde1            2048    41943039    20970496   fd  Linux raid autodetect
[root@localhost ~]# yum -y install mdadm
#安装madam (madam是Linux下的raid管理工具)
[root@localhost ~]# mdadm -C /dev/md0 -ayes -l5 -n3 -x1 /dev/sd[b-e]1 
#用sdb1,sdc1,sdd1,sde1四块磁盘其中3块创建raid5,名称为md0,另外一块作为热备份。
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

命令参数:
-C  --create   创建阵列;

-a  --auto    同意创建设备,如不加此参数时必须先使用mknod 命令来创建一个RAID设备,不过推荐使用-a yes参数一次性创建;

-l   --level   阵列模式,支持的阵列模式有 linear, raid0, raid1, raid4, raid5, raid6, raid10, multipath, faulty, container;

-n     --raid-devices    阵列中活动磁盘的数目,该数目加上备用磁盘的数目应该等于阵列中总的磁盘数目;

或者使用另一条命令

[root@localhost ~]#  mdadm --create --auto=yes /dev/md0 --level=5 --raid-devices=4 --spare-devices=1 /dev/sd[b-e]1
命令参数:
--create    #表示要创建raid
--auto=yes /dev/md0   #新建立的软件磁盘阵列设备为md0,md序号可以为0-9
--level=5   #磁盘阵列的等级,这里表示创建是的raid5
--raid-devices     #添加作为磁盘阵列用的磁盘的块数
--spare-devices   #添加作为预备(spare)磁盘的块数
/dev/sd[b-f]1   #磁盘阵列所使用的设备,还可写成/dev/sdb1  /dev/sdc1  /dev/sdd1  /dev/sde1  
[root@localhost ~]# cat /proc/mdstat             #查看RAID的配置文件
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd1[4] sde1[3](S) sdc1[1] sdb1[0]
      41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2** [3/3] [UUU]**
      
unused devices: <none>
[root@localhost ~]# mdadm -D /dev/md0             #查看RAID配置文件详细信息
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jun 30 10:43:20 2019
  **   Raid Level : raid5**                                   #阵列类型为raid5
                       
											 
											 …………              #省略部分内容
											 
											 
 Active Devices : 3                 #活跃的磁盘数目
Working Devices : 4               #所有的磁盘数目
 Failed Devices : 0                  #故障的磁盘数目
  Spare Devices : 1                 #热备份的磁盘数目

                       …………              #省略部分内容

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

       3       8       65        -      spare   /dev/sde1       #一块磁盘用于热备份
[root@localhost ~]# echo 'DEVICE /dev/sd[b-e]1' >>/etc/mdadm.conf
[root@localhost ~]# mdadm -Ds >>/etc/mdadm.conf
#添加raid5到raid配置文件并做修改
[root@localhost ~]# cat /etc/mdadm.conf 
DEVICE /dev/sd[b-e]1
ARRAY /dev/md0 metadata=1.2 spares=1 name=localhost:0 UUID=12345d9f:61e1d599:86226f6d:536d45c7
[root@localhost ~]# mkfs.xfs /dev/md0
#格式化磁盘
[root@localhost ~]# mkdir /a
[root@localhost ~]# mount /dev/md0 /a
#挂载磁盘
[root@localhost ~]# df -hT              #查看磁盘大小
              
							…………                #省略部分内容

/dev/md0            xfs        40G   33M   40G    1% /a
 [root@localhost ~]# vim /etc/fstab                  #编写文件开机自动挂载               
								
								…………                #省略部分内容
								
/dev/md0                /a                      xfs     defaults        0 0
[root@localhost ~]# cd /a
[root@localhost a]# touch 123.txt  456.txt                #创建测试文件
[root@localhost a]# mdadm /dev/md0 -f /dev/sdb1      #模拟sdb1损坏
mdadm: set /dev/sdb1 faulty in /dev/md0
[root@localhost a]# mdadm -D /dev/md0                  #查看/dev/md0详细信息


                   …………               #省略部分内容

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

       0       8       17        -      faulty   /dev/sdb1
[root@localhost a]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd1[4] sde1[3] sdc1[1] sdb1[0](F)
      41908224 blocks super 1.2 level 5, 512k chunk, algorithm 2 [**3/3] [UUU]**
      
unused devices: <none>
[root@localhost a]# ll                     #查看测试的文件
总用量 0
-rw-r--r--. 1 root root 0 6月  30 11:06 123.txt
-rw-r--r--. 1 root root 0 6月  30 11:06 456.txt
[root@localhost a]# mdadm /dev/md0 -r /dev/sdb1                        #移除已损坏的磁盘
mdadm: hot removed /dev/sdb1 from /dev/md0
[root@localhost a]# mdadm -D /dev/md0                               #查看/dev/md0详细信息
                                         
																				 
																				 …………               #省略部分内容
																				 
   Number   Major   Minor   RaidDevice State
       3       8       65        0      active sync   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       4       8       49        2      active sync   /dev/sdd1
[root@localhost a]# mdadm /dev/md0 -a /dev/sdb1                      #添加一块硬盘
mdadm: added /dev/sdb1
[root@localhost a]# mdadm -D /dev/md0                           #查看/dev/md0详细信息
																				 
																				 
																				 …………               #省略部分内容
																				 
    Number   Major   Minor   RaidDevice State
       3       8       65        0      active sync   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       4       8       49        2      active sync   /dev/sdd1

       5       8       17        -      spare   /dev/sdb1																		 
[root@localhost a]# ll
总用量 0
-rw-r--r--. 1 root root 0 6月  30 11:06 123.txt
-rw-r--r--. 1 root root 0 6月  30 11:06 456.txt

注意:在实际中sdb1已经是另一块完好的硬盘了。不是说之前损坏的那块移除再添加就好了。

服务器再添加一块磁盘,重启之后:

[root@localhost a]# mdadm /dev/md0 -a /dev/sdf1
mdadm: added /dev/sdf1
[root@localhost a]# mdadm -D /dev/md0
																				 
																				 …………               #省略部分内容
																				 
    Number   Major   Minor   RaidDevice State
       3       8       65        0      active sync   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       4       8       49        2      active sync   /dev/sdd1

       5       8       17        -      spare   /dev/sdb1
       6       8       81        -      spare   /dev/sdf1
	

由于默认是添加成热备盘,得把热备盘改为活动盘

[root@localhost a]# mdadm /dev/md0 -G -n4
#-n用来指定raid中活动盘的数量。最好保证要有足够的热备盘添加。
[root@localhost a]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sun Jun 30 10:43:20 2019
     Raid Level : raid5
     Array Size : 41908224 (39.97 GiB 42.91 GB)                        #磁盘容量已将发生变化
  Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
   Raid Devices : 4
  Total Devices : 5
    Persistence : Superblock is persistent

    Update Time : Sun Jun 30 11:22:00 2019
          State : clean         #构建完成
                        
												…………         #省略部分内容

    Number   Major   Minor   RaidDevice State
       3       8       65        0      active sync   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       4       8       49        2      active sync   /dev/sdd1
       6       8       81        3      active sync   /dev/sdf1

       5       8       17        -      spare   /dev/sdb1
	#此时raid中已经由四块硬盘了
[root@localhost a]# df -hT                                       #查看之后,容量并没有发生变化
                         …………         #省略部分内容
/dev/md0            xfs        40G   33M   40G    1% /a
[root@localhost a]# resize2fs /dev/md0
#(resizefx适用于ext3,ext4等文件系统不适用于xfs文件系统)
#resize2fs命令用于更新磁盘
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block 当尝试打开 /dev/md0 时
找不到有效的文件系统超级块.
[root@localhost a]# xfs_growfs /dev/md0                            #对文件系统进行扩容
meta-data=/dev/md0               isize=512    agcount=16, agsize=654720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=10475520, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=5120, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 10475520 to 15715584
[root@localhost a]# df -hT
文件系统            类型      容量  已用  可用 已用% 挂载点

                      …………                   #省略部分内容

/dev/md0            xfs        60G   33M   60G    1% /a
#再次查看容量已经发生变化