一、机制分析
1.读取文件
S3FS 对于文件的存储分为临时文件和缓存两种方式,用户可以在命令行中通过 use_cache 参数指定缓存目录来启动缓存方式。
用户通过 offset 和 size 来读取指定文件中的特定区域,如果本地没有相应的内容 S3FS 会通过网络请求 S3 上的相应内容,并且将对应的内容存储到本地的临时文件或者缓存中。
2.文件逻辑架构
不管是临时文件还是缓存文件,S3FS 都用同一个逻辑架构组织这个文件,S3FS 使用一个页的列表来代表一个文件,每页都是这个文件中的一部分,下图为对一个文件的逻辑组织架构:
- FDPage:代表了一个文件中的一页,即也是文件中的部分内容。
参数名 | 参数 |
---|---|
offset | 偏移量 |
bytes | 页的大小 |
bytes | 是否加载到了本地 |
- PageList:代表一个本地文件,它是 FDPage 的一个链表。
参数名 | 参数 |
---|---|
pages | fdpage的链表 |
- FdEntity:对一个文件的全面描述,包括页链表、本地文件描述符、文件路径等。
3.读取文件流程
读取文件流程图:
- 不启用缓存模式:不启用缓存模式下,S3FS 会在本地新建一个临时文件来存储网络传送过来的数据,读取结束后关闭相应的句柄,这样做得好处是如果多个进程同时读取同一个文件就不需要频繁的发起网络请求,当这个临时文件的所有句柄都关闭后这个临时文件也会删除。
- 启用缓存模式:启用缓存模式下,S3FS 会将 S3 的数据在本地缓存一份,如果磁盘空间不够,S3FS 会删除部分没有连接的文件来预留出磁盘空间。对于需要经常访问的文件,有一份在本地的缓存非常有必要。
4.读取文件网络请求流程
通过网络请求 S3 的数据,S3FS 分为了两种,一种是单次请求,一种是多次请求,请求流程如下:
- 单次请求:默认情况下单次请求的大小在 20M 以下,S3FS 会通过单个请求完成数据的请求。
- 多次请求:默认情况下如果请求的数据在 20M 以上,S3FS 会切割数据进行多次请求,每次请求 10M 的数据,对单个文件的请求每次最多启动 5 个线程来进行数据的获取,并且是在 5 个线程都请求完成后才会启动下一轮请求。
二、代码文件分析:
1.原理概述:
代码层面s3fs的实现方法主要是:利用fuse库实现一个文件系统并挂载到本地文件系统的某个目录下,该文件系统的底层并不使用磁盘存储,而是使用s3 os存储(因为文件系统是自己实现的,用什么存储,怎么存储可以自己定);
2.相关代码:
s3fs项目一共有11个头文件,除去一个测试代码文件,一共有10个文件系统实现相关的文件,分别是:
1)curl.h
用于请求s3 os中的文件,多线程
2)fdcache.h
缓存文件相关类,包括fdpage、pagelist、FdEntity、FdManager,主要用于os中文件分页缓存到本地以及缓存文件的相关管理(比如检查存在、创建、清除等)
注意,若文件句柄持有线程为0,则该文件缓存被清除;
3)psemaphore.h
信号量机制实现类
4)s3fs.h
s3文件系统实现类,用于利用s3 os 为存储介质,构造一个文件系统挂载到本地文件系统目录中
5)s3fs_util.h
一些工具类
6)s3fs_auth.h
用于s3 os的认证
7)string_util.h
名字虽然是字符串工具,实际上是用于处理http协议的(header,body)
8)cache.h
文件缓存,将已读取或加载的文件缓存到本地,以备以后使用(相当于cpu的三级缓存)
9)common.h
主要用于日志记录
10)add_head.h