完整的源码在下面这个链接哟
github源码
什么是大文件
其实就是小文件的升级版,存储空间更大,里面有多个部分有:索引文件,一个主块文件和扩展块组成
设计思路
-
以block文件的形式存放数据文件(一般64M一个block),以下简称为“块”,每个块都有唯一的一个整数编号,块在使用之前所用到的存储空间都会预先分配和初始化(磁盘插进去执行初始化脚本时就会进行块的初始化以及分配(劈块😆))。
-
每一个块由一个索引文件、一个主块文件和若干个扩展块组成,“小文件”主要存放在主块中,扩展块主要用来存放溢出的数据。
-
每个索引文件存放对应的块信息和“小文件”索引信息,索引文件会在服务启动是映射(mmap)到内存,以便极大的提高文件检索速度。 “小文件”索引信息采用在索引文件中的数据结构哈希链表来实现。
-
每个文件有对应的文件编号,文件编号从1开始编号,依次递增,同时作为哈希查找算法的Key 来定位“小文件”在主块和扩展块中的偏移量。
大文件存储结构图
块索引
每个索引文件存放对应的块信息和“小文件”索引信息
块信息的关键数据结构
特别说明一下该数据结构中已删除文件的数量
由于我们在主块中存储的小文件就像是和数组的排列类似,我们知道在数组中删除一个元素那么我们就得把其后面的元素全部往前移动,在这也一样如果我们要删除文件2那么后面的为了充分利用空间文件3还有文件4…文件n就要往前移动,这样效率就慢的一批,所以我们就给文件2做个已删除的标记不进行立即删除,已删除的文件数量就拿来记录下我们已经删了多少个文件了,等到数量达到一定的指标就在一个特定的非常少人使用淘宝的时间点进行统一的处理
小文件索引信息的数据结构
下个章节就来讲讲淘宝文件系统哈希链表结构,还有关于内存映射的一些基本操作