OSS存储原理 、s3fs实现原理剖析
s3fs实现原理剖析
一、机制分析
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 会删除部分没有连接的文件来预留出磁盘空间。对于需要经常访问的文件,有一份在本地的缓存非常有必要。
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
————————————————
OSS存储原理
OSS基于S3FS实现