文主要基于FAST11和FAST12的两篇论文:A study of practical deduplication和Characteristics of backup workloads in production systems。前者来自微软,主要分析的是用于主存储系统的文件系统;后者来自EMC,分析的是用于二级存储系统(如备份、归档)的文件系统。两篇论文共同的特点是实验的数据集都非常庞大,因此分析的结果对于系统设计具有参考价值。而且从数据中我们也可以发现主存储系统和二级存储系统在使用方式等方面有很多区别。
再来看看EMC的实验。
1. 实验方法
作者的实验分为两部分,第一部分分析超过10000台的EMC Data Domain存储系统上传的autosupport,从这些信息中可以抽取出文件统计数据、系统容量等系统元数据,这部分实验分析了文件系统的总体趋势,特点是广度;第二部分分析部分系统中的数据快照,包括块一级的元数据(指纹等),这部分实验分析了存储系统更多细节,特点是深度。
Data Domain存储系统会定期向EMC反馈autosupport报告,这些报告可以帮助技术支持检测和检查系统的潜在问题。EMC每天能收到超过1万份这样报告,这些数据对于分析二级存储系统的特征非常有帮助。作者收集了一个礼拜的autosupport,从中排除了使用时间少于3个月或者使用空间不到2.5%的系统,剩下的超过1万个系统的年龄从3个月到7年都有。
第二部分实验数据来自几个重删存储系统,这些重删存储系统采用的是DDFS(见FAST2008)架构。作者收集了每个文件和数据块的元数据,包括数据块的大小、指纹、子块大小、子块指纹,文件的大小、修改时间、指纹序列,数据块在磁盘的分布。收集这些数据的目的之一就是分析不同系统配置对吞吐率和压缩率的影响,因为系统已经是按8KB平均块长分块的,所以无法再次分块,所以作者把每个8KB块分成平均长度为1KB的子块,并计算子块指纹,方便之后研究平均块长对系统的影响。利用这些元数据可以整理出每个文件的详细元数据,文件元数据包括该文件的数据块元数据(指纹,大小,位置等)序列。分析写负载时,可以将文件按修改时间排序,输入模拟器仿真系统的运行,分析重删和缓存的效率。分析读负载时,顺序读取一串指纹,分析完成操作需要读取多少个容器。
因为作者实验的存储系统是DDFS,只能获得指纹的快照,而不能获得数据块的快照,重新分块是不现实的,所以作者采取了一些策略来测试块长对重删率的影响。在数据收集阶段,每读取一个块(平均块长8KB),都进一步切为平均1KB的子块,实验可以用1KB子块合成2KB或4KB子块、用8KB块合成更大的块,从而近似分析不同块长对重删率的影响。具体合并算法:通常系统对块长有最大值和最小值的限制,合并时先选择最少的块数达到最小值要求,然后确定一个数字N,这个数字是不超过最大值要求所能追加的最大块数,最后就是要在这N个块确定一个断点,作者是选择值最大的指纹作为断点。作者的实验表明这种算法能近似模拟出块长对重删的影响,误差不大。
2. 文件系统元数据
图1 文件大小
图1是文件大小的统计情况,并且同时给出了微软的实验结果(蓝色)方便比较。二级文件系统的文件几乎比主文件系统大三个数量级,这是必然的,因为大多数备份系统会把文件打包成类似tar文件的格式。这降低了文件级重删的性能,但增加了数据流的局部性。注意到很大部分二级文件系统的存储空间被大文件(数百GB)占用,主文件系统针对小文件的优化策略,如把数据直接放到inode,在二级文件系统就没什么用了。
图2 文件和目录的统计数据
图2是关于文件数和目录数的统计数据,与主文件系统相比,二级文件系统的文件数和目录数都少很多。(c)显示二级文件系统单个目录内包含更多的文件。
图3 文件年龄
图3显示了二级文件系统的年龄分布,均值是20天,显然比主文件系统的年龄要小得多,这是因为备份文件通常有一个保留时限,到达时限就会删除。20天的平均寿命暗示这个保留时间通常是40天左右。
图4 文件系统代谢速率
图4显示了文件系统数据的代谢速率,即一个时间周期内释放和写入的数据占总存储数据的比例。平均每周大约21%的存储数据会被释放和写入,高代谢速率与图3的文件年龄相应,体现了备份系统具有保留期限的特性。高代谢速率给我们的启示是:二级文件系统不仅要提供足够的写吞吐率,而且释放空间也要足够快,像flash这种擦除性能很差的存储设备可能不适合备份工作负载。重复数据删除技术可以缓解这个问题。
图5 写负载比例
图5是二级文件系统的读负载占总IO的比例,未统计垃圾回收和数据复制(容灾备份)的IO,可见数据保护系统绝大多数IO都是写。50%的系统写操作占90%以上,只有20%的系统读操作多于写。由于未统计数据复制中的读操作,这幅图低估了读操作,然而由于数据复制既需要从源端读数据也要向目标端写数据,这不会改变写操作的主宰地位。主文件系统中,读操作差不多是写的两倍。
图6 数据复制
为了容灾备份,很多备份系统会将备份数据进行复制传输到远方,80%的系统至少会复制一部分备份数据。图6说的是过去7天时间里,写入二级文件系统的数据有多少会被复制,平均值是100%。有一些系统的数据超过了100%,可能有几个原因,比如数据被复制到多个目的地。如此高的复制率,增加了对读性能的要求,也就是说备份系统不仅要提供足够的写性能,读性能也不能落下。
图7 存储空间利用率
图7将二级文件系统的存储利用率与主文件系统的存储利用率进行了比较,显示二级文件系统的利用率更高,平均有60~70%的利用率,而主文件系统只有30~40%的利用率。利用率的差别从侧面反映了两种系统设计目标的差异:虽然在两种环境中性能和容量都很重要,二级文件系统更强调有效利用存储资源,而主文件系统更强调性能。
3. 重复数据删除
微软的论文对主文件系统的重复数据进行了评估,域为1的情况下平均能删除40%的数据,而域为Whole Set的情况下能删除70%左右的数据。EMC的论文则对二级文件系统的重复数据进行了测试。
图8 重复数据
图8显示了二级文件系统的重删率(重删前存储量/重删后存储量),平均值为10.9,而主文件系统只有1.7(域为1的情况)或者3(域为Whole Set的情况)。
上面的实验是广泛地分析二级文件系统的特点,接下来则涉及更多细节,包括块长对重删率的影响以及读写缓存效率。
表1 用于分析的数据集。
表1中,Class B意思是备份,LT-B意思是Long Term Backup。Update Freq.可以是MF(Monthly Full,每月一次全备份),WF(Weekly Full),DF(Daily Full)或者DI(Daily Incremental)。Dedup Ratio和1-Wk Dedup.分别代表累计重删率和一周重删率。MedAge表示文件年龄的中间值,正好一半的文件年龄小于(大于)这个值。这些数据集的大小从4-5TB到200TB(重删前大小),重删率从2.2到14。重删率最小的数据集是database2,其策略是每天一次全备份,然而备份保留时间只有3天。
表2 合并子块的有效性
作者首先做了实验来验证合并子块模拟不同块长方法的合理性。表2中两个数据集来自早起的研究(Tradeoffs in scalable data routing for deduplication clusters. in FAST 2011。EMC的人在FAST发paper和玩一样,泪奔啊!),和表1无相关性。表2显示Workstation数据集,合并子块的重删率稍高;而Email数据集,合并子块大约低4~7%。证明了这种方法可以近似描述块长对重删率的影响。值得注意的是,作者计算重删率时加入了元数据开销,所以重删率和原文略有不同。
图9 块长对重删率的影响
图9是块长对重删率的影响,为了清晰,只画出了表1中的四个数据集。对于大多数数据集,每次将块长减半,能得到20~40%的重删率提升,这与过去的研究基本吻合;但是减半块长也意味着元数据开销增加,如1KB块长的重删率都比2KB要差,这种情况下元数据开销减少了10~20%的重删率。较大的数据块理所当然也会减少重删率,事实上这种情况下database1数据集几乎没有重删率。
重删系统的瓶颈通常是查找重复数据块,设计高效的缓存是解决瓶颈的关键。因此作者用实验去验证了DDFS提到的数据流局部性,以及缓存大小(32MB到1TB)和缓存单元(块、容器)对(读/写)缓存命中率的影响。
图10 (读/写)缓存命中率
最简单的缓存策略是块级LRU算法,但是大多数数据块在一次备份或恢复只会出现一次,这就导致只有当缓存比一次备份/恢复作业的数据集大时,才会有理想的命中率。数据流局部性(如DDFS,Sparse Index)可以用来改善命中率,即每次读取一个数据块的指纹(写操作)或者数据(读操作),就将该数据块附近的数据块指纹/数据一并预取到内存,为了实现这个算法,就要将重删后的数据块按照其在数据流中的顺序打包存放在磁盘上。
图10(a)显示了写操作的缓存命中率,块级LRU的缓存单元是数据块,而数据流局部性算法的缓存单元是容器(4MB)。注意当数据块不存在时,也会导致未命中,所以命中率的最大值是重删率的倒数。使用32MB的缓存,块级LRU算法能命中5~40%,只有缓存非常大时才能获得理想的命中率。而利用数据流局部性的缓存即使在32MB的小缓存下,也能达到优秀的命中率。
图10(b)是读操作的缓存命中率。注意,读操作缓存需要缓存的是数据块,而写操作只需要缓存指纹,导致同样大小的缓存,读操作缓存只能容纳更少的条目。使用数据流局部性算法获得的命中率比写操作的要高,这是因为读操作不存在由于新数据块导致的未命中。块级LRU算法需要数TB的缓存才能达到较高命中率。绿线显示的压缩区域指的是DDFS中常规压缩算法的作用单元,通常是128KB(通常包含10几个数据块),在6个数据集中和局部性算法性能相仿,但是另外2个数据集则命中率不高,这是因为这两个数据集在压缩区域级碎片化严重,而由于容器级更大,碎片没这么严重。
4. 总结
和主文件系统相比,二级文件系统的文件更大,年龄更小,数量更少,目录层次简单。二级文件系统必须不断消化主文件系统的数据,受容量限制就必须删除旧的数据,这种高代谢速度要求二级文件系统维持很高的写吞吐率和垃圾回收速率。根据Kryder定理,每10年主存储系统容量涨100倍,而磁盘容量、带宽资源增长却相对较慢,面对这种挑战,重复数据删除等数据压缩技术成为了各大数据保护厂商的必然选择。
一般情况下,二级文件系统对写性能的要求比读性能要高,而主文件系统则反之。但是为了保证尽快恢复数据和容灾备份,二级文件系统也需要足够的读性能。优化读性能要求磁盘按顺序存储数据,而重复数据删除可能会恶化碎片情况(作者的实验却没有体现出这一点,至少容器级的缓存受碎片影响不大)。