14.2 【Linux】软件磁盘阵列(Software RAID)

14.2.1 什么是 RAID

磁盘阵列全名是" Redundant Arrays of Inexpensive Disks, RAID ",英翻中的意思是:容错式廉价磁盘阵列。 RAID 可以通过一个技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘设备; 而这个较大的磁盘功能可不止是储存而已,他还具有数据保护的功能呢。整个 RAID 由于选择的等级 (level) 不同,而使得整合后的磁盘具有不同的功能,基本常见的 level 有这几种:

RAID-0 (等量模式, stripe):性能最佳

这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。这种模式的 RAID 会将磁盘先切出等量的区块 (名为chunk,一般可设置 4K~1M 之间), 然后当一个文件要写入 RAID时,该文件会依据 chunk 的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据, 因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁盘上面。举例来说,你有两颗磁盘组成 RAID-0 , 当你有 100MB 的数据要写入时,每个磁盘会各被分配到 50MB 的储存量。RAID-0 的示意图如下所示:

图14.2.1、RAID-0 的磁盘写入示意图

上图的意思是,在组成 RAID-0 时,每颗磁盘 (Disk A 与 Disk B) 都会先被区隔成为小区块(chunk)。 当有数据要写入 RAID 时,数据会先被切割成符合小区块的大小,然后再依序一个一个的放置到不同的磁盘去。 由于数据已经先被切割并且依序放置到不同的磁盘上面,因此每颗磁盘所负责的数据量都降低了!照这样的情况来看, 越多颗磁盘组成的 RAID-0 性能会越好,因为每颗负责的数据量就更低了! 这表示我的数据可以分散让多颗磁盘来储存,当然性能会变的更好。此外,磁盘总容量也变大了! 因为每颗磁盘的容量最终会加总成为RAID-0 的总容量。

只是使用此等级你必须要自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每颗磁盘分区区块的大小, 然后再依序放置到各个磁盘中。想一想,如果某一颗磁盘损毁了,那么文件数据将缺一块,此时这个文件就损毁了。 由于每个文件都是这样存放的,因此RAID-0 只要有任何一颗磁盘损毁,在 RAID 上面的所有数据都会遗失而无法读取。

另外,如果使用不同容量的磁盘来组成 RAID-0 时,由于数据是一直等量的依序放置到不同磁盘中,当小容量磁盘的区块被用完了, 那么所有的数据都将被写入到最大的那颗磁盘去。举例来说,我用 200G 与 500G 组成 RAID-0 , 那么最初的 400GB 数据可同时写入两颗磁盘(各消耗 200G 的容量),后来再加入的数据就只能写入 500G 的那颗磁盘中了。 此时的性能就变差了,因为只剩下一颗可以存放数据。

RAID-1 (映射模式, mirror):完整备份

图14.2.2、RAID-1 的磁盘写入示意图

如上图所示,一份数据传送到 RAID-1 之后会被分为两股,并分别写入到各个磁盘里头去。由于同一份数据会被分别写入到其他不同磁盘,因此如果要写入 100MB 时,数据传送到 I/O总线后会被复制多份到各个磁盘, 结果就是数据量感觉变大了!因此在大量写入 RAID-1 的情况下,写入的性能可能会变的非常差。好在如果你使用的是硬件 RAID (磁盘阵列卡) 时,磁盘阵列卡会主动的复制一份而不使用系统的 I/O 总线,性能方面则还可以。 如果使用软件磁盘阵列,可能性能就不好了。

由于两颗磁盘内的数据一模一样,所以任何一颗硬盘损毁时,你的数据还是可以完整的保留下来的。所以说,RAID-1 最大的优点大概就在于数据的备份吧。不过由于磁盘容量有一半用在备份, 因此总容量会是全部磁盘容量的一半而已。虽然 RAID-1 的写入性能不佳,不过读取的性能则还可以。这是因为数据有两份在不同的磁盘上面,如果多个processes 在读取同一笔数据时, RAID 会自行取得最佳的读取平衡。

RAID 1+0,RAID 0+1

RAID-0 的性能佳但是数据不安全,RAID-1 的数据安全但是性能不佳。RAID 1+0 或 RAID 0+1就可以解决这些问题。所谓的 RAID 1+0 就是:(1)先让两颗磁盘组成 RAID 1,并且这样的设置共有两组; (2)将这两组 RAID 1 再组成一组 RAID 0。这就是 RAID 1+0。反过来说,RAID 0+1 就是先组成 RAID-0 再组成 RAID-1 的意思。

图14.2.3、RAID-1+0 的磁盘写入示意图

如上图所示,Disk A + Disk B 组成第一组 RAID 1,Disk C + Disk D 组成第二组 RAID 1, 然后这两组再整合成为一组 RAID 0。如果我有 100MB 的数据要写入,则由于 RAID 0 的关系, 两组 RAID 1 都会写入 50MB,又由于 RAID 1 的关系,因此每颗磁盘就会写入 50MB 而已。 如此一来不论哪一组 RAID 1 的磁盘损毁,由于是 RAID 1 的图像数据,因此就不会有任何问题发生了,这也是目前储存设备厂商最推荐的方法。

RAID 5:性能与数据备份的均衡考虑

RAID-5 至少需要三颗以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似 RAID-0 , 不过每个循环的写入过程中 (striping),在每颗磁盘还加入一个同位检查数据 (Parity) ,这个数据会记录其他磁盘的备份数据, 用于当有磁盘损毁时的救援。RAID-5 读写的情况有点像下面这样:

图14.2.4、RAID-5 的磁盘写入示意图

如上图所示,每个循环写入时,都会有部分的同位检查码 (parity) 被记录起来,并且记录的同位检查码每次都记录在不同的磁盘, 因此,任何一个磁盘损毁时都能够借由其他磁盘的检查码来重建原本磁盘内的数据。不过需要注意的是, 由于有同位检查码,因此 RAID 5的总容量会是整体磁盘数量减一颗。以上图为例, 原本的 3 颗磁盘只会剩下 (3-1)=2 颗磁盘的容量。而且当损毁的磁盘数量大于等于两颗时,这整组 RAID 5 的数据就损毁了。 因为RAID 5 默认仅能支持一颗磁盘的损毁情况。

在读写性能的比较上,读取的性能还不赖!与 RAID-0 有的比!不过写的性能就不见得能够增加很多! 这是因为要写入 RAID 5 的数据还得要经过计算同位检查码 (parity) 的关系。由于加上这个计算的动作, 所以写入的性能与系统的硬件关系较大!尤其当使用软件磁盘阵列时,同位检查码是通过 CPU 去计算而非专职的磁盘阵列卡, 因此性能方面还需要评估。

另外,由于 RAID 5 仅能支持一颗磁盘的损毁,因此近来还有发展出另外一种等级,就是RAID 6 ,这个 RAID 6 则使用两颗磁盘的容量作为 parity 的储存,因此整体的磁盘容量就会少两颗,但是允许出错的磁盘数量就可以达到两颗了! 也就是在 RAID 6 的情况下,同时两颗磁盘损毁时,数据还是可以救回来!

Spare Disk:预备磁盘的功能:

当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启动磁盘阵列后, 磁盘阵列就会开始主动的重建 (rebuild) 原本坏掉的那颗磁盘数据到新的磁盘上!然后你磁盘阵列上面的数据就复原了! 这就是磁盘阵列的优点。不过,我们还是得要动手拔插硬盘,除非你的系统有支持热拔插,否则通常得要关机才能这么做。

为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘 (spare disk) 的辅助。 所谓的 spare disk 就是一颗或多颗没有包含在原本磁盘阵列等级中的磁盘,这颗磁盘平时并不会被磁盘阵列所使用, 当磁盘阵列有任何磁盘损毁时,则这颗 spare disk 会被主动的拉进磁盘阵列中,并将坏掉的那颗硬盘移出磁盘阵列! 然后立即重建数据系统。如此你的系统则可以永保安康啊!若你的磁盘阵列有支持热拔插那就更完美了! 直接将坏掉的那颗磁盘拔除换一颗新的,再将那颗新的设置成为 spare disk ,就完成了!

磁盘阵列的优点

你的系统如果需要磁盘阵列的话,其实重点在于:

  1. 数据安全与可靠性:指的并非网络信息安全,而是当硬件 (指磁盘) 损毁时,数据是否还能够安全的救援或使用之意;

  2. 读写性能:例如 RAID 0 可以加强读写性能,让你的系统 I/O 部分得以改善;

  3. 容量:可以让多颗磁盘组合起来,故单一文件系统可以有相当大的容量。

因为 RAID5, RAID6 读写都需要经过 parity 的计算机制,因此读/写性能都不会刚好满足于使用的磁盘数量。另外,根据使用的情况不同,一般推荐的磁盘阵列等级也不太一样。

相关推荐
matlab的学徒14 分钟前
Web与Nginx网站服务(改)
linux·运维·前端·nginx·tomcat
Insist75319 分钟前
prometheus安装部署与alertmanager邮箱告警
linux·运维·grafana·prometheus
BAGAE1 小时前
MODBUS 通信协议详细介绍
linux·嵌入式硬件·物联网·硬件架构·iot·嵌入式实时数据库·rtdbs
灿烂阳光g1 小时前
SELinux 策略文件编写
android·linux
xqlily1 小时前
Linux操作系统之Ubuntu
linux·运维·ubuntu
阿部多瑞 ABU1 小时前
《基于国产Linux的机房终端安全重构方案》
linux·安全
倔强的石头1062 小时前
【Linux指南】Makefile入门:从概念到基础语法
linux·运维·服务器
ajassi20002 小时前
linux C 语言开发 (七) 文件 IO 和标准 IO
linux·运维·服务器
程序猿编码2 小时前
基于 Linux 内核模块的字符设备 FIFO 驱动设计与实现解析(C/C++代码实现)
linux·c语言·c++·内核模块·fifo·字符设备
一只游鱼2 小时前
Zookeeper介绍与部署(Linux)
linux·运维·服务器·zookeeper