@HUST张友东 work@taobao zyd_com@126.com
分类: 服务器与存储
2012-05-15 21:59:17
TFS目前使用扩展块来解决文件写、更新问题。扩展块的数量由磁盘可用空间、主块大小、扩展块大小、Dataserver(DS)配置项block_ratio决定。TFS主块和扩展块的数量在文件系统格式化的时候就已经确定,并且预先分配了所有块的存储空间。DS周期性的汇报存储空间使用率给Namserver,DS根据主块和扩展块使用率中的较大值做为DS储存空间的使用率。
扩展块使用率引发的问题
为什么需要扩展块?
扩展块问题使得TFS数据服务器上的存储空间的利用率降低,解决扩展块问题有如下两种思路:
方案1的实现思路
采用类似linux软链接文件的方式,当写或者更新某个文件,但NS分配的block A存储空间不足时,则将该文件存储在其他任意block B上,并对应的B上文件的
链接文件方案彻底摒弃扩展块的使用,不存在存储空间浪费的问题;当读取到链接文件时,需要从链接目标块间接读取一次(开销与目前扩展块方案差不多),但如果目标块已经迁移到其他的DS上时,则读取文件的开销就会提升(连NS获取block所在DS信息,从DS读取文件数据)。当块剩余的空间低于平均文件大小时,可能会在块的末尾出现很多链接文件,因为很多写存储空间都不够,导致使用链接文件。
方案2的实现思路
把所有的存储空间都格式化为主块,当需要扩展块时,可分配一个主块,并将其拆分为多个扩展块(这里为了简化实现,可直接固定扩展块的大小,影响不大),选择其中一个扩展块使用,当其他的块需要扩展块时,可继续从这个块里分配,直到拆出来的所有扩展块都被用掉,则分配下一个主块,继续拆分。
这个方案有效的解决了存储空间浪费的问题,因扩展块是按需分配,而不是预先分配好的,无论扩展块与主块的使用比率如何,都可以用到把空间用完为止(需考虑为文件更新预留一些存储空间)。
飞哥提出的方案3
总体思路与方案2类似,但扩展块的使用并不划分为固定大小的单元,而是需要多少分配多少;文件不会垮块存储,当主块空间不足时,所有的文件数据都写到扩展块上,索引项增加文件所在的block编号。
存在的问题
在TFS固定块大小加更新支持的基础上,扩展块是一个被逼出来的选择,关键问题是扩展块是大小固定(方案2)、还是可变大小(方案3),固定大小块的管理起来比较简单、但如果使用一部分之后,一直没有更新,则块后面的空间就会浪费掉;可变大小的块(每个块对应一个文件的数据),则需要更多的元数据来管理(更大的index文件,更长的块链),同时也存在存储空间浪费的情况;个人觉得方案2是个不错的选择,是考虑效率和管理成本之间的一个折中方案。