March 10, 2024

RAID各等级介绍

前文我们介绍了RAID的基本概念,了解到RAID有很多种不同的等级,比如RAID0、RAID1、RAID2、RAID3等等。接下来我们就简要的介绍一下这些不同的RAID。为什么说简要?因为我们在后面会详细的介绍每种RAID等级,从原理到基本操作,再到代码实现。本节我们先简单的介绍一下其原理。

RAID0

如果阅读大卫·帕特森论文《A Case for Redundant Arrays of Inexpensive Disks (RAID)》就会发现RAID0并不包括在其论文中。作者猜测原因是,该论文论证的是一种提高可靠性的技术,而RAID0本身并不能提高可靠性,反而会降低可靠性。那为什么还要在这里介绍它呢?因为RAID0的意义在于其可以提升性能并扩大存储容量。

如下图是一个由3块物理硬盘构成的一个RAID0,物理硬盘的容量是100GB,构成的虚拟硬盘的容量是300GB,也就是三个物理硬盘容量之和。虚拟硬盘数据与物理硬盘数据对应关系如下图所示。假设一个数据块大小为一个扇区,那么虚拟硬盘第一个扇区A在第一个物理硬盘的第一个扇区,而虚拟硬盘第二个扇区B则在第二块物理硬盘的第一个扇区,以此类推。

RAID1

RAID1将一块数据同时放置在两块或者两块以上的硬盘上,也称为镜像。RAID1技术有点类似分布式中的多副本技术。由于每个硬盘都有相同的数据拷贝,因此,当出现硬盘故障的时候,我们依然可以通过健康的硬盘访问数据。

如下图是以2块硬盘为例RAID1的示意图。可以看出,通过RAID1映射,两个100GB大小的硬盘被映射为一个100GB大小的虚拟硬盘。虚拟硬盘第一个数据块的数据被同时放置在两个物理硬盘上,第二个数据块也是这样,以此类推。

通过上面示意图可以看出,RAID1可以极大的提高数据可靠性,但是不能提升存储容量。对于读写性能方面,可以一定程度上提升读数据的性能,但对写性能没有任何提升。

RAID2

RAID2是一种通过ECC( Error Correction Code)来实现数据冗余和纠错功能的RAID级别。RAID2中的硬盘分为两个角色,一种是数据盘,另外一种为校验盘。其中数据盘会被映射为一个逻辑硬盘,逻辑硬盘与物理硬盘间会建立映射关系。校验盘只存储校验数据,校验盘数据与数据盘数据也有一定的对应关系,但对用户来说是透明的。

RAID2的特点是以位(bit)为单位将数据分布在数据盘上的,校验数据的计算也是以位为单位。基于上述特点,条带化和ECC处理起来都比较复杂,目前RAID2基本没有在实际生产环境中使用。

RAID3

RAID3以字节为单位将数据分布到多个数据盘上,校验盘采用固定的硬盘。如下图是4块硬盘构成的RAID3,其中3块盘为数据盘,1块校验盘。3块数据盘可以聚合为一个300GB的虚拟盘,校验盘存储计算出的校验数据。

RAID3对数据存储不太友好,因此在产品中似乎没有什么应用。举个例子,无论是文件系统还是数据块,其访问数据的粒度大多数4KB或者更大。当文件系统访问RAID3的设备时,4KB的数据会被分散到所有数据盘,也就是所有数据盘都会工作。所以RAID3对于提高性能没有任何帮助。

RAID4

RAID4的数据布局与RAID3相同,大家可以参考上图来理解。不同之处在于,RAID4以块为粒度将数据散落在数据盘上,校验数据的计算也是以块为单位。所以,RAID4可以通过并发IO的方式提高读写性能。假设RAID4的块大小为4KB,如果文件系统写入一个12KB的数据,那么3个数据盘可以同时写入数据,显然性能提升了3倍。

如果不是12KB的数据,而是3个4KB的随机数据,那么这些IO可能会落到一个或者多个数据盘上。如果落在多个数据盘上,那么在一定程度上也能提高写入的数据。但是RAID4有个缺点,由于校验盘是固定的,对于随机写请求,校验盘的压力会比较大, 通常会称为瓶颈。

RAID5

RAID5是对RAID4的改进版,在RAID5中并没有固定的校验盘,而是将校验数据分散到每个硬盘,从而避免随机写IO情况下校验盘称为性能瓶颈的问题。在RAID5中,数据块和校验数据块的关系为n->1,也就是若干数据块会有一个校验块。如下图所示,由4块硬盘构成的RAID5,其中3块数据块对应一个校验块。数据块A、B和C对应的校验块为P0,数据块D、E和F数据块对应的校验块为P1。

鉴于上述对应关系,RAID5可以容忍1块硬盘出现故障。当1块硬盘出现故障的情况下,可以通过其他健康硬盘构建出数据。

RAID6

RAID6是RAID5的改进版,RAID6中包含两个校验块,也就是数据块与校验块的对应关系为n->2。由于采用2个校验块,RAID6可以容忍2块硬盘故障。

如上图是5块硬盘构成的RAID6的数据布局情况。关于RAID5和RAID6,我们后面会详细介绍,这里就不再赘述了。

RAID10和RAID01

上面介绍了最基本的RAID等级。在具体实现的时候可以实现RAID等级的层叠,比如先构建一组RAID1,然后将多个RAID1再构建为一个RAID0。这样构建的设备既具备了RAID1的可靠性,由具备了RAID0的高性能和高容量。

如下图是RAID10的关系图,其中包含6块物理硬盘,两两构成3个虚拟的RAID1块设备。然后3块RAID1块设备又通过RAID0构建成一个大容量的RAID0块设备。

RAID01与RAID10类似,其差异是先构建成RAID0,然后再RAID0虚拟设备构建为RAID1。如图是6块物理硬盘的RAID01,大家可以与上图自行对比一下。另外,大家可以自行思考一下哪种类型的可靠性更高?

这种将两种不同类型RAID构建成一个RAID的方式称为复合RAID。既然RAID1和RAID0可以构建复合RAID,那么RAID5和RAID6肯定也是可以跟RAID0构建符合RAID的。这样,我们就可以构建出RAID50、RAID60等复合RAID来。

本文主要介绍了RAID的常见等级,接下来我们会以Linux为例介绍一下如何构建这些RAID,并且结合Linux内核介绍一下实现细节。

0 comments:

VxWorks

Blog Archive