大话存储系列5——RAID原理

整理自网络和大话存储2:

1、预备知识:条带化

当多个进程同时访问一个磁盘时,可能会出现磁盘冲突。大多数磁盘系统都对访问次数(每秒的 I/O 操作,IOPS)和数据传输率(每秒传输的数据量,TPS)有限制。当达到这些限制时,后面需要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。

    避免磁盘冲突是优化 I/O 性能的一个重要目标,而 I/O 性能的优化与其他资源(如CPU和内存)的优化有着很大的区别 ,I/O 优化最有效的手段是将 I/O 最大限度的进行平衡。

    条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。很多操作系统、磁盘设备供应商、各种第三方软件都能做到条带化。

    图 1 描述的是一个未经条带化处理的连续数据的分布,图 2 描述的是一个已经被条带化处理的连续数据的分布,从中比较,我们可以发现图 2 中对连续数据的读写都有最大的并发能力

图 1. 未经条带化处理的连续数据
理解磁盘条带化

 

图 2. 已经被条带化处理的连续数据

理解磁盘条带化

    由于条带化在 I/O 性能问题上的优越表现,以致于在应用系统所在的计算环境中的多个层次或平台都涉及到了条带化的技术,如操作系统和存储系统这两个层次中都可能使用条带化技术。
 

影响条带化效果的两个因素

    当对数据做条带化时,数据被切成一块块的小数据块,各小数据块分布存储在不同的硬盘上。从这个描述中我们可以看出,影响条带化效果的因素有两个,一是条带大小(stripe size),即数据被切成的小数据块的大小,另一个条带宽度(stripe width),即数据被存储到多少块硬盘上。

    条带宽度(stripe width)是指同时可以并发读或写的条带数量。这个数量等于RAID中的物理硬盘数量。例如一个经过条带化的,具有4块物理硬盘的阵列的条带宽度就是4。增加条带宽度,可以增加阵列的读写性能。道理很明显,增加更多的硬盘,也就增加了可以同时并发读或写的条带数量。在其他条件一样的前提下,一个由8块18G硬盘组成的阵列相比一个由4块36G硬盘组成的阵列具有更高的传输性能。

    条带大小(stripe size)有时也被叫做block sizechunk sizestripe length 或者 granularity。这个参数指的是写在每块磁盘上的条带数据块的大小。RAID的数据块大小一般在2KB到512KB之间(或者更大),其数值是2的次方,即2KB,4KB,8KB,16KB这样。

    条带大小对性能的影响比条带宽度难以量化的多。

    ·减小条带大小: 由于条带大小减小了,则文件被分成了更多个,更小的数据块。这些数据块会被分散到更多的硬盘上存储,因此提高了传输的性能,但是由于要多次寻找不同的数据块,磁盘定位的性能就下降了。

    ·增加条带大小: 与减小条带大小相反,会降低传输性能,提高定位性能。

    根据上边的论述,我们会发现根据不同的应用类型,不同的性能需求,不同驱动器的不同特点(如SSD硬盘),不存在一个普遍适用的"最佳条带大小"。所以这也是存储厂家,文件系统编写者允许我们自己定义条带大小的原因。不同条带大小,对于文件如何存储有很大的影响,请看下边这两幅图的对比:

理解磁盘条带化理解磁盘条带化
    这是一个由4块硬盘组成的RAID0阵列,左边的条带大小为4KB,右边的条带大小为64KB。

左边的图中的每一条细格表示4KB大小。

    图中红色文件大小是4KB,蓝色文件大小20KB,绿色文件大小为100KB,紫色文件大小为500KB。

    从图中我们可以看到,不同条带大小对"中型大小"文件的影响是很大的。对于红色的4KB文件来说,不论条带是4KB还64KB,它都分布在一块硬盘的一个数据块上。而对于紫色的500KB文件来说,无论条带是4KB还是64KB,它都会被分布在四块硬盘上。

    但是对于蓝色20KB的文件来说,如果采用64KB的条带大小,则它就会被分布在一块硬盘上,而不是像4KB条带时那样分布在四块硬盘上。同样绿色的100KB文件在64KB条带时,会被分布到2块硬盘,而4KB条带时则分布到4块硬盘上。可以看到,增加条带大小可以明显地增加定位性能。在上边的例子中,条带宽度理所当然是4。

    下图是使用16KB条带时的文件分布图,可以对应参考理解一下。
理解磁盘条带化
     那么我们应该选择多大的条带大小呢?最好的办法是尝试不同组合,根据应用的不同得到自己的经验规律。另外,不要过高估计不同条带大小间的性能差异。它有可能会差的很大,尤其是设置成4KB和256KB这样两个相对极端数值的时候,但对于相差不大的数值,它们的性能差异可能就不明显。对于大多数应用来说,可以参考这样的经验法则:大量的小文件读写时,采用较大的条带大小(定位效果好);少量的大文件的快速访问,采用比较小的条带(传输速率高);如果要平衡这两者,那么采用中间值。



硬RAID与软RAID的区别:
通过用硬件来实现RAID功能的就是硬RAID,比如:各种RAID卡,还有主板集成能够做的RAID的都是硬RAID。
通过用操作系统来完成RAID功能的就是软RAID,比如:在Windows2000操作系统下,用三块硬盘做的RAID5.不过软件实现RAID有很多缺点,比如占用内存空间,占用cpu资源,软件raid程序无法将安装有操作系统的那个磁盘分区做成raid模式。因为raid程序是运行在操作系统之上的,所以在启动操作系统之前,是无法实现raid功能的。也就是说,如果操作系统损坏了,raid程序也就无法运行,磁盘上的数据就成了一度无用的东西。因为raid磁盘上的数据只能实现相应raid算法的程序才能识别并且正确读写。如果没有相应的raid程序,则物理磁盘上的数据仅仅是一些碎片而已,只有raid程序才能组合这些碎片。

不过,目前大多数的raid程序都会在磁盘上存储自己的算法,信息,一旦操作系统出现了问题,或者主机硬件出现了问题,就可以将这些磁盘连接到其他机器上,在安装相同的raid软件。raid软件读取在硬盘上固定区域的raid信息后,边可以继续使用。

总的来说,软件实现的raid缺点太多,硬件raid卡才是主流。


7种RAID技术简介:

首先说明一下,这个是我自己用来回忆的,具体的raid0-6的标准,技术实现还是各位自己google吧,不过如果你也是有些熟悉,但是分不清楚,下面的整理会让你的思路清晰一点:

RAID 0:RAID 0连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,因此并不能算是真正的RAID结构。RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0不能应用于数据安全性要求高的场合。
另外顺便讲点其他的名词,就看上面的图吧:
条带长度(stripe length):一个条带所包含的所有数据块,或者总的字节数,或者扇区的个数(只不过单位不一样)。
段(Segment):一个条带在一块硬盘上所占有的数据块的数量或者说扇区的个数(也是单位一样罢了),顺便说下,一个扇区512B,一个块一般4KB=8个扇区。
条带深度(Stripe depth):一个段(segment)包含的数据块数量,或者说扇区数,或者说总的字节数(还是单位不一样罢了)
条带宽度(Stripe width):一个条带跨越的磁盘数量。

RAID 1:它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

RAID 0+1:也被称为RAID 10标准,实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低。

RAID 2:将数据条块化地分布于不同的硬盘上,条块单位为或字节,并使用称为“加重平均纠错码(海明码)”的编码技术来提供错误检查及恢复。这种编码技术需要多个磁盘存放检查及恢复信息,使得RAID 2技术实施更复杂,因此在商业环境中很少使用。可以简单的理解校验是用的加减法则,如果数据盘大于两个,比如1+1+0=10(三个数据盘,两个个校验盘),这个时候校验数据是两位:10,是向每个磁盘写的数据量的两倍,也就是说需要两块校验盘来实现,这样一来,对磁盘的浪费就比较严重了。

RAID 3:它同RAID 2非常类似,都是将数据条块化分布于不同的硬盘上,区别在于RAID 3使用简单的奇偶校验,并用单块磁盘存放奇偶校验信息。如果一块磁盘失效,奇偶盘及其他数据盘可以重新产生数据;如果奇偶盘失效则不影响数据使用。RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据来说,奇偶盘会成为写操作的瓶颈。可以这样理解,它与raid2相比,最大的好处是无论数据盘有多少块,只用了块校验盘,这事怎么实现的呢?很简单,逻辑的“与或”运算来实现(1 xor 0 = 0 xor 1 = 1 ; 1 xor 1 = 0 xor 0 =0 ),比如说1 xor 0 xor 1 =0(注意校验结果是1位,这样无论式子左边有几个数据(代表了几块盘,右边只需要一块校验盘,即一个校验位)),另外raid3 改进了raid2以位为单位的写入规则,改成了以段(或者说块)为单位的写入。
 
RAID 4:RAID 4同样也将数据条块化并分布于不同的磁盘上,但条块单位为块或记录(相比月raid3,加大了条带的深度,这样希望每次IO只用到部分磁盘,期望达到并发IO的目的,但是没有考虑到校验盘的IO【瓶颈问题,这就是RAID4的败笔)。RAID 4使用一块磁盘作为奇偶校验盘,每次写操作都需要访问奇偶盘,这时奇偶校验盘会成为写操作的瓶颈,因此RAID 4在商业环境中也很少使用。

RAID 5:RAID 5不单独指定的奇偶盘,而是在所有磁盘上交叉地存取数据及奇偶校验信息。在RAID 5上,读/写指针可同时对阵列设备进行操作,提供了更高的数据流量。RAID 5更适合于小数据块和随机读写的数据。RAID 3与RAID 5相比,最主要的区别在于RAID 3每进行一次数据传输就需涉及到所有的阵列盘;而对于RAID 5来说,大部分数据传输只对一块磁盘操作,并可进行并行操作。在RAID 5中有“写损失”,即每一次写操作将产生四个实际的读/写操作,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。

在这里我们讲一下,整条写,重构写,读改写 的概念:
整条写: 每个条带上的segment都更新,不需要额外的读写操作,写性能最好 ,例如raid2 , raid3 都是这样的。
重构写: 当需要写入的磁盘数目超过阵列磁盘的一半时采取该方式(1)从不需要修改的segment中读取原来的数据,再和本条带中所有需要修改的segment上的新数据一起计算XOR校验值(2)将新的segment数据和没有更新过的segment数据以及新的XOR校验值一起写入例如:数据盘为8块,某个时刻一个IO只更新了一个条带的6个segment,剩余两个没有更新。在重构写模式下,会将没有更新的两个segment数据读出,和需要更行的前6个segment计算出校验数据,然后数据和校验信息一起写入磁盘 与整条写的比较: 多出读segment数据操作和写校验数据操作 
读改写: 当需要写入的磁盘数目不超过一半时采取(1)从需要修改的segment中读取旧数据,再从条带上读取旧的奇偶校验值(读)(2)根据旧数据、旧校验值和需要修改的segment上的新数据计算这个条带上的新校验值(改)(3)写入新的数据和校验值(写)  


RAID 6:与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。但RAID 6需要分配给奇偶校验信息更大的磁盘空间,相对于RAID 5有更大的“写损失”,因此“写性能”非常差。较差的性能和复杂的实施方式使得RAID 6很少得到实际应用。

RAID 7:这是一种新的RAID标准,其自身带有智能化实时操作系统和用于存储管理的软件工具,可完全独立于主机运行,不占用主机CPU资源。RAID 7可以看作是一种存储计算机(Storage Computer),它与其他RAID标准有明显区别。除了以上的各种标准,我们可以如RAID 0+1那样结合多种RAID规范来构筑所需的RAID阵列,例如RAID 5+3(RAID 53)就是一种应用较为广泛的阵列形式。用户一般可以通过灵活配置磁盘阵列来获得更加符合其要求的磁盘存储系统。
RAID 5E(RAID 5 Enhencement): RAID 5E是在 RAID 5级别基础上的改进,与RAID 5类似,数据的校验信息均匀分布在各硬盘上,但是,在每个硬盘上都保留了一部分未使用的空间,这部分空间没有进行条带化,最多允许两块物理硬盘出现故障。看起来,RAID 5E和RAID 5加一块热备盘好象差不多,其实由于RAID 5E是把数据分布在所有的硬盘上,性能会与RAID5 加一块热备盘要好。当一块硬盘出现故障时,有故障硬盘上的数据会被压缩到其它硬盘上未使用的空间,逻辑盘保持RAID 5级别。
RAID 5EE: 与RAID 5E相比,RAID 5EE的数据分布更有效率,每个硬盘的一部分空间被用作分布的热备盘,它们是阵列的一部分,当阵列中一个物理硬盘出现故障时,数据重建的速度会更快。


开始时RAID方案主要针对SCSI硬盘系统,系统成本比较昂贵。1993年,HighPoint公司推出了第一款IDE-RAID控制芯片,能够利用相对廉价的IDE硬盘来组建RAID系统,从而大大降低了RAID的“门槛”。从此,个人用户也开始关注这项技术,因为硬盘是现代个人计算机中发展最为“缓慢”和最缺少安全性的设备,而用户存储在其中的数据却常常远超计算机的本身价格。在花费相对较少的情况下,RAID技术可以使个人用户也享受到成倍的磁盘速度提升和更高的数据安全性,现在个人电脑市场上的IDE-RAID控制芯片主要出自HighPoint和Promise公司,此外还有一部分来自AMI公司

面向个人用户的IDE-RAID芯片一般只提供了RAID 0、RAID 1和RAID 0+1(RAID 10)等RAID规范的支持,虽然它们在技术上无法与商用系统相提并论,但是对普通用户来说其提供的速度提升和安全保证已经足够了。随着硬盘接口传输率的不断提高,IDE-RAID芯片也不断地更新换代,芯片市场上的主流芯片已经全部支持ATA 100标准,而HighPoint公司新推出的HPT 372芯片和Promise最新的PDC20276芯片,甚至已经可以支持ATA 133标准的IDE硬盘。在主板厂商竞争加剧、个人电脑用户要求逐渐提高的今天,在主板上板载RAID芯片的厂商已经不在少数,用户完全可以不用购置RAID卡,直接组建自己的磁盘阵列,感受磁盘狂飙的速度。

RAID 50:RAID50是RAID5与RAID0的结合。此配置在RAID5的子磁盘组的每个磁盘上进行包括奇偶信息在内的数据的剥离。每个RAID5子磁盘组要求三个硬盘。RAID50具备更高的容错能力,因为它允许某个组内有一个磁盘出现故障,而不会造成数据丢失。而且因为奇偶位分部于RAID5子磁盘组上,故重建速度有很大提高。优势:更高的容错能力,具备更快数据读取速率的潜力。需要注意的是:磁盘故障会影响吞吐量。故障后重建信息的时间比镜像配置情况下要长。


posted @ 2013-03-08 14:17  长烟慢慢  阅读(1372)  评论(0编辑  收藏  举报