引言:RAID技术是现代大规模存储的基础,“基础(技术)是拿来革命的”。我查raid相关资料时,查布尔运算,竟然一路查到“香农原理”,这不是有个视频中HW的任总提到的吗,多基础的东西,任总却毫不含糊,他的认知真不是盖的,我们这等小辈又有什么理由不去努力提高自己的认知呢。同时我突然也意识到了,为什么国家和这些伟大的企业家重视基础技术的研究,所以就冒出来了上面的语录!思量了许久!!这也是为什么冬瓜头在他的书里面花了大量篇幅来写RAID,甚至把编小说的功夫都用上了!嗯,进入正题。
背景:前面章节介绍过磁盘读写速度主要限制在于磁头臂的切换即寻道,为了避免磁头被不断打断的问题,人们发明了RAID技术,让一个硬盘的磁头在换道时,另一个磁盘的磁头在读写。如果很多磁盘联合起来,同一时刻总有某块硬盘的磁头在读写状态而不是都在换道状态,这就相当于一个大虚拟磁盘的磁头总是处于读写状态,极大的提升传输速率。
RAID,Redundant Array of Independent Disks,独立硬盘冗余阵列,简称磁盘阵列。从技术提出的背景可以看出,RAID是大量磁盘紧密合作的方式,既可以提升速率,同时又可以做到冗余,而对用户和操作系统来说看起来像一个单独的更大的硬盘或逻辑存储单元。RAID功能的实现可以用独立的RAID卡来支持,也可以有效地与主板进行集成。随着技术的发展,目前RAID已经形成很多个规范,每个规范又可称作一种级别。
一、基础概念
在介绍RAID级别之前,有必要先介绍下相关的基础技术。最重要的就是条带和IO:条带是随着RAID提出来的;IO这里指数据的写入和读出,在存储系统中可以分成很多类别。
1、条带,Stripe
首先,条带是虚拟的概念。硬盘物理上划分的最小单位是扇区(以往文章提到过)。而文件系统有时会将多个(2的n次方)扇区作为块或者簇来作为数据操作的最小单位,即逻辑最小单位。
条带和扇区、块没有必然的关系。但是任何磁盘读写都离不开文件系统和硬盘,所以后面会用到扇区、块这两个概念。
条带是将多个并排的磁盘横向切割,即在每个磁盘相同偏移处横向逻辑切割。
跨过的磁盘磁盘个数(或块的个数或字节容量)称为条带长度,Stripe Length;或者叫条带宽度,Stripe Width。
而单个磁盘上占有的区域为段,Segment。
段包含的字节数(或块的个数或扇区的个数)为条带深度,Stripe Depth。
条带化是RAID技术抽象出来的一种设计方法,便于多个磁盘之间建立一种逻辑关系,便于提高IO并发能力。
从上面概念看,条带长度一般不变,所以整个条带大小和条带深度有关,所以条带深度也指的是条带的大小,也叫条带大小。
2、IO相关概念
存储IO,都是围绕数据的Input和Output,这里既有最终磁盘的读写,也有传输的IO,控制器缓存IO等等。这里介绍常见的几个概念:
(1)IOPS
磁盘的IOPS,即每秒能进行多少次IO。计算方式每个系统每个模块的定义和要求不一样。我们这里指一般情况下,一条I或O命令对应磁盘写或读一定范围内连续的数据的操作,除了开始执行读写命令前可能需要寻道外,其他时间不需要换道。那么完成一次IO所用的时间=寻道时间+旋转延迟时间+数据传输时间。该值越少,IOPS越高。由于寻道时间相对于传输时间要大几个数量级。所以影响IOPS的关键因素是降低寻道时间。而在连续IO的情况下,寻道时间很短,仅在换磁道时候需要寻道,所以此时传输时间越少,IOPS越高。
(2)连续IO/随机IO
连续和随机指本次IO给出的初始扇区地址和上一次IO结束扇区地址是不是完全连续的或者相隔不多的,是则是连续IO,否则随机IO。
(3)顺序IO/并发IO
磁盘控制器如果可以同时对一个RAID系统中的多块磁盘同时发送IO指令(这里的同时是宏观的概念,即如果所有磁盘都在一个总线或者环路上,则这里的同时是指向一块一块磁盘依次发送IO指令,只是不必等待每次的回应),并且这些最底层的IO数据包含了文件系统下发的多个IO数据,则为并发IO,即多个IO流同时传输和读写。
如果这些发向磁盘的IO只包含了文件系统的一个IO的数据,则为顺序IO,即一个时间点只有一个IO流传输和读写。所以我觉得改为“串行IO”更好理解。
二、RAID基本级别
RAID分为8个级别,不同的级别满足不同的应用程序的需求。
1、RAID 0:并发IO
按条带化,将数据并行发送给所有磁盘。
最大的优势,读写性能很高。
致命缺点:数据没有冗余,如果一个磁盘损坏,整个存储崩溃。
注意:前面提到,这种并发是”宏观的同时“,RIAD0要提升性能,条带越小越好。但是太小了,要等待下一轮IO的时间变成长次数变多。因为每次IO占用较多物理盘,而队列中的IO必须等待这次IO结束后才能使用物理盘。
IO SIZE/Stripe SIZE 较小,性能提升明显。
2、RAID 1:镜像IO
RAID 1将数据在两个以上的磁盘中形成镜像,读可以并发,写一般不能并发,除非事务性写。
优势:数据有冗余,读性能提高。
缺点:有效空间只能占一半,空间利用率低。写性能有所下降,因为需要写两次,所以时间以最慢的磁盘为准。
注:条带可有可无。
3、RAID 2:汉明码校验
Hamming Code ECC汉明码错误检测与修正,一种早期的纠错技术。在原有数据位中插入一定数量的校验位来进行错误检测和纠错。
RAID 2中,每个IO下发的数据被以位为单位平均打散在所有数据盘上,同时计算出汉明码并写入校验盘。数据盘和校验盘都有多块,即有各自的阵列。汉明码只能纠正一个位的错误,所以只允许一个盘损坏。
缺点:校验盘数量太多(四块数据盘需要三块校验盘),开销太大以及成本昂贵,目前基本已经被淘汰。
补:磁盘数据以位单位?磁盘的最小单位是扇区512字节,怎么以位为单位呢?假如四个数据盘,如果一次写入4KB,第一块存放的是第1.5.9.13等位的数据,第二块存放的是2.6.10.14等位的数据,如此分割。
RAID 2不能实现并发IO,因为每次IO都占用了所有物理盘。
4、RAID 3:奇偶校验
对数据磁盘采用高效的XOR运算,将结果放在单独的校验盘。所以同样允许一块磁盘损坏。
RAID 3分割的单位是字节或者扇区(各个文献上说法不一样,总之是比较小),比RAID2增大了,但还是很小。IO传输和磁盘读写操作和RAID 2类似。
优点:校验盘只需一块,成本降低了;持续读和写性能几乎是单盘的N倍。
注:RAID 3和RAID 2一样不能并发IO,因为一个IO占用所有磁盘。两者也同样适合连续大块IO的环境,而RAID3成本更低,更容易部署。
5、RAID 4
6、RAID 5:并发IO+奇偶校验
采用和RAID 3一样的高效的XOR运算,不同的是将校验数据打散在各个盘,即不是固定某个盘,所以也称作分布式校验盘。
正是因为校验数据位置不固定,所以每次IO可以不需要所有的磁盘参与,从而可以实现并发IO。
所以最低可以并发IO的RAID5至少需要4块盘。同理,如果数据盘足够多,校验盘打散的部分就会分布的足够广泛,多IO并发的几率就会显著增大。
最大的优势是,随机读性能很高,所有RAID模式中首屈一指。
但是,RAID 5的连续读性能没有RAID 3高。
缺点:写性能较差,根本原因在于每写一扇区的数据就要产生其校验扇区,一并写入校验区。龙其实更改数据(随机写)的时候,这种效应非常明显,因为要有写惩罚。
补:(1)写惩罚(Write Penalty )
RAID 5一次写的动作,其实要浪费3个其他动作,也就是先读出老数据,读出老校验数据,然后写新数据和校验数据。而目的只是写新数据。
而RAID 2和RAID 3都比RAID 5写性能强,因为它们在条带深度很小,任何一次正常点的IO几乎覆写所有盘,均会将整个条带上的位都改变,即不要顾忌是否有未被更新的数据,所以可以直接写入新数据和校验数据,比RAID 5少了两次读操作。
(2)RAID 5E和RAID 5EE
RAID 5E在RAID 5的基础上,每个数据盘预留一块固定的空间,深度为条带深度,所以也就是说预留一个条带,作为热备。当出现磁盘坏块时,能及时备份数据。
RAID 5EE在RAID 5E的基础上有所改进:将固定的”热备盘“打散到各个数据磁盘中。
实际上,现在的LSI工具能支持外围设置热备盘,而且可以灵活使用,可以每个RAID组做热备盘,也可以全部磁盘(多个RAID组)做一个热备,两种还可以同时出现。
注:在RAID策略中,随机并发与写性能二者取其一。
这里提到的是顺序写。一般的RAID对随机IO,(特别是随机写)其性能与单盘都没有大的优势,因为RAID所做的只是提高传输速率、并发IO和容错。
但是RAID 5在随机写频发的情况下,由于频发的随机IO提高了潜在的并发几率,如果碰巧并发的IO同处一个条带,还可以降低写惩罚的记录。这样其IOPS下降的趋势比其他RAID级别要平缓一些。
所以,磁盘越多,可并发的几率越大;RAID 5最适合小块IO。而若使用“回写高速缓存”可以让性能改善不少。
应用:关系型数据、读密集型数据库表格、文件共享和Web应用程序。
7、RAID 6:并发IO+双奇偶校验
与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。仍然保留RAID 5的条带化校验,RAID 6加了另一种奇偶校验:条带数据乘以逆矩阵再奇偶校验(注【1】)。可以同时坏两个盘。
优点,冗余度更好,提高了可靠性。
缺点,比RAID 5的写性能更差,因为有更大的写惩罚,一次写入需要6次操作。
8、RAID 7
RAID 7全称叫“Optimized Asynchrony for High I/O Rates as well as high Data Transfer Rates(最优化的异步高I/O速率和高数据传输率)”,它与以前我们见到RAID级别具有明显的区别。RAID 7完全可以理解为一个独立存储计算机,它自身带有操作系统和管理工具,完全可以独立运行。
二、RAID组合级别
1、RAID 01(RAID 0+1)
RAID 01兼容RAID 0和RAID 1的优点,提供RAID 1一样的数据安全保证的同时,也提供了与RAID 0近似的存储性能。
先做RAID 0磁盘组,再2组RAID 0做成RAID 1。假如有八块盘和四块数据A,B,C,D;那么八块盘依次存放的是A,B,C,D;A,B,C,D。
这种情况下,如果第一个A出问题,那么第一组A,B,C,D全都无效了。
可靠性较低。
2、RAID 10(RAID 1+0)
RAID 10和RAID 01基本原理相近,只是组合方式不同。
先两两分组,再将各组做成RAID0。还是上面的例子,假如有八块盘和四块数据A,B,C,D;那么八块盘依次存放的是A,A,B,B,C,C,D,D。
这种情况下,如果第一个A出问题,除了第二个A没有镜像外,其他都没有影响。允许坏多个盘,只要不是一对磁盘坏就可以。
可靠性高,所以RAID 10远较RAID 01常用。
3、RAID 30
提升RAID 3的并发IO能力,两组RAID 3再组建成RAID 0。兼容RAID 0并发IO和RAID 3安全的优点。
4、RAID 50
由两组RAID 5磁盘组成(每组最少3个),每一组都使用了分布式奇偶位,而两组硬盘再组建成RAID 0,实现跨磁盘抽取数据。
RAID 50最少需要6块磁盘,它最适合需要高可靠性存储、高读取速度、高数据传输性能的应用。这些应用包括事务处理和有许多用户存取小文件的办公应用程序。
5、RAID 53
从前面的原理我们可以得出 :RAID 5 适合小块存储,RAID 3适合大块存储;所以从这里看两者是有冲突的,而从百度百科查到RAID53的定义是:
RAID 53是一种组合RAID 等级,但不要拿RAID 10的观点套用,认为它是RAID 5和RAID 3的组合,事实上,RAID 53应该称为RAID 30或RAID 03(也可以说是RAID 0+3),即RAID 3与RAID 0的组合。
也可以理解成RAID53兼容了RAID 3较高的读写性能和RAID 5良好的并发能力。
6、RAID: LSI MegaRAID、Nytro和Syncro
MegaRAID、Nytro和Syncro都是LSI 针对RAID而推出的解决方案,并且一直在创造更新。LSI通过MegaRAID提供基本的可靠性保障;通过Nytro实现加速;通过Syncro突破容量瓶颈,让价格低廉的存储解决方案可以大规模扩展,并且进一步提高可靠性。
注【1】:关于RAID 6第二种校验查过很多资料, 大都含糊其辞,或者说法各不相同。很多的只是说整块磁盘的奇偶校验,这个明显说不过去。有一些说的是多项式,有一些说的矩阵。待考究。
参考资料:《大话存储II》和百度百科。