README.md 4.0 KB
Newer Older
G
gongweibao 已提交
1 2
# FileManager设计文档
## 目标
G
gongweibao 已提交
3 4
在本文档中,我们设计说明了名为FileManager系统,方便用户管理存放到PaddlePaddle Cloud上的文件。   
主要功能包括:
G
gongweibao 已提交
5

G
gongweibao 已提交
6
- 提供常用的命令行管理命令管理文件和目录
G
gongweibao 已提交
7
	- 支持的命令在[Here](./pfs/pfs.md)
G
gongweibao 已提交
8
- 支持大文件的断点上传、下载  
G
gongweibao 已提交
9

G
gongweibao 已提交
10
## 名词解释
G
gongweibao 已提交
11
- PFS:是Paddlepaddle cloud File System的简称,是对用户文件存储空间的抽象,与之相对的是local filesystem。目前我们用CephFS来搭建。
G
gongweibao 已提交
12 13 14 15 16 17 18 19 20 21
- [CephFS](http://docs.ceph.com/docs/master/cephfs/):一个POSIX兼容的文件系统。
- Chunk:逻辑划上文件分块的单位。
- [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/):提供七层协议的反向代理、基于粘性会话的负载均衡。

## 模块

### 架构图
<image src=./src/filemanager.png width=900>

### PFSClient
G
gongweibao 已提交
22
- 功能: 详细的内容看
G
gongweibao 已提交
23
	- 提供用户管理文件的命令
G
gongweibao 已提交
24
	- 用Go写,可以跨平台执行
G
gongweibao 已提交
25 26

- 双向验证   
G
gongweibao 已提交
27 28 29 30 31 32 33 34 35 36
	PFSClient需要和Ingress之间做双向验证<sup>[tls](#tls)</sup>,所以用户需要首先在`cloud.paddlepaddle.org`上注册一下,申请用户空间,并且把系统生成的CA(certificate authority)、Key、CRT(CA signed certificate)下载到本地,然后才能使用PFSClient。
	
- 命令格式

```
paddle [options] pfs <subcommand> [parameters]

options:

```
G
gongweibao 已提交
37
	
G
gongweibao 已提交
38
### Ingress
G
gongweibao 已提交
39 40 41 42
- 功能:  
	提供七层协议的反向代理、基于粘性会话的负载均衡功能。
	
- 透传用户身份的办法  
G
gongweibao 已提交
43
	Ingress需要把PFSClient的身份信息传给FileServer,配置的方法参考[Here](http://www.integralist.co.uk/posts/clientcertauth.html#3)
G
gongweibao 已提交
44 45


G
gongweibao 已提交
46 47
### PFSServer
PFSServer提供RESTful API接口,接收处理PFSClient端的文件管理请求,并且把结果返回PFSClient端。
G
gongweibao 已提交
48

G
gongweibao 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
```
RESTful API

- /api/v1/files
	- `GET /api/v1/files`: Get attributes of files or directories.
	- `POST /api/v1/files`: Create files or directories.
	- `DELETE /api/v1/files`: Delete files or directories.

- /api/v1/storage/files
	- `GET /api/v1/storage/files`: Download files or directories to local.
	- `POST /api/v1/storage/files`: Upload files or directories to server.

- /api/v1/storage/file/chunks
	- `GET /api/v1/storage/file/chunks`: Get chunks's attributes in a file.
	- `POST /api/v1/storage/file/chunks`: Upload chunks to a file.
```
G
gongweibao 已提交
65
## 文件传输优化
G
gongweibao 已提交
66

G
gongweibao 已提交
67
### 分块文件传输
G
gongweibao 已提交
68
用户文件可能是比较大的,上传到Cloud或者下载到本地的时间可能比较长,而且在传输的过程中也可能出现网络不稳定的情况。为了应对以上的问题,我们提出了Chunk的概念,一个Chunk由所在的文件偏移、数据、数据长度及校验值组成。文件数据内容的上传和下载都是都过Chunk的操作来实现的。由于Chunk比较小(默认256K),完成一个传输动作完成的时间也比较短,不容易出错。PFSClient在传输完毕最后一个Chunk的时候检查destination文件的MD5值是否和source文件一致。
G
gongweibao 已提交
69

G
gongweibao 已提交
70
一个典型的Chunk如下所示:
G
gongweibao 已提交
71

G
gongweibao 已提交
72 73
```
type Chunk struct {
G
gongweibao 已提交
74 75
	fileOffset int64
	checksum uint32
G
gongweibao 已提交
76 77 78 79
	len     uint32
	data    []byte
}
```  
G
gongweibao 已提交
80

G
gongweibao 已提交
81
### 生成sparse文件
G
gongweibao 已提交
82
当destination文件不存在或者大小和source文件不一致时,可以用[Fallocate](https://Go.org/pkg/syscall/#Fallocate)生成sparse文件,然后就可以并发写入多个Chunk。
G
gongweibao 已提交
83

G
gongweibao 已提交
84 85
### 覆盖不一致的部分
文件传输的的关键在于需要PFSClient端对比source和destination的文件Chunks的checksum是否保持一致,不一致的由PFSClient下载或者传输Chunk完成。这样已经传输成功的部分就不用重新传输了。
G
gongweibao 已提交
86

G
gongweibao 已提交
87 88
## 框架生成
[swagger-api](https://github.com/swagger-api/swagger-codegen)生成Client和FileServer的框架部分,以便我们可以把更多的精力放到逻辑本身上。
G
gongweibao 已提交
89 90

## 参考文档
G
gongweibao 已提交
91
- <a name=tls></a>[TLS complete guide](https://github.com/k8sp/tls/blob/master/tls.md)
G
gongweibao 已提交
92 93
- [aws.s3](http://docs.aws.amazon.com/cli/latest/reference/s3/)
- [linux man document](https://linux.die.net/man/)