# tfs_largefile-淘宝分布式文件系统引擎 **Repository Path**: ji-zekai/tfs_largefile ## Basic Information - **Project Name**: tfs_largefile-淘宝分布式文件系统引擎 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 34 - **Forks**: 17 - **Created**: 2024-03-04 - **Last Updated**: 2025-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 淘宝分布式文件系统引擎 淘宝针对海量非结构化数据存储设计了一款分布式系统,叫TFS,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。 ### 1. 文件系统的基本概念 文件系统:一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。 ![输入图片说明](readme_pic/image.png) #### 1.1 存储的基本单位 扇区:硬盘的最小存储单位(sector)。一般每个扇区储存512字节。 磁盘的每一面被分为很多条磁道,即表面上的一些同心圆,越接近中心,圆就越小。而每一个磁道又按512个字节为单位划分为等分,叫做扇区。 #### 1.2 文件存储单位 块:文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。 #### 1.3 文件结构 Ext*格式化分区:操作系统自动将硬盘分成三个区域。 目录项区:存放目录下文件的列表信息 数据区:存放文件数据 inode区:存放inode所包含的信息。“索引节点”,存储文件的元信息,比如文件的创建者、创建日期、大小等等。每个inode都有一个号码,操作系统用inode号码来识别不同的文件。ls -i 来查看inode号。inode节点的大小一般是128字节或256字节。 ![输入图片说明](readme_pic/image1.png) #### 1.4 系统读取文件 ![输入图片说明](readme_pic/image2.png) ### 2. 大文件结构 淘宝网为什么不用普通文件存储海量小数据? 1、大规模的小文件存取,磁头需要**频繁的寻道和换道**,因此在读取上容易带来较长的延时。 2、频繁的新增删除操作导致磁盘碎片,**降低磁盘利用率和IO读写效率**。 3、**Inode占用大量磁盘空间**,降低了**缓存**的效果。 ### 3. 淘宝文件系统大文件结构 #### 3.1 设计思路 1、以block文件的形式存放数据文件(一般一个block为64M),每个块都有唯一的一个整数编号,块在使用之前所用到的存储空间都会预先分配和初始化(避免过多的磁盘碎片)。 2、每一个块由一个索引文件、一个主块文件和若干个扩展块组成,“小文件”主要存放在主块中,扩展块主要用来存放溢出的数据。 3、每个索引文件存放对应的块信息和“小文件”索引信息,索引文件会在服务启动时映射(mmap)到内存,以便极大的提高文件检索速度。“小文件”索引信息采用在索引文件中的数据结构哈希链表来实现。 4、每个文件有对应的文件编号,文件编号从1开始编号,依次递增,同时作为`哈希查找算法的Key来定位“小文件”在主块和扩展块中的偏移量。文件编号+块编号按某种算法可得到“小文件”对应的文件名。 #### 3.2 大文件存储结构图 ![输入图片说明](readme_pic/image3.png) #### 3.3 哈希链表结构图 ![输入图片说明](readme_pic/image4.png) #### 3.4 关键数据结构 块信息: ![输入图片说明](readme_pic/image5.png) ”小文件“索引信息: ![输入图片说明](readme_pic/image6.png) ### 4 文件内存映射 #### 4.1 文件映射的应用场景 1、进程间共享信息。 2、实现文件数据从磁盘到内存的映射,极大的提升应用程序访问文件的速度。 #### 4.2 文件映射原理 将一个文件或者其他对象映射进内存。 1、使用普通文件提供的内存映射 2、使用特殊文件提供匿名内存映射 #### 4.3 文件映射的实现 1、 ![输入图片说明](readme_pic/image7.png) 参数addr:指向欲映射的内存地址,通常设为NULL,代表让系统自动选定地址,映射成功后返回该地址。 参数length:代表将文件中多大的部分映射到内存。 参数prot:映射区域的保护方式。PROT_EXEC 、PROT_READ 、读取 PROT_WRITE 写入 、PROT_NONE不能存取。 参数flags:影响映射区域的各种特性。必须要指定MAP_SHARED或MAP_PRIVATE。 ![输入图片说明](readme_pic/image8.png) 参数fd:要映射到内存中的文件描述符。 参数offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。 2、mmap之msync 实现磁盘文件内容与共享内存区中的内容一致,即同步操作。 函数原型:int msync(void *addr, size_t len, int flags)。头文件:#include 参数addr:文件映射到进程空间的地址。 参数len:映射空间的大小。 参数flags:刷新的参数设置,可以去之MS_ASYNC/MS_SYNC ​ 取值为第一个:异步,调用后会立即返回,不等到更新的完成 ​ 取值为第二个:同步,调用会等到更新完成之后返回 返回值:成功返回0;失败返回-1。 3、mmap之mremap 扩大(或缩小)现有的内存映射。 ![输入图片说明](readme_pic/image9.png) 参数addr:上一次已映射到进程空间的地址。 参数old_size:旧空间的大小。 参数new_size:重新映射指定的新空间大小。 参数flags:取值可以是0或者MREMAP_MAYMOVE,0代表不允许内核移动映射区域,MREMAP_MAYMOVE表示内核可以根据实际情况移动映射区域以找到一个符合new_size大小的内存区域。 返回值:成功则返回0,失败则返回-1。 ### 5.类图 ![输入图片说明](readme_pic/image10.png) ### 6.哈希存储实现图 ![输入图片说明](readme_pic/image11.png) ![输入图片说明](readme_pic/image12.png) ![输入图片说明](readme_pic/image13.png) ![输入图片说明](readme_pic/image14.png)