上期文章我们谈到,传统的存储系统双活架构,多用于以机械硬盘(HDD)为主要存储介质的中低端磁盘存储系统,机械硬盘之间通过RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)技术实现冗余保护。
那么,什么是RAID数据保护技术?应用于SSD(固态硬盘)又会带来哪些伤害?
RAID技术的前世今生
RAID最早出现于20世纪80年代后期,初衷是提升固态硬盘的性能和容错能力。
RAID包含条带化和奇偶校验两大基本概念,可分为RAID0~RAID6 7种级别。其中,应用最为广泛的为RAID0、RAID5和RAID6。
图1: RAID0和RAID5示意图
图2: RAID 6示意图
RAID 0 采用条带化技术,将两个以上的机械硬盘排列起来,构成磁盘阵列。存放数据时,将数据分为若干个条带,并行写入到各HDD中。由于可以并行读写,RAID 0无疑是所有级别中性能最好的,但如果阵列中任何一个硬盘损坏,所有数据将丢失,无容错能力。
RAID 5使用奇偶校验位,校验码均匀分布在阵列中的各个机械硬盘上。如图所示,在一个RAID 5磁盘阵列中,数据A分为A1、A2、A3 3个条带,依次写入HDD1、HDD2、HDD3中,并由A1、A2、A3计算得出奇偶校验码,存放到HDD4中。以此类推,数据B也将被条带化,根据条带计算出奇偶校验码Bp,只是这次奇偶校验码存放在了与Ap不同的盘上。如果阵列中一块HDD发生故障,则可以通过其他盘上的数据和奇偶校验码信息,恢复被损坏的数据。RAID 5 可以容忍阵列中1块机械硬盘发生故障。
RAID 6与RAID5类似,只不过奇偶校验码由一位变成两位,可用容量由N-1块盘减少为N-2块盘,最多可允许阵列中2块机械硬盘发生故障。
随着RAID技术的发展,业界出现了组合RAID,如RAID 50。顾名思义,RAID 50结合了RAID 5和RAID 0两种技术。RAID 50最少需要6块盘,以此为例,6块HDD被分为两组,组内构成RAID 5,两组之间构成RAID 0。RAID 50可允许任意一组中1块机械硬盘故障。
如此看来,传统的存储系统双活架构中,即使采用高级别的RAID 5、RAID 6技术,实现HDD盘级层面的冗余,最多可以容忍组内2块机械硬盘故障。当组内超过2块机械硬盘发生故障时,整个阵列就会失效。
当传统存储系统双活架构遇上SSD
一项针对数据中心硬件故障的研究显示,数据中心前十大硬件故障来源包括机械硬盘和磁盘柜背板。
传统的存储系统双活架构中,两个控制器通过背板连接到共享磁盘柜,一旦磁盘柜背板发生故障,数据将无法访问,造成数据服务中断。此外,通过RAID技术实现冗余保护,最多可容忍组内2块机械硬盘故障。
如果我们将传统的存储系统双活架构,继续沿用在以固态硬盘为主要存储介质的全闪存储中,又会面临哪些问题呢?
首先,在硬盘层面,RAID技术真的能有效保护固态硬盘么?
机械硬盘每秒可执行的随机读写任务数为数百个,而固态硬盘则可多达数万个,数据延迟也仅为机械硬盘 的1/50。因此,全闪存阵列通常不需要使用RAID技术来提高性能,更多的是借助RAID的冗余技术对SSD上的数据进行保护,简称为SSD RAID。
众所周知,固态硬盘不支持覆盖写,原有数据页需要经过擦除后方可重新写入,固态硬盘内部以块为单位进行擦除,而闪存块的擦除次数是有限的,因此固态硬盘的寿命很大程度上受写入次数的限制。
而写放大将带来不必要的写入,无疑是影响固态硬盘可靠度的关键点之一。
奇偶校验位是SSD RAID最常用的冗余技术。以采用RAID 5的全闪存阵列为例,每当有数据写入时, 存储系统架构中的RAID功能模块,将会为其分配一个逻辑页组,组成RAID 5逻辑结构。如果数据需要占用N个空白页空间,那么将为其分配N+1个空白页。其中N个空白页用于存放数据,而剩下的一个空白页用于存放校验码。校验码由前面N个数据页上的数据计算得出,如果这个逻辑页组内的任意一个数据页上的数据被更新,他们的RAID关系不会改变,但逻辑校验码也会被重新计算及更新。
如此一来,每一次数据的写入或更新,都会因为写校验码或更新校验码,带来额外的空间开销,造成写放大。随着数据写入量的不断增加,额外写入也会增大,更容易触发垃圾回收,而垃圾回收的过程势必又将会带来二次写放大。固态硬盘性能折损的同时,可靠度也大打折扣。
因此,SSD RAID对于全闪存阵列而言,并非盘级层面数据保护策略的最优解。
其次,在架构层面,如果采用双控制器共享磁盘柜的架构,当磁盘柜背板发生故障,进而导致存储资源池无法被访问的问题依然存在。
此外,当组内超过两块固态硬盘故障时,又该如何进行数据恢复呢?
除了传统的存储双活架构,我们还可以有别的选择么?