曾经RAID技术在存储领域独挡一面,为卷管理系统、文件系统提供高效、可靠的数据存储服务。但是,如今随着磁盘容量的不断增大,RAID的数据重构时间大为增加,从而导致数据可靠性难以得到保证。为了解决这个问题,我们可以采用冗余度更高的算法解决多块磁盘发生故障的问题。例如,可以采用RS码实现三块盘冗余算法。但是,这种提高冗余度的方法会带来计算复杂度的问题,本质上还是无法避免单盘数据重构时间过长的问题。
针对数据重构时间过长的问题,我进行了研究,发现数据重构最难解决的性能瓶颈在于重构读,而不是写操作。在很多的优化方案中我们可以看到,为了避免Spare盘的单盘写瓶颈,我们可以将spare盘分布到Working disk上去,而不采用一个固定的磁盘作为数据热备盘。当然,这种解决方案会引入数据迁移,数据再平衡问题。但是,纯粹从消除写瓶颈的角度来看,这种方案是可行的。在实践中,大家可以发现,上述方案不能很好的提升数据重构性能,关键在于重构读瓶颈还在。另外,当spare盘离散之后,读写请求混合,导致单盘读写性能剧降,如果设计不好,重构性能不升反降。大家知道传统RAID的数据分布是固定的,并且非常规则。例如,即使一个存储系统中存在100块盘,一个Array中的数据也一定只会分布在某12块盘上。所以,在数据重构的过程中,重构读请求只会落在这12块盘上,其他的磁盘不会参与到数据重构过程中去。正因为如此,数据重构的性能被单盘性能局限住了。无论怎么去优化,数据重构的性能也不会高于一个SAS盘的峰值性能130MB/s。
通过上述分析,我们可以发现,传统RAID的问题在于数据分布,导致这种数据分布的主因是传统RAID的架构存在问题。我们现在看到的传统RAID架构很简单,将多块磁盘聚合成一个Group,Group中的磁盘都有很多的磁盘分区,RAID需要做的事情就是将分区组合成Array。一个Array就是我们通常熟知的RAID-5或者RAID-6。由于很早以前RAID不是用来进行数据保护的,只是用这种方法将小磁盘聚合成大存储空间,也就是RAID0的做法。后来才发展成了数据保护的功能,并且数据保护成了RAID一个最重要的功能。从数据保护的角度来看RAID架构,的确存在问题。传统RAID将数据保护域与物理磁盘管理域揉和在了一起。物理磁盘管理域就是数据保护域。其实,我们通常所说的RAID-5或者RAID-6是一个数据保护域,而多块磁盘聚合成的Group是一个物理磁盘管理域。数据保护域是一个逻辑域,而磁盘管理域是一个物理域,所以,这两者是应该分开的。
事实证明这是一种非常不错的想法。数据保护域和物理磁盘管理域分离是现代RAID的一种出路。当然,分离两个域是RAID架构的一种调整,这种架构调整会引发很多技术上的革新。例如,逻辑域和物理域如何进行对接,即物理资源如何分配给逻辑域?这就涉及到资源分配器设计的问题。优秀的资源分配器根据应用负载的Pattern模式,将整体性能达到最优,糟糕的资源分配算法使得RAID的性能还不如传统RAID。所以,资源分配算法是这种方法的重中之重。
我在备份应用中实现了这种方法,并且可以使得RAID的数据重构性能急剧提高。重构性能与磁盘数量相关,并呈线性关系,磁盘越多,重构性能越高。实践论证这是未来RAID可以走的一条路,当然,这种架构变化的背后还有很多的技术细节和设计艺术。