有不少粉丝在我们的后台留言说,想让我们讲一下有关磁盘阵列,也就是RAID相关的事情。那么今天呢,我们就谈一谈什么是RAID磁盘阵列,而RAID又该怎么用。
1、什么是RAID
RAID(Redundant Arrays of Independent Disks,一说Redundant Arrays of Inexpensive Disks),中文名称叫独立磁盘冗余阵列(廉价磁盘冗余阵列),简称磁盘阵列。它的作用呢,是在多块硬盘组成的阵列系统中,牺牲一块至多块硬盘的容量,来对数据的存储提供一定的容错能力。
我们先来简单假设一种使用情况:你拥有一些重要的数据,但是你并没有将这些数据进行备份,他们只存在于你台式机的单一硬盘中。那么一旦遇到台式机的硬盘损坏,你的这些数据只能去找数据恢复公司了;而如果你的台式机做了磁盘阵列,那么只需要替换阵列中坏掉的硬盘就可以重新恢复数据了。
这正是RAID的魅力所在。如果你只组建一个相对廉价的阵列,甚至不需要额外的硬件成本,只要你的主板支持RAID功能,就可以体验RAID给你带来的好处。
2、RAID都有哪些类型
知道了RAID是什么之后,我们就来看看RAID都有哪些类型吧。根据RAID算法的不同,有RAID0、RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID01/10、RAID50等等很多种,然而由于他们其中有一些的算法过于麻烦,日常使用中很少涉及。因此,我们这次的科普只涉及几种广泛使用的RAID类型:包含RAID0、RAID1、RAID5、RAID01/10四种。除此之外,我们还将顺带提及RAID6以及RAID50这两种稍麻烦点,但至少还有人用的阵列类型。至于剩下的嘛……就不多说啦。
▌RAID0(条带存储)
假设阵列中一共有n块硬盘,RAID0是将需要存储的数据以“条带(Stripe)”为单位分成n份,然后分别写入n块硬盘中。因此,RAID0将提供非常优秀的读写性能。打个简单的比方,如果你要读写一个2G的文件,在普通硬盘上,要以单盘的速度读取/写入2G的数据;而如果在4盘RAID0阵列中,每个盘只需读取/写入500MB的数据,四个盘可以并行读取/写入,因此理论的读写速度将是单块硬盘的4倍。
但是严格的说,RAID0并不能算Redundant Array(冗余阵列),因为它并不提供冗余的容错机制。只要阵列中有一块硬盘坏掉,由于这块硬盘保存着所有数据(每个文件)的某一部分,因此所有数据都将无法读取,整个阵列中的数据将宣告报废。虽然RAID0的空间利用率可以达到1,但是容错率却是为0。因此,一般会辅以其他RAID类型来实现数据的冗余容错。
▌RAID1(镜像存储)
RAID1是最安全的阵列方案,但也是空间利用率最低的方案。RAID1将所有数据原封不动copy一份,放于另一块硬盘中。如果你用4块1T的硬盘组成RAID1阵列,可用空间甚至只有1T!因为剩下的3块硬盘中的数据与第一块硬盘一模一样。当然这也提供了坏n-1块硬盘的数据保障,只要任意一块硬盘是好的,就算剩余硬盘全部坏掉也可以读取数据。因此空间利用率只有1/n,而容错率高达(n-1)/n。但是由于空间利用率实在太低,一般来讲只用2块硬盘组成RAID1,再辅以其他RAID类型共同协作。
至于RAID1阵列组的性能,读取性能取决于阵列中最快的硬盘(谁读的快就用谁的数据,反正数据都一样),而写入性能则取决于阵列中最慢的硬盘(要等所有硬盘写入结束,才完成写入操作)。
▌RAID01/10
介绍完RAID0与RAID1,大家或许会发现如果是单独使用,它们俩都有着巨大的不足。因此,就有两种结合性的RAID方案被提出:RAID0+1与RAID1+0,分别简称为RAID01和RAID10(所以发音分别是“RAID零一/RAID一零”,可不要读成“RAID十”呦)。这两种方案都是同时吸取了RAID0的读写快速优点与RAID1的安全容错优点,但是RAID10由于可以在相同的性能/容量下提供比RAID01更好的容错安全性,因此RAID01已经被弃用。
要具体了解为什么弃用RAID01而选择RAID10,我们要先分别了解它俩的原理。其实很简单,RAID01就是先将多块磁盘组成RAID0阵列,之后再用2个RAID0阵列组成RAID1。而RAID10则先用两块硬盘组成RAID1阵列,再用多个RAID1阵列组成RAID0。接下来我们假设拥有10块1T硬盘,来看看它们两个的安全性:
先来看RAID01:ABCDE硬盘组RAID0容量5T,FGHIJ硬盘组RAID0容量5T,两组硬盘组RAID1容量5T。在坏掉一块硬盘的情况下(假设F坏掉),FGHIJ组成的RAID0阵列失效,整个RAID1阵列处于降级(不健康)状态;此时若ABCDE中任意一块硬盘再坏掉,将导致ABCDE组成的RAID0阵列失效,整个RAID1阵列将完全失效,数据全部丢失。因此在一块硬盘失效,阵列恢复重建过程中的失败率为5/9,超过了50%。
再来看RAID10:AB硬盘组RAID1容量1T,CD组RAID1容量1T……依此类推组成5个RAID1,之后再将这5个1T阵列组成RAID0,容量5T。依然假设坏掉F盘,此时F所处的RAID1阵列(E、F)处于降级状态,而整个RAID0阵列依然健康(由于RAID0阵列没有容错机制,因此除了健康就是失效,没有降级状态);如果第二块硬盘坏掉,只要不是E盘,整个RAID0阵列就不会失效。因此RAID10在一块硬盘失效,阵列恢复重建过程中的失败率仅为1/9,只有RAID01的五分之一。
以上就是弃用RAID01而采用RAID10的原因,可能比较绕,希望大家可以耐心看完。不过只要大家认真读过,就能发现RAID10对于硬盘的限制:至少4块硬盘,并且硬盘数目需要是2的倍数(因为要做RAID1)。而总可用空间为(单盘容量*硬盘数量/2),也就是空间利用率为1/2;最多允许阵列中一半的硬盘坏掉(每个小RAID1阵列中坏一块硬盘),因此容错率也为1/2。
至于RAID10的理论读取性能呢,则为max(小RAID1阵列中两块盘的读取速度)*n/2;而理论写入性能则是min(小RAID1阵列中两块盘的写入速度)*n/2。
3、热备盘与冷备盘(Hot Spare / Cold Spare)
讲到这里,大家想必已经对RAID阵列有一定的了解了,也见到了RAID的容错冗余能力。那么在继续剩下的RAID类型科普之前,我们先来讲一下,如果我在具有容错冗余能力的RAID阵列(即除去RAID0的其他RAID类型)中坏掉了一块硬盘,RAID阵列会如何自我进行恢复呢?
我们就以2盘的RAID1为例。假如坏掉了一块盘,RAID1阵列将只有1块盘在正常运行,这时的RAID1阵列将处于降级(Degraded)状态,也就意味着当前阵列已无容错冗余能力,虽然还能继续运行,但是数据已经不安全,需要人为干预进行修复。对于我们来讲,只需要拔出坏掉的硬盘,换一块相同容量的、好的硬盘插上去,RAID1阵列就会自动开始恢复重建过程。简单来说,就是将剩余1块盘中的数据重新拷贝到新换上的这块盘中。根据硬盘大小的不同,阵列恢复重建过程将从十几小时到几十小时不等。
那么,我们换上的这块硬盘,不管你是从抽屉里拿出来的还是去科技市场买了一块新的,都是通过人为操作插入到整个阵列里的。在出问题之前,这块盘就冷冷的躺在抽屉里而并不会通电,这块盘就叫冷备盘(Cold Spare)。
那能不能让阵列自动找一块好的硬盘来替换掉坏掉的盘呢?当然可以。我们可以为任何一种具有容错冗余能力的RAID阵列配备热备盘(Hot Spare)。简单来说,就是在建好RAID阵列后,再向其中插入1到多块与阵列中硬盘相同容量的盘,将其设置为Hot Spare模式。这些盘在阵列健康的时候就静静的呆在那,也不存数据,也没有读写访问。一旦阵列中有硬盘出问题,阵列处于Degraded状态时,RAID控制器会立即激活热备盘,开始阵列的恢复重建工作。
配备热备盘的好处是当阵列出现问题时,可以第一时间启动恢复重建操作,而不必等操作人员发现之后再手动操作。这样就避免了阵列在(降级后,操作人员发现之前)的这段时间内“带病运行”,增加了数据的可靠性。当然,缺点就是又增加了成本。