一文全懂:独立冗余磁盘阵列(RAID)

独立冗余磁盘阵列,也就是大家常说的RAID,英文全称是:Redundant Array of Independent Disks,使用该技术,可以大幅提高硬盘设备的 IO 读写速度,还存在数种数据冗余备份机制提供用户选择,能够降低用户数据盘损坏带来的数据丢失的风险。

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

常用的几种RAID模式有RAID0、RAID1、RAID5和RAID10(RAID 一零)。

一、RAID的几种模式

1、RAID0

RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入各个物理硬盘中。这样一来,在最理想的状态下,硬盘设备的读写性能会提升数倍,但是若任意一块硬盘发生故障,将导致整个系统的数据都受到破

坏。通俗来说,RAID 0 技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据误修复能力。

如图 所示,数据被分别写入到不同的硬盘设备中,两块硬盘会分别保存数据资料,最终实现提升读取、写入速度的效果。

  • 最少需要的硬盘数:2
  • 优点:更快的数据访问。
  • 缺点:没有硬盘冗余,所以数据丢失的风险会增加。未针对不同容量大小的硬盘进行优化。

2、RAID1

RAID1模式的磁盘阵列的模式就是"N+1",无论有多少个磁盘,它只用一个存储数据,其它每个磁盘都是它的镜像,举个例子:有两个磁盘,那磁盘利用率就是50%,有N个磁盘,那磁盘利用率就是1/N。

这个模式是最没用的模式了,因为太浪费空间了,基本也没人用,除非是小型文件存储,而且对空间大小没有什么要求,但是对安全性有比较高的要求,那这时候就可以用到这个。相对于RAID0模式来说,它写入速度要稍微慢一些,但是读取速度要更快。

  • 最少需要的硬盘数:2
  • 优点:N 个硬盘冗余。
  • 缺点:存储池可用空间被限制为一个硬盘的容量。未针对不同容量大小的硬盘进行优化。

3、RAID5

RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5 磁盘阵列中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上。这样的好处是,其中任何一设备损坏后都可以依赖其它几块设备重建丢失的这块硬盘数据。

好吧,以上说法太迷糊,那到底RAID5是如何实现一块硬盘的数据冗余,并在一块硬盘损坏以后实现数据重建的呢?

首先,复习一下异或运算:

A B 结果
0 0 0
0 1 1
1 0 1
1 1 0

0是偶数,1是基数,它们的异或结果就是奇偶校验和。我们把上表中的A和B分别看做一个硬盘,0和1表示硬盘中存储的数据,结果也看做一个硬盘,也就是说,把A和B中的存储数据做了异或运算以后,放到第三个硬盘中;假如还有硬盘C、D、E、F呢?那结果就是 A异或B异或C异或D异或E异或F

这就是RAID5的原理了,但是并不完整,因为根据校验和存放的位置不一样,它会是不同的RAID模式:如果将所有的校验和都放到一个硬盘中,那这个RAID模式就是RAID3;如果将校验和分块存储到每个硬盘中,那就是RAID5了,可以说RAID5是RAID3的升级版。因为如果校验和都放到一个硬盘中,那只要存一条数据,就都要写一次校验和到校验和盘,那这个专门存放校验和的硬盘肯定容易坏。

在上图中,Parity就是校验和块,每个磁盘都有其余所有磁盘对应块计算之后的校验和,这样就不怕任何一块磁盘坏掉了,如果有一块硬盘坏掉,只需要把所有其它盘对应块的数据做一次校验和,就知道缺失的这块的数据是什么了。这也就解释了为什么RAID5最少需要3块硬盘,而且3块硬盘的容量要一样。

  • 需要的硬盘数:3
  • 优点:1 个硬盘的容错机制并将存储空间配置优化。
  • 缺点:未针对不同容量大小的硬盘进行优化。
  • 所有的校验和块加起来的大小正好是一块硬盘的容量。

4、RAID10

首先,得说明,RAID10的叫法是"RAID一零",而非"RAID十",RAID 10 技术是 RAID 1+RAID 0 技术的一个"组合体"。如下图所示

RAID10 技术需要至少 4 块硬盘来组建,其中先分别两两制作成 RAID 1 磁盘阵列,以保证数据的安全性;然后再对两个 RAID 1 磁盘阵列实施 RAID 0 技术,进一步提高硬盘设备的读写速度。

这样从理论上来讲,只要坏的不是同一阵列中的所有硬盘,那么最多可以损坏 50%的硬盘设备而不丢失数据。由于 RAID 10 技术继承了 RAID 0 的高读写速度和 RAID 1 的数据安全性,在不考虑成本的情况下 RAID 10 的性能也超过了 RAID 5,因此当前成为广泛使用的一种存储技术。

RAID 10 是先对信息进行分割,然后再两两一组制作镜像。也就是先将 RAID 1 作为最低级别的组合,然后再使用 RAID 0 技术将 RAID 1 磁盘阵列组合到一起,将它们视为"一整块"硬盘。肯定会有人有疑问,是否可以先按照RAID0进行制作磁盘阵列,再利用RAID1技术将两个磁盘阵列组合起来呢?这其实就是RAID01技术了。RAID01技术有很大缺陷,所以很少有人使用,原因如下:

  1. RAID10本质上是RAID0,它的扩展性很好,可以再添加几个RAID1磁盘阵列也没问题;但是RAID01本质上是RAID1磁盘阵列,它的缺点也正是RAID1磁盘阵列的缺点,那就是无论再增加几个RAID0磁盘阵列,也只是增加了几个镜像而已,并不能真正的使用到新增加的磁盘阵列的容量。
  2. RAID10底层磁盘阵列是RAID1,它允许坏掉一块磁盘而保证系统的正常运行;但是RAID01底层磁盘阵列是RAID0,一旦坏掉一块磁盘,底层的RAID0磁盘阵列就会崩溃无法使用。

所以无论是从可扩展性上,还是数据安全性上,RAID10远比RAID01磁盘阵列要好的多,以至于RAID01几乎没有人用。

二、使用mdadm命令管理RAID

linux中使用mdamd命令创建raid,mdadm英文全名为"multiple devices admin",语法格式为"mdadm 参数 硬盘名称"。

mdadm参数大全

参数 功能
-a 添加一块设备到磁盘阵列
-n 指定设备数量
-l 指定 RAID 级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止 RAID 磁盘阵列
-x 有几块备用盘

1、创建RAID10

以下操作均在在Vmware Workstation中进行

1.1 创建RAID10

一上来就创建RAID10,是不是难度有点高?其实不是,假设我们已经有了/dev/sdb/dev/sdc/dev/sdd/dev/sde 四个硬盘,大小都为20G,创建名称为/dev/md0的命令只是一条就搞定了

bash 复制代码
mdadm -Cv /dev/md0 -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde

-Cv:创建磁盘阵列并显示过程

-n 4:该磁盘阵列有4个磁盘

-l 10:创建的磁盘阵列类型是RAID10

一条命令就创建好了RAID10,说真的,我还以为要手动创建若干个RAID1,然后将这些RAID1再用RAID0组合起来呢。

执行完该命令后,会有个初始化的过程,大概得一分钟左右能初始化完成,可以通过mdadm -D /dev/md0 命令查看该磁盘阵列的详情

1.2 格式化磁盘阵列

创建完磁盘阵列完成后,需要将磁盘阵列格式化之后才能使用,格式化命令还是mkfs命令

bash 复制代码
mkfs.ext4 /dev/md0

1.3 挂载磁盘阵列

可以先创建一个文件夹/raid,然后挂载/dev/md0

bash 复制代码
 mount /dev/md0 /raid

这时候再用lsblk命令查看,可以发现和以前的普通分区有所不同

磁盘阵列中的四个磁盘下都有md0分区,而且都是都是raid10类型。

为了永久挂载,还要写配置文件/etc/fstab

bash 复制代码
/dev/md0                /raid                   ext4    defaults        0 0

1.4 其它RAID模式

其它RAID模式是一样的,只需要改变使用的硬盘数量和raild类型即可,故不再赘述其它类型的磁盘阵列创建。

2、磁盘损坏和更换

在使用磁盘阵列的过程中,不可避免的,总有一天会有硬盘损坏,在RAID10磁盘阵列中,最多同时允许坏掉50%的硬盘,这个容错率是相当大了,那如果有一块硬盘损坏了,如何更换这块坏掉的硬盘呢?

先查询下我们这个磁盘阵列的详情

bash 复制代码
mdadm -D /dev/md0

可以看到md0磁盘阵列中有四块硬盘。

首先,我们假设/dev/sdb这块硬盘坏了,需要先将这块硬盘标志为不可用

bash 复制代码
mdadm /dev/md0 -f /dev/sdb

然后移除该硬盘

bash 复制代码
mdadm /dev/md0 -r /dev/sdb

然后看下这个磁盘阵列当前的状态

可以看到磁盘阵列状态多了个"degraded",表示磁盘阵列降级了,这意味着 RAID 阵列中至少有一个磁盘故障或处于离线状态,导致阵列无法以完全冗余的方式运行。因为我们移除了/dev/sdb硬盘,所以提示degraded状态是正常的。

接下来我们添加一块新硬盘/dev/sdf,替换掉坏掉的/dev/sdb,使用命令-a将其添加到磁盘阵列中

bash 复制代码
mdadm -D /dev/md0

然后看看当前磁盘阵列的状态

可以看到状态多了一个"recoverting",表示磁盘阵列状态正在恢复中,然后还有一个恢复进度,我们新增加的这块硬盘被识别为"备用盘",备用盘正在重建中。

耐心等一会儿,再看看磁盘阵列的状态,它就正常了。

3、使用备份盘实现热恢复

上一节我们实现了硬盘损坏的时候手动移除坏掉的硬盘,然后换上了新硬盘,整个过程其实有两个问题

  1. 硬盘坏掉立马被发现的概率比较低,往往要一段时间之后才会被发现硬盘坏掉了,处理的可能不够很及时
  2. 更换硬盘的过程都是手动,甚至要关机安装新硬盘,整个过程有操作失误的风险

实际上有一种方式,能够不用关机,不用手动移除,只要有一块闲置的硬盘,这块硬盘平时处于闲置状态,一旦 RAID 磁盘阵列中有硬盘出现故障就会马上自动顶替上去,并自动完成数据恢复,这功能岂不是很棒?

其实只需要初始化磁盘阵列的时候加上-x参数即可。

接下来用RAID5为例演示该功能。RAID5要求最少要3块硬盘,所以我准备了3块硬盘+1块备份盘一共四块硬盘。下图中的sdb、sdc、sdd、sde一共四块。

接下来使用这四块硬盘组raid5

bash 复制代码
mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde

各项参数之前有过说明,不再赘述,主要是加了-x 1这个参数,表示有一块备份盘。

然后通过mdadm -D /dev/md0 查看组RAID详情

可以看到正在初始化,等一会儿,等它初始化结束了再操作下一步

可以看到该RAID5磁盘阵列中有4个硬盘,但是只有3个是RAID的组成部分,还有一个Spare Device,也就是备份盘。

接下来进行格式化和挂载

使用df -h /raid命令查看/raid目录的磁盘占用情况

可以看到3块20G的硬盘组成的RAID5,挂载到/raid目录后,可用存储大小为40G,符合预期。

然后我们将一块硬盘/dev/sdb标记为已损坏,看看效果如何

bash 复制代码
mdadm /dev/md0 -f /dev/sdb

接下来,马上运行命令mdadm -D /dev/md0 查看当前磁盘阵列的详情

可以看到备份硬盘/dev/sde已经自动顶上去并开始初始化了,再过一会儿,在查询下md0磁盘阵列

可以看到/dev/sde已经完全取代了坏掉的/dev/sdb硬盘,并已经在正常工作。

4、删除RAID

4.1 取消挂载

首先,删除掉/etc/fstab文件中相关的挂载内容

之后,手动取消挂载

bash 复制代码
umount /dev/md0

4.2 停止磁盘阵列

bash 复制代码
mdadm -S /dev/md0

停止磁盘阵列之后,会发现/dev/md0设备已经消失不见了。

接下来,系统关机,拔出硬盘即可。

最后,欢迎关注我的博客:https://blog.kdyzm.cn