当我还是一位技术服务新手的时候,我几乎对系统管理一无所知,当时我们一直认为很酷的话题之一便是RAID–廉价(独立)磁盘冗余阵列。
当时,RAID是解决我们存储问题的灵丹妙药。通过RAID,我们可以将文件系统扩展得更大,获得更高的吞吐率,甚至还可以增加冗余度以便让我们可以承受磁盘损失的风险–这种风险在这段时间发生得尤其经常。
随着NAS(网络附加存储)和SAN(存储局域网)设备的兴起,我们已经不是很需要那种深入到物理存储然后调整物理存储以满足系统需求的技能了。这不是一件好事。我们仅仅是将存储卸载到外部设备,这并不能改变我们需要深入理解存储的事实,我们还是需要在理解的基础上调整存储以满足系统的特定需求。
过去五到十年来,人们似乎误以为RAID某种程度上相当于系统备份。其实它不是。RAID是一种容错形式。
备份和容错是不同的概念。备份让你可以在灾难发生后恢复数据。容错是减少灾难发生的概率。你可以想象成容错是在悬崖顶部立一条护栏,而备份是在悬崖底部设立一座医院。护栏和医院都是你想要的,但是它们是完全不同的事物。
一旦我们开始在驱动器上实施RAID,无论是本地连接的还是存储网络上的远程设备,如今的我们可以根据业务需要选择四种主要的RAID解决方案:RAID 1(镜像);RAID 5(带校验码的条带化);RAID 6(带双校验码的条带化);RAID 10(带条带的镜像)。
市场上还有其他类型的RAID,比如RAID 0,不过如果你真正理解你的驱动器子系统需求的话,你就知道RAID 0只适用于很罕见的场合。RAID 50和51也被人们所使用,但是更加少见。十年前,RAID 1和RAID 5是很常见的,但是如今我们有更多的选择。
RAID类型
现在我们一个一个来分析这些RAID,并讨论基本的数据。在我们的例子中,我们使用"n"来表示阵列中驱动器的数量,用"s"来表示单个驱动器的大小。通过这些符号,我们可以描述任何阵列的可用存储空间,让存储容量的比较更加方便。
RAID 1
在这种RAID类型中,驱动器被镜像。如果你有两个驱动器,那么它们同时一起做所有事情,也就是"镜像"。镜像可以非常稳定,因为它的流程非常简单,但是和完全不使用RAID的情况比起来,它需要你购买双倍的驱动器,因为你要将第二个驱动器指定为冗余驱动器。
这种RAID的好处就是你可以确保你在磁盘上写入的每个数据都被重复写入,从而达到数据保护的目的。通过RAID 1,我们的可用容量计算是(n*s/2)。RAID 1所能提供的相对于非RAID驱动器的性能提升很小。RAID 1的写入速度和非RAID系统相当,而读取速度在大部分情况下差不多是非RAID系统的两倍,因为在读取操作过程中,驱动器可以并行地访问,从而提高了吞吐率。RAID 1限定于双驱动器设置。
RAID 5
带校验码的条带化。在这种类型的RAID中,数据通过复杂的条带写入到阵列中的所有驱动器,同时分布式校验块留在所有驱动器上。通过这么做,RAID 5可以使用指定大小的三块以上磁盘的阵列,而且只牺牲与单个校验磁盘相当的存储容量。但是校验码是分布式的,它并不单独存在于任何一块物理磁盘。
鉴于其成本经济性,RAID 5经常被使用。在大型阵列中,RAID 5所带来的容量损失是比较少的。和镜像不同,带校验码的条带化需要计算每条写入条带,这带来了一些系统开销。因此,RAID 5的吞吐量并不是那么容易计算,很大程度上需要依赖于系统在进行校验码计算时候的计算能力。
计算RAID 5的容量很容易:就是((n-1)*s)。一个RAID 5阵列可以承受阵列中任何单个磁盘的故障和损失。
RAID 6
带双校验码的冗余条带化。RAID 6和RAID 5很像,不过使用的是两个校验块而不是一个校验块,从而提高了对抗磁盘故障的保护能力。
RAID 6是RAID家族的新成员。RAID 6是在几年前在其他的RAID类型标准化后加入的。RAID 6比较特殊,因为它可以承受阵列中任意两块驱动器的故障,并同时防止数据丢失。但是为了提高冗余度,RAID 6阵列需要牺牲阵列中相当于两块驱动器的容量,并要求阵列拥有最少四块驱动器。我们可以用((n-2)*s)来计算RAID 6的可用容量。
RAID 10
带条带化的镜像。从技术上来说,RAID 10是复合RAID,结合了无校验码条带(RAID 0)和RAID 1。
在阵列中只有两块驱动器的情况下,许多厂商也使用RAID 10(或RAID 1+0)这个术语,不过实际上这种阵列只是RAID 1,因为只有阵列中拥有四块以上驱动器条带化才会开始运作。通过RAID 10,驱动器必须是一对一对地添加,因此阵列中驱动器的数量只可能是偶数。
RAID 10可以承受占驱动器总数一半的驱动器故障和损失,同时最多只能承受每对驱动器中一个驱动器的故障和损失。RAID 10没有校验码计算,这使得它相对于RAID 5或RAID 6有性能上的优势,对阵列驱动器计算性能的要求也更低。在所有常见的RAID类型中,RAID 10提供了最高的读取性能,因为在读取操作中,阵列中的所有驱动器都可以同时使用。但是它的写入性能要更低。RAID 10的容量计算和RAID 1相同,即(n*s/2)。
在如今的企业中,无论RAID软件或硬件是否已经实施,很少有IT部门需要考虑上述四种基本设置以外的驱动器设置。以前,RAID阵列决策中最主要的考量就是可用容量。这是因为当年驱动器比较贵而且容量比较小。
如今,驱动器都很大,存储容量基本上不是问题,至少不像几年前那样。驱动器的成本也下降了许多,因此购买更多的驱动器以实现更高的冗余度也基本上不成问题。当容量是主要顾虑的时候,RAID 5是比较受欢迎的选择,因为和其他阵列类型相比,RAID 5损失的容量比例最小。
如今,我们有其他方面的顾虑,主要是数据安全性和性能。花稍微更多一点钱来确保数据保护是比较明智的选择。RAID 5只能承受一块驱动器的故障和损失。对于拥有三块驱动器的阵列,RAID 5的安全性只比RAID 1差一些。
我们可能可以接受三块驱动器中损失一块。三块驱动器损失一块和两块驱动器损失一块相比好像没那么让人害怕。但是如果是更大的阵列呢,比如说16块驱动器?如果我们只能承受16块驱动器中损失一块,那我们有理由怀疑系统的可靠性。
RAID 6可以填补这个安全性空白。RAID 6在用于大型阵列的时候,不会牺牲多少存储容量和性能,同时还提供可以承受任意两块驱动器故障/损失的保护能力。带校验码的条带化RAID的支持者经常引用这些数字来安抚客户的管理层,称RAID 5/6可以提供足够"物廉价美"的存储子系统。但是用户还有其他因素需要考虑。
对RAID 10的分析
在RAID的可靠性–这个也是很少被讨论的话题–讨论中,几乎完全被忽视的一个问题就是校验码计算的可靠性。
在RAID 1或RAID 10的情况下,系统不需要”计算”来创建带校验码的条带。系统以稳定的方式简单地写入数据。当一块驱动器发生故障的时候,它的伙伴会接过工作负荷,在替换 驱动器之前,驱动器性能会有一些下滑。系统没有会影响现有驱动器成员的重建流程,也没有校验条带重建流程。
带校验码的RAID阵列需要有一定的计算操作来算出操作的数据是什么以及应该将哪些数据放到驱动器。虽然这种计算非常简单,但是有出错的可能性。
如果RAID 1或RAID 10阵列控制发生故障,从理论上来说,系统有可能在驱动器的内容中写入坏数据。但是由于控制器本身没有进行驱动器变动的进程,因此这种情况发生的可能性非常小,因为除了创建镜像外,系统没有”重建”流程。
当带校验码的阵列执行重建操作时,它们会执行复杂的进程来逐步审视阵列的整个内容,然后将丢失的数据写回到被替代的驱动器。就其本身来说是个简单的步骤,应该不需要担心。
我和其他一些人首先注意到的是稍微不同的情境,即由于与阵列的连接器松动所导致的磁盘连接性的丢失。随着时间的流逝,服务器中的驱动器有可能会松动,尤其是持续服务好几年以后。
在极端的情况下,如果阵列控制器认为一个或更多的驱动器相继发生故障,驱动器中的好数据会被坏校验数据所覆盖,然后返回在线并进行重建。在这种情况下,驱动器本身其实没有发生故障,也没有数据丢失。理论上来说其实只要重新调整一下驱动器的位置就可以了。
在 热插拔系统中,在故障磁盘移除和替换的基础上,驱动器重建的管理经常是自动的。因此,在没有人工干预的情况下,这种丢失和替换驱动器的流程可能会发生– 而重建流程会开始。在这种流程下,驱动器系统会蒙受风险,如果驱动器阵列再发生这种情况,根据驱动器的状况,系统可能会开始条带化坏数据,并覆盖正常的文 件系统。
对于服务器管理员来说,最痛苦的莫过于看到没有驱动器故障的系统仅仅因为不必要的重建操作而丢失整个阵列。
理论上来说,这种情况不应该发生,而管理员应采取措施来防止这类事件发生。但是判断底层驱动器控制器的情况,判定驱动器当前和过去的情况,以及判断驱动器所承载的数据的质量并不是那么容易,还是有可能发生错误。
虽然这种事情发生的概率不高,但是它还是有发生的可能,并使得RAID 5和RAID 6系统的风险计算几乎变得不可能。除了阵列可以容许的驱动器故障/损失数量外,我们必须考虑校验码错误的风险。随着驱动器变得更加可靠,校验码错误风险显得更加醒目。
此 外,RAID 5和RAID 6校验码需要计算,带来了系统负担。校验码的计算通常是由专门的RAID硬件来执行的。这种计算带来了驱动器子系统的延迟性,不过延迟性的大小很大程度上 取决于硬件与软件的设置。这使得我们几乎无法比较RAID之间的性能水平,因为每种设置都是独一无二的。
如今,RAID决策中最大的问题就是我们可以方便地获得有关存储效率和驱动器容错的指标,但是有关可靠性和性能的指标却几乎无法获得。这里面隐藏的危险是人们经常关注那些可以方便衡量的因素而忽视那些无法方便衡量的因素,尽管这些无法方便衡量的因素有可能带来重大影响。
所有类型的RAID都有自己的立足之地,关键是考虑使用背景并对风险有完整的理解。我们应该争取从现在行业中广泛使用的RAID 5转变到RAID 10。驱动器现在很便宜,而数据损失所带来的成本很昂贵。