FileManager设计文档¶
名词解释¶
- PFS:是
Paddlepaddle cloud File System
的缩写,是对用户文件存储空间的抽象,与之相对的是local filesystem。目前我们用CephFS来搭建。 - CephFS:一个POSIX兼容的文件系统。
- Chunk:逻辑划上文件分块的单位。
模块¶
架构图¶
PFSClient¶
PFSServer¶
PFSServer提供RESTful API接口,接收处理PFSClient端的文件管理请求,并且把结果返回PFSClient端。
RESTful API
- /api/v1/files
GET /api/v1/files
: Get metadata of files or directories.POST /api/v1/files
: Create files or directories.PATCH /api/v1/files
: Update files or directories.DELETE /api/v1/files
: Delete files or directories.
- /api/v1/file/chunks
GET /api/v1/storage/file/chunks
: Get chunks’s metadata of a file.
- /api/v1/storage/files
GET /api/v1/storage/files
: Download files or directories.POST /api/v1/storage/files
: Upload files or directories.
- /api/v1/storage/file/chunks
GET /api/v1/storage/file/chunks
: Download chunks’s data.POST /api/v1/storage/file/chunks
: Upload chunks’s data.
文件传输优化¶
分块文件传输¶
用户文件可能是比较大的,上传到Cloud或者下载到本地的时间可能比较长,而且在传输的过程中也可能出现网络不稳定的情况。为了应对以上的问题,我们提出了Chunk的概念,一个Chunk由所在的文件偏移、数据、数据长度及校验值组成。文件的上传和下载都是通过对Chunk的操作来实现的。由于Chunk比较小(默认256K),完成一个传输动作完成的时间也比较短,不容易出错。PFSClient需要在传输完毕最后一个Chunk的时候检查destination文件的MD5值是否和source文件一致。
一个典型的Chunk如下所示:
type Chunk struct {
fileOffset int64
checksum uint32
len uint32
data []byte
}
覆盖不一致的部分¶
文件传输的的关键在于需要PFSClient端对比source和destination的文件Chunks的checksum是否保持一致,不一致的由PFSClient下载或者传输Chunk完成。这样已经传输成功的部分就不用重新传输了。