淘宝分布式文件系统
项目背景介绍
根据淘宝 2016 年的数据分析,淘宝卖家已经达到 900 多万,有上十亿的商品。每一个商品有包括 大量的图片和文字(平均:15k),粗略估计下,数据所占的存储空间在 1PB 以上,如果使用单块容 量为 1T 容量的磁盘来保存数据,那么也需要 1024 x 1024 块磁盘来保存
思考? 这么大的数据量,应该怎么保存呢?就保存在普通的单个文件中或单台服务器中吗?显然 是不可行的。 淘宝针对海量非结构化数据存储设计出了的一款分布式系统,叫 TFS,它构筑在普通的 Linux 机器集 群上,可为外部提供高可靠和高并发的存储访问。
设计思路
以 block 文件的形式存放数据文件(一般 64M 一个 block),以下简称为“块”,每个块都有唯一的一个 整数编号,块在使用之前所用到的存储空间都会预先分配和初始化。 每一个块由一个索引文件、一个主块文件和若干个扩展块组成,“小文件”主要存放在主块中,扩 展块主要用来存放溢出的数据。 每个索引文件存放对应的块信息和“小文件”索引信息,索引文件会在服务启动是映射(mmap)到 内存,以便极大的提高文件检索速度。“小文件”索引信息采用在索引文件中的数据结构哈希链表 来实现。 每个文件有对应的文件编号,文件编号从 1 开始编号,依次递增,同时作为哈希查找算法的 Key 来 定位“小文件”在主块和扩展块中的偏移量。文件编号+块编号按某种算法可得到“小文件”对应的文 件名。
哈希链表实现
键(key): 文件的编号 如, 1 、 5 、 19 。 。 。
值(value): 文件的索引信息(包含 文件大小、位置)
索引: 数组的下标(0,1,2,3,4) ,用以快速定位和检索数据
哈希桶: 保存索引的数组,数组成员为索引值相同的多个元素(以链表的形式链接)
哈希函数: 将文件编号映射到索引上,采用求余法 ,如: 文件编号 1