TFS(淘宝分布式文件系统)核心存储引擎

目录

一、文件系统基本概念

1.文件系统接口

2.存储的基本单位

3.文件存储单位

4.文件结构

5.关于Indoe

6.系统读取文件三步曲

二、为什么海量存储选用大文件结构

1.淘宝网为什么不用普通文件存储海量小数据

三、淘宝文件系统大文件结构

1.设计思路

2.哈希链表

3.大文件存储结构图

4.文件哈希链表实现图

5.关键数据结构

6.目录结构

7.块初始化

7.1. 生成主块文件

 7.2. 生成索引文件

8.块中写入文件

 8.1加载索引文件

8.2文件写入至主块

8.3文件索引信息写入索引文件

9.块中读取文件

 9.1.加载索引文件

 9.2.从索引文件中获取文件MetaInfo

 9.3.根据MetaInfo 从主块中读取文件

10.块中删除文件

10.1. 加载索引文件

10.2. 从索引文件中获取文件MetaInfo

10.3. 索引文件中删除MetaInfo

四、设计类图

1.面向对象分析

2.设计类图

五、源码实现


一、文件系统基本概念

根据淘宝2016年的数据分析,淘宝卖家已经达到900多万,有上十亿的商品。每一个商品有包括大量的图片和文字(平均:15k),粗略估计下,数据所占的存储空间在1PB 以上,如果使用单块容量为1T容量的磁盘来保存数据,那么也需要1024 x 1024 块磁盘来保存.

思考? 这么大的数据量,应该怎么保存呢?就保存在普通的单个文件中或单台服务器中吗?显然是不可行的。

淘宝针对海量非结构化数据存储设计出了的一款分布式系统,叫TFS,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。

1.文件系统接口

文件系统 -一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。

2.存储的基本单位

扇区 硬盘的最小存储存储单位(Sector)。一般每个扇区储存512字节(相当于0.5KB)

磁盘的每一面被分为很多条磁道,即表面上的一些同心圆,越接近中心,圆就越小。

而每一个磁道又按512个字节为单位划分为等分,叫做扇区

3.文件存储单位

文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

4.文件结构

Ext*格式化分区 - 操作系统自动将硬盘分成三个区域。

目录项区 - 存放目录下文件的列表信息

数据区   - 存放文件数据

inode区(inode table) - 存放inode所包含的信息

5.关于Indoe

inode - "索引节点",储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。每个inode都有一个号码,操作系统用inode号码来识别不同的文件。ls -i  查看inode

inode节点大小 - 一般是128字节或256字节。inode节点的总数,格式化时就给定,一般是每1KB或每2KB就设置一个inode。一块1GB的硬盘中,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

6.系统读取文件三步曲

二、为什么海量存储选用大文件结构

1.淘宝网为什么不用普通文件存储海量小数据

(1) 大规模的小文件存取,磁头需要频繁的寻道和换道,因此在读取上容易带来 

  较长的延时。

(2)频繁的新增删除操作导致磁盘碎片,降低磁盘利用率和IO读写效率  

(3)Inode 占用大量磁盘空间,降低了缓存的效果。  

三、淘宝文件系统大文件结构

1.设计思路

以block文件的形式存放数据文件(一般64M一个block),以下简称为,每个块都有唯一的一个整数编号,块在使用之前所用到的存储空间都会预先分配和初始化。每一个块由一个索引文件、一个主块文件和若干个扩展块组成,“小文件主要存放在主块中,扩展块主要用来存放溢出的数据。

每个索引文件存放对应的块信息和“小文件索引信息,索引文件会在服务启动是映射(mmap)到内存,以便极大的提高文件检索速度。小文件索引信息采用在索引文件中的数据结构哈希链表来实现。

每个文件有对应的文件编号,文件编号从1开始编号,依次递增,同时作为哈希查找算法的Key 来定位小文件在主块和扩展块中的偏移量。文件编号+块编号按某种算法可得到小文件对应的文件名。

2.哈希链表

哈希表 - 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法

关键点: 键(key):            文件的编号    如, 5 19  。 。 。

                值(value):           文件的索引信息(包含 文件大小、位置)

               索引:           数组的下标(0,1,2,3,4) ,用以快速定位和检索数据

                哈希桶:       保存索引的数组,数组成员为每一个索引值相同的多个元素(以链表的形式链接)的首节点

               哈希函数:    将文件编号映射到索引上,采用求余法 ,如: 文件编号  19 

3.大文件存储结构图

4.文件哈希链表实现

5.关键数据结构

struct BlockInfo
{

      uint32_t block_id_;             //块编号   1 ......2^32-1  TFS = NameServer +DataServer

      int32_t version_;                //块当前版本号

      int32_t file_count_;            //当前已保存文件总数

      int32_t size_;                     //当前已保存文件数据总大小

      int32_t del_file_count_;     //已删除的文件数量

      int32_t del_size_;              //已删除的文件数据总大小

      uint32_t seq_no_;             //下一个可分配的文件编号  1 ...2^64-1   

}

struct RawMeta 
{
     struct
     {
        int32_t inner_offset_;           //文件在块内部的偏移量
        int32_t size_;                       //文件大小
     } location_;
};

struct MetaInfo
{
     uint64_t fileid_;                //文件编号
     RawMeta raw_meta_;              //文件元数据
     int32_t next_meta_offset_;      //当前哈希链下一个节点在索引文件中的偏移量
} 

6.目录结构

7.块初始化

7.1. 生成主块文件

根据id创建文件

预分配空间

 7.2. 生成索引文件

根据id创建文件

头部初始化

同步写入磁盘

映射至内存访问

8.块中写入文件

 8.1加载索引文件

映射索引文件至内存

8.2文件写入至主块

从索引文件中读取块数据偏移

将文件写入主块的对应偏移位置中

8.3文件索引信息写入索引文件

生成 MetaInfo 信息(包括文件在块中的fd)

将MetaInfo 写入索引文件

更新块信息 BlockInfo

9.块中读取文件

 9.1.加载索引文件

映射索引文件至内存

 9.2.从索引文件中获取文件MetaInfo

根据文件id从块索引内存映射的Hash文件链表中查找文件的MetaInf

 9.3.根据MetaInfo 从主块中读取文件

10.块中删除文件

10.1. 加载索引文件

映射索引文件至内存

10.2. 从索引文件中获取文件MetaInfo

根据文件id从块索引内存映射的Hash文件链表中查找文件的MetaInfo

10.3. 索引文件中删除MetaInfo

将当前文件对应MetaInfo在哈希链表中的上一个节点指向其后的节点

当前MetaInfo 加入可重用空闲节点链表中

更新块信息

四、设计类图

1.面向对象分析

五个基本步骤:

第一步,确定对象和类 (object and class

第二步,确定结构(structure)

第三步,确定主题(subject)

第四步,确定属性(attribute)

第五步,确定方法(method)

2.设计类图

五、源码实现

见上传链接

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的鱼-blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值