RAID基础知识

并发性指的多个程序同时从磁盘组中读取多个数据。对于随机小块IO来说,并发性非常重要。怎么才能实现并发IO呢?其实很简单,就是一个磁盘组在被某个IO使用的时候还有一些磁盘没有被使用,且这些磁盘也能满足IO的需要,那么就能同时两个IO咯。最简单的就是RAID1,其在读的时候并发行为2.

条带深度:在一个硬盘中写满多少个块才开始写下一个硬盘,这个块个数就是条带深度。

要实现并发(注意并发的意义是多个用户同时访问,而不是多个磁盘同时工作),条带深度就得大!比如2快盘,一个数据块不足一个条带深度,所以写在了一块盘上就ok了,这个时候呢其它数据块也能完全写在另一个盘上,这样不就同时写了嘛,不就并发了嘛。但是呢如果你条带深度太小,一个数据块铁定在一块盘上不够,要同时写两块盘,那么就不能并发了。

举个例子说明两个并发的区别。对于多个磁盘同时工作,但同一时刻只有一个用户能用的并发,虽然这个用户取数据的数度是很快,但是当他取大量数据的时候,系统对于其它用户来说IO几乎是卡死的。但是对于能多个用户并发使用的系统来说,虽然一次只能从少数几个盘读取数据,但是哪怕数据量很大,也不一定会卡死其它用户。对于后者,典型的代表就是RAID5的读。

减小条带深度,能让多块盘同时工作,但是不能让多个用户同时使用!

条带长度=条带深度X盘数

校验盘一般只在出错的时候有用,平时读的时候基本上没有任何影响(除了RAID2,它的纠错是在RAID级别纠错,而一般的纠错在OS软件层面纠错)。

RAID在初始化的时候需要格式化,这个过程包括实现生成校验值,如RAID5的校验值事先生成,用的是磁盘上的垃圾数据。

RAID需要用磁盘的一部分用于存放信息。

热备盘:比如RAID5中有一块盘坏掉,那么就会把那块坏掉的盘上的数据写入到热备盘中。

RAID0:数据块分成多个扇区,并行的写入多个磁盘。这里有了条带的概念。一次写入是写入一个条带,每个条带包含多个扇区,扇区分布在多个盘上。条带是个逻辑上的东西,由程序更具算法实现。对于大块数据,利用条带的并行IO可以提高很大的速率。但是RAID0太脆弱了,随便哪块盘坏了都会让整个磁盘坏掉。
RAID1:两个磁盘上保存相同的内容。安全性很好。读的时候可以允许两个人同时读。但是当只有一个人读的时候,只能一次读一个盘的数据。写的时候速度也会有所影响。最大的缺点是浪费的太多。
RAID2:检验算法为汉明码。算法的思想是不管多少个数字(比特位),只要有一个数据坏了,就能用校验盘去纠正。汉明码在原有的数据位中插入了一定数量的校验位来进行错误检测和纠正。
RAID3:每次IO把数据分散到所有数据盘,用XOR进行校验。存在数据盘和校验盘两种。如果文件系统使用一个4KB的逻辑块,在5快盘的RAID3中有四块数据盘,一块校验盘。这样的话可以把4BK分成4块,每块1KB,正好是两个扇区。这样文件系统的一次IO就恰好分散到了所有盘上。RAID3的并发只是一次IO能多个磁盘共同处理,但是不能处理多个并发请求。一次还是只能处理一个。RAID3的持续读几乎是单盘的N倍,N为数据盘的个数。持续写也是N倍。RAID3中不存在什么热点,所有盘写的概率是一样的。数据盘和校验盘在写的时候都是各写一次。对于随机读写,由于换道时间远远高于传输时间,所以即便传输时间缩减到了N分之1,但还是比不上各个磁盘同步所需要的开销。所以随机读写是没有提高的,甚至会比单盘满。
RAID4:可以无视。目的是为了实现类似RAID1的并发IO。核心思想是加大IO条带深度,如果你一个数据块的大小不足一个条带深度的一半,那也就是说还有一半的盘空着呢,可以让别人来使用。然后读的时候呢就可以两个人分开来读了。但是由于它是在RAID3的基础上改良而来的,校验盘只有一块,所以写的时候其实还是只能一个个写。
RAID5:并发IO。把RAID4中的校验盘分散开来。如果要实现最少2个写并发,那至少要4快盘。但性能没有RAID3好,因为RAID3条带深度小,一次读写能用到所有磁盘。而RAID5和RAID4一样,为了实现并发IO,条带深度太大了。所以不是每次IO都能用到所有的盘。不过RAID5在随机读方面首屈一指。但是它的写性能很差。写的时候,由于算法原因,花的时间太多,甚至比RAID2和RAID3还慢,因为这两个家伙每次写都会用到所有盘,所以就不用用老的数据去计算校验值了,它们不用顾虑条带上是否还有未被更新的数据。
RAID6:RAID5由于使用了逻辑上的一块校验盘,所以允许一块盘坏掉。RAID6使用逻辑上的两块校验盘,所以允许两块盘坏掉。

详解:
首先,stripe是完全由程序在内存中虚拟出来的,说白了就是个map公式。这个程序呢就是RAID的程序代码。

对于IO,有下面几个概念:
读/写IO:一个读写IO读写的扇区段一定是连续的。如果要读取两个不连续的扇区段就得两个IO。
大/小块IO:更具连续读取的扇区数目的多少来决定。
连续/随机IO:指本次IO给出的初始扇区地址和上一次IO的结束扇区地址是不是完全连续或隔得不多。这主要影响换道时间。换道时间开销极大。
顺序/并发IO:如果磁盘控制器可以同时对一个RAID系统中的多块磁盘同时发出IO指令,就是并发IO。
持续/间断IO:持续不断的发送或接收IO称为持续IO。
稳定/突发IO:某存储设备或程序在一段时间内接收或者发送IOPS以及吞吐量保持相对和稳定则为稳定IO。
实/虚IO:请求命令中包含实际数据地址的,如LBA地址,就是实IO。如果是那种Report LUN之类的控制指令,就是虚拟IO。
IO并发几率:单盘IO并法律为0.对于RAID0,在2快盘的情况下,条带深度比较大的时候,并发IO几率为50%.
IOPS:完成一次IO所使用的时间=寻道时间+旋转延迟时间+数据传输时间。IOPS=IO并发系数/(完成一次IO所使用的时间)。也就是说这玩意在大数据块的时候会变慢,因为数据传输时间大了。影响IOPS的关键因素是降低寻道时间。
每秒IO吞吐量:每秒IO吞吐量=IOPS X 平均IO SIZE。如果磁盘写数据速度为V,则IOPS=IO并发系数/(寻到时间+旋转延迟时间+IO SIZE/V)。忽略旋转延迟和定制V,可以看到IOPS和IO SIZE以及寻道时间关系最大。

处理过程:
如RAID0:
对一个RAID0虚拟磁盘发出命令,一级磁盘控制器会的更具Block映射关系算法转换成对RAID0各个物理盘的真实物理磁盘IO请求。
比如,主机发送命令,读取初始扇区1000长度128个扇区。RAID0控制器收到这个指令后,立即进行计算,更具对应公式,算出1000号扇区的对应物理磁盘的扇区号,并依次计算出逻辑上连续的128个扇区的真实物理磁盘扇区号。然后再分别发出读指令。最后把读取的数据在cache中整合,还给请求者。

在来说明下RAID5:
先说几个概念:
整条写:需要修改奇偶校验组中的所有条带单元。RAID2、RAID3都是整条写的例子,一次用上所有盘。效率最高的写类型。
重构写:如果写入的磁盘数目超过阵列磁盘数目的一般,可以采取重构写。在重构写中,从这个条带中不需要修改的Segment中读取原来的数据,再和本条带中所有需要修改的Segment中的数据一起计算XOR校验值。
读改写:如果写入的磁盘数目不足阵列磁盘数目的一半,可以采用这个。过程是:更具需要修改的Segment上读取旧的数据,再从条带上读取旧的校验值,计算新的校验值,然后写入。

看个例子:条带大小80KB,深度(segment)为16KB,也就是5个盘:
某个时刻,上层来了一个写IO请求:写入初始扇区1000,长度8个扇区(也就是4KB,一个扇区512B)。控制器拿到这个请求后,先计算1000扇区的真实的LBA地址。然后开始写,但不能直接写,需要先读取被写的segment的老的数据以及老的存放该条带校验值的segment的数据,然后计算新的校验值,再把这些新东西写进去。

RAID5 磁盘数量越多,并发几率越大。

RAID卡:
配置的时候需要进入到RAID卡的硬件配置界面里进行。RAID卡实现了很多功能,他有自己的CPU、内存、ROM、总线和IO接口。RAID插在PCI上。它上面有个SCSI控制器,用于连接SCSI总线。也就是说本来直接插在PCI上的SCSI现在插在了RAID卡上。
和SCSI卡一样,如果RAID上面可以插多个SCSI,那么就是多通道RAID卡。但是这个通道个数是有限的。如果要很多个硬盘,那么就要用上磁盘阵列了。

RAID思想中的条带完全是逻辑上的东西。其实现完全由算法实现,这个算法的各个参数在RAID建立的时候指定。逻辑LBA地址(OS看到的地址)可以映射到一个或多个物理LBA地址,这种映射关系是没法在初始化之后改变的。这种映射是算法上的映射,所以不存在什么map的动动,没有包含map的表存在。而那些用于映射算法的配置参数则会的记录在磁盘上,这样这些磁盘可以用在其它RAID卡上。

高级RAID:
RAID50:RAID0是最上层,组成RAID0的磁盘在这里是一个个RAID5.实现方法则是直接在算法上实现。

RAID10:RAID0为最上层,组成RAID0的磁盘在这里是一个个RAID1.
RAID01:RAID1为最上层,组成RAID0的磁盘在这里是一个个RAID0.

RAID10冗余度要比RAID01高,安全性高。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*