raid原理
1、RAID 0
RAID 0是把n个物理磁盘虚拟成一个逻辑磁盘,即形成RAID 0的各个物理磁盘会组成一个逻辑上连续,物理上也连续的虚拟磁盘。一级磁盘控制器(指使用这个虚拟磁盘的控制器,如果某台主机使用配适卡链接外部盘阵,则指的就是主机上的磁盘控制器)对这个虚拟磁盘发出的指令,都被RAID控制器收到并分析处理,根据Block映射关系算法公式转换成对组成RAID0的各个物理盘的真实物理磁盘IO请求指令,收集或写入数据之后,再提交给主机磁盘控制器。
RAID 0也称为条带化存储,它代表了所有RAID级别中最高的存储性能。无数据校验,下面分析从上到下访问RAID 0磁盘的过程。
假如某一时刻,主机控制器发出指令:读取初始扇区10000长度128
RAID控制器接收到这个指令之后,立即进行计算,根据对应公式算出10000号逻辑扇区所对应的物理磁盘的扇区号,然后依次算出逻辑上连续的下128个扇区所在物理磁盘的扇区号。分别向对应这些扇区的磁盘再次发出指令。这次是真是的读取数据了,磁盘接受到指令,各自将数据提交给RAID控制器,经过控制器在Cache中的组合,再提交给主机控制器。
经过以上过程,发现如果这128个扇区都落在同一个Segment中的话,也就是说条带深度容量大于128个扇区的容量(64KB),则这次IO就只能真实地从这一块物理盘上读取,性能和单盘相比会减慢,因为没有任何优化,反而还增加了RAID控制器额外的计算开销。所以,在某种特定条件下要提升性能,让一个IO尽量扩散到多块物理盘上,就要减小条带深度。在磁盘数量不变的条件下,也就是减小条带大小(Stripe SIZE,也就是条带长度),让这个IO的数据被控制器分割,同时放满一个条带的第一个Segment、第二个Segment等,以此类推,这样就能极大地占用多块物理盘。
所以RAID 0要提升性能,条带做的越小越好。但是有一个矛盾出现了,就是条带太小,导致并发IO几率降低,因为如果条带太小,则每次IO一定会占用大部分物理盘,队列中的IO就只能等待这次IO结束后才能使用物理盘,而条带太大,又不能充分提高传输速度。这两个是一对矛盾,要根据需求采用不同的方式。
2、RAID 1
RAID 1称为镜像,它将数据完全一致地分别写到工作磁盘和镜像 磁盘,它的磁盘空间利用率为 50% 。 RAID1 在数据写入时,响应时间会有所影响,但是读数据的时候没有影响。
对于RAID 1的写IO,速度不但没有提升,而且有所下降,应为数据要同时向多块物理盘写,时间以最慢的那个为准,因为是同步的。而对于RAID 1的读IO请求,不但可以并发,而且就算顺序IO的时候,控制器也可以像RAID 0一样,从两块物理盘上同时读数据,提升速度。
在读、并发IO模式下,由于可以并发N个IO,每个IO占用一个物理盘,这就相当于提升了N倍的IOPS。由于每个IO只独占了一个物理盘,所以数据传输速度相对于单盘并没有改变,所以不管是随机还是顺序IO,相对单盘都不变
3、RAID 2
RAID2 称为纠错海明码磁盘阵列,其设计思想是利用海明码实现数据校验冗余。海明码是一种在原始数据中加入若干校验码来进行错误检测和纠正的编码技术,其中第 2n 位( 1, 2, 4, 8, … )是校验码,其他位置是数据码。因此在 RAID2 中,数据按位存储,每块磁盘存储一位数据编码,磁盘数量取决于所设定的数据存储宽度,可由用户设定。图 4 所示的为数据宽度为 4 的 RAID2 ,它需要 4 块数据磁盘和 3 块校验磁盘。如果是 64 位数据宽度,则需要 64 块 数据磁盘和 7 块校验磁盘。可见, RAID2 的数据宽度越大,存储空间利用率越高,但同时需要的磁盘数量也越多。
海明码自身具备纠错能力,因此 RAID2 可以在数据发生错误的情况下对纠正错误,保证数据的安全性。它的数据传输性能相当高,设计复杂性要低于后面介绍的 RAID3 、 RAID4 和 RAID5 。
4、RAID 3
RAID 3是使用专用校验盘的并行访问阵列,它采用一个专用的磁盘作为校验盘,其余磁盘作为数据盘,数据按位可字节的方式交叉存储到各个数据盘中。RAID3 至少需要三块磁盘,不同磁盘上同一带区的数据作 XOR 校验,校验值写入校验盘中。 RAID3 完好时读性能与 RAID0 完全一致,并行从多个磁盘条带读取数据,性能非常高,同时还提供了数据容错能力。向 RAID3 写入数据时,必须计算与所有同条带的校验值,并将新校验值写入校验盘中。一次写操作包含了写数据块、读取同条带的数据块、计算校验值、写入校验值等多个操作,系统开销非常大,性能较低。
如果 RAID3 中某一磁盘出现故障,不会影响数据读取,可以借助校验数据和其他完好数据来重建数据。假如所要读取的数据块正好位于失效磁盘,则系统需要读取所有同一条带的数据块,并根据校验值重建丢失的数据,系统性能将受到影响。当故障磁盘被更换后,系统按相同的方式重建故障盘中的数据至新磁盘。
RAID3 只需要一个校验盘,阵列的存储空间利用率高,再加上并行访问的特征,能够为高带宽的大量读写提供高性能,适用大容量数据的顺序访问应用,如影像处理、流媒体服务等。目前, RAID5 算法不断改进,在大数据量读取时能够模拟 RAID3 ,而且 RAID3 在出现坏盘时性能会大幅下降,因此常使用 RAID5 替代 RAID3 来运行具有持续性、高带宽、大量读写特征的应用。
RAID 3的每一个条带,其长度被设计为一个文件系统快的大小,深度随磁盘数量而定,但是最小深度为1个扇区,这样的话,每个Segment的大小一般就是1个扇区或者几个扇区的容量
例解:RAID 3的作用机制
用一个4块数据盘和1块校验盘的RAID 3系统,Segment SIZE为两个扇区大小(1KB),条带长度为4KB
RAID 3控制器接收到了这样一个IO:写入初始扇区10000 长度8,即总数量为8*512B=4KB
控制器先定位LBA10000所对应的真是物理LBA,假如LBA10000恰好在第一个条带的第一个Segment的第一个扇区上,那么控制器将这个IO数据里的第1、2个512B写入这个扇区。同一时刻,第3、4个Segment中,此时恰好是4KB的数据量。也就是说这4KB的IO数据同时被分别写入了4块磁盘,没块磁盘写入了两个扇区,也就是一个Segment。它们是并行写入的,包括校验盘也是并行写入的,所以RAID 3的校验盘没有瓶颈,但是有延迟,因为增加了计算校验的开销。
如果IO SIZE大于条带长度,如控制器收到的IO SIZE为16KB,则控制器一次所能并行写入的是4KB,这16KB就需要分4批来写入4个条带,其实这里的分4批写入不是先后写入,而是同时写入,也就是这16KB中的第1、5、9、13KB将由控制器连续写入磁盘1,第2、6、10、14连续写入磁盘2,以此类推。直到16KB数据全部写完,是并行一次写完。这样校验盘也可以一次性计算校验值并且和数据一同并行写入,而不是分批。
5、RAID 4
RAID 4并不常见,其原理是在一级磁盘控制器驱动程序的上层,也就是文件系统层将队列中的IO目标LBA进行扫描,将目标处于同一条带的IO让其并发写入。也就是将两个不同事务的IO写操作,尽量放到相同的条带上,以提升写效率。最典型的的就是NetApp公司著名的WAFL文件系统,WAFL文件系统的设计方式确保了能够最大限度地实现整条写操作。WAFL总是把可以合并写入的数据块尽量同时写到一个条带中,以消除写惩罚,增加IO并发系数。
6、RAID 5
先介绍几个概念:
整条写(Full-Stripee Write):需要修改奇偶校验群组中所有的条带单元,因此新的XOR校验值可以根据所有新的条带数据计算得到,不需要额外的读、写操作。因此,整条写是最有效的写类型。整条写的例子,RAID 2、RAID 3.它们每次IO总是几乎能保证占用所有盘,因此每个条带上的每个Segment都被写更新,所以控制器可以直接利用这些更新的数据计算出校验数据之后,在数据被写入数据盘的同时,将计算好的校验信息写入校验盘。
重构写(Reconstruct Write):如果要写入的磁盘数目超过阵列磁盘数目的一半,可采取重构写方式。在重构写中,从这个条带中不需要修改的Segment中读取原来的数据,再和本条带中所有需要修改的Segment上的新数据一起计算XOR校验值,并将新的Segment数据和没有更改过的Segment数据以及新的XOR校验值一并写入。显然,重构写要牵扯更多的I/O操作,因此效率比整条写低。
读改写(Read-Modify Write):如果要写入的磁盘数目不足阵列磁盘数目的一半,可采取读改写方式。读改写过程是:先从需要修改的Segment上读取旧的数据,再从条带上读取旧的奇偶校验值;根据旧数据、旧奇偶校验值和需要修改的Segment上的新数据计算出这个条带上的新的校验值;最后写入新的数据和新的奇偶校验值。这个过程中包括读取、修改和写入的一个循环周期,因此称为读改写。读改写计算新校验值的公式为:新数据的校验数据=(老数据 EOR 新数据)EOR 老校验数据。如果待更新的Segment已经超过了条带中总Segment数量的一半,则此时不适合用读改写,因为读改写需要读出这些Segment中的数据和校验数据。而如果采用重构写,只需要读取剩余不准备更新数据的Segment中的数据即可,而后者数量比前者要少。所以超过一半用重构写,不到一半用读改写,整条更新就用整条写。
写效率排列顺序为:整条写>重构写>读改写。
RAID 5解决了校验盘争用这个问题,RAID 5采用分布式校验盘的做法,将校验盘打散在RAID组中的每块磁盘上。每个条带都有一个校验Segment,但是不同条带中其位置不同,在相邻条带之间循环分布。为了保证并发IO,RAID 5同样将条带大小做得较大,以保证每次IO数据不会占满整个条带,造成队列中其他IO的等待。所以,RAID 5要保证高并发率,一旦某时刻没有成功进行并发,则这个IO几乎就是读改写模式,所以RAID 5拥有较高的写惩罚。
分析一下RAID 5具体的作用机制,假设条带大小80KB,每个Segment大小16KB。某一时刻,上层产生一个写IO:写入初始扇区10000长度8,即写入4KB的数据。控制器收到这个IO之后,首先定位真是LBA地址,假设定位到了第1个条带的第2个Segment(位于磁盘2)的第1个扇区,则控制器首先对这个Segment所在的磁盘发起IO读请求,读取这8个扇区中原来的数据到Cache。与此同时,控制器也向这个条带的校验Segment所在的磁盘发起IO读请求,读出对应的校验扇区数据并保存到Cache。利用EOR校验电路来计算新的校验数据,公式为:新数据的校验数据=(老数据 EOR 新数据)EOR 老校验数据。现在Cache中存在:老数据、新数据、老校验数据和新校验数据。控制器立即再次向相应的磁盘同时发起IO写请求,将新数据写入数据Segment,将新校验数据写入校验Segment,并删除老数据和老校验数据。
在上述过程中,这个IO占用的始终只有1、2两块盘,因为所要更新的数据Segment对应的校验Segment位于1盘,自始至终都没有用到其他任何磁盘。如果此时队列中有那么一个IO,它的LBA初始目标假如位于磁盘4中的数据Segment中,IO长度也不超过Segment的大小,而这个条带对应的校验Segment位于磁盘3上。这两块盘未被其他任何IO占用,所以此时控制器就可以并发的处理这个IO和上一个IO,达到并发。
RAID 5相对于经过特别优化的RAID 4来说,在底层就实现了并发,可以脱离萎蔫系统的干预。
7、RAID 6
RAID 6之前的任何RAID级别,最多能保障在坏掉一块盘的时候,数据仍然可以访问。如果同时坏掉两块盘,则数据将会丢失。为了增加RAID 5的保险系数,RAID 6被创立了。RAID 6比RAID 5多增加了一块校验盘,也是分布打散在每块盘上,只不过是用另一个方程式来计算新的校验数据。这样,RAID 6同时在一个条带上保存了两份数学上不相关的校验数据,这样能够保证同时坏两块盘的情况下,数据依然可以通过联立这两个数学关系等式来求出丢失的数据。RAID 6与RAID 5相比,在写的时候会同时读取或者写入额外的一份校验数据。不过由于是并行同时操作,所以不比RAID 5慢多少。其他特性则和RAID 5类似。