淘宝分布式文件系统 (淘宝网为什么不用普通文件存储海量小数据?)

Posted Respect@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了淘宝分布式文件系统 (淘宝网为什么不用普通文件存储海量小数据?)相关的知识,希望对你有一定的参考价值。

背景介绍

在这里插入图片描述

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

1 PB = 1024 TB = 1024 * 1024 GB

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

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

文件系统接口

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

在这里插入图片描述
在这里插入图片描述

存储的基本单位

位(bit):二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。
字节(Byte,B):计算机中数据的基本单位,每8位组成一个字节。各种信息在计算机中存储、处理至少需要一个字节。例如,一个ASCII码用一个字节表示,一个汉字用两个字节表示。
字(Word):两个字节称为一个字。汉字的存储单位都是一个字。
扩展的存储单位
在计算机各种存储介质(例如内存、硬盘、光盘等)的存储容量表示中,用户所接触到的存储单位不是位、字节和字,而是KB、MB、GB等,但这不是新的存储单位,而是基于字节换算的。
KB: 。早期用的软盘有360KB和720KB的,不过软盘已经很少使用。
MB: 。早期微型机的内存有128MB、256MB、512MB,目前内存都是1GB、2GB甚至更大。
GB: 。早期微型机的硬盘有60GB、80GB,目前都是500GB、1TB甚至更大。
TB: 。目前个人用的微型机存储容量也都能达到这个级别了,而作为服务器或者专门的计算机,不可缺少这么大的存储容量。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
磁盘的每一面被分为很多条磁道,即表面上的一些同心圆,越接近中心,圆就越小。
而每一个磁道又按512个字节为单位划分为等分,叫做扇区

文件存储单位

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

存储单位是一种计量单位。指在某一领域以一个特定量,或标准做为一个记录(计数)点。再以此点的某个倍数再去定义另一个点,而这个点的代名词就是计数单位或存储单位。

在这里插入图片描述

文件结构

Ext*格式化分区 - 操作系统自动将硬盘分成三个区域。
目录项区 - 存放目录下文件的列表信息
数据区 - 存放文件数据
inode区(inode table) - 存放inode所包含的信息

在这里插入图片描述

是通过inode元信息来查找的
在这里插入图片描述

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

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

系统读取文件三步曲

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

找到根目录下的编号
在这里插入图片描述

在这里插入图片描述

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

  1. 大规模的小文件存取,磁头需要频繁的寻道和换道,因此在读取上容易带来
    较长的延时。
千兆网络发送 1MB 数据10ms
机房内网络来回0.5ms
SATA 磁盘寻道10ms
从SATA磁盘顺序读取 1MB 数据20ms

在这里插入图片描述

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

  2. Inode 占用大量磁盘空间,降低了缓存的效果。
    在这里插入图片描述

淘宝文件系统大文件结构

设计思路

  • 以block文件的形式存放数据文件(一般64M一个block),以下简称为“块”,每个块都有唯一的一个整数编号,块在使用之前所用到的存储空间都会预先分配和初始化。

  • 每一个块由一个索引文件、一个主块文件和若干个扩展块组成,“小文件”主要存放在主块中,扩展块主要用来存放溢出的数据。

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

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

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

键(key):文件的编号 如, 1 、 5 、 19 。 。 。
值(value):文件的索引信息(包含 文件大小、位置)
索引:数组的下标(0,1,2,3,4) ,用以快速定位和检索数据
哈希桶:保存索引的数组,数组成员为每一个索引值相同的多个元素(以链表的形式链接)的首节点
哈希函数:将文件编号映射到索引上,采用求余法 ,如: 文件编号 19

在这里插入图片描述
大文件存储结构图
在这里插入图片描述
文件哈希链表实现图
在这里插入图片描述
在这里插入图片描述

关键数据结构

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 {
     uint64_t fileid_;                        //文件编号
     struct
     {
        int32_t inner_offset_;           //文件在块内部的偏移量
        int32_t size_;                       //文件大小
     } location_;
};

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

**设计类图 **

在这里插入图片描述

在这里插入图片描述

以上是关于淘宝分布式文件系统 (淘宝网为什么不用普通文件存储海量小数据?)的主要内容,如果未能解决你的问题,请参考以下文章

TFS分布式文件系统

TFS分布式文件系统应用

通过tfs-nginx进行图片压缩过程

通过tfs-nginx进行图片压缩过程

淘宝分布式文件系统核心储存引擎学习总结

2.淘宝分布式文件系统基础配置dataserver和nameserver介绍