1. 文件上传流程图
2. 选择tracker server: 当集群中不止一个tracker server时, 由于tracker之间是完全对等的关系, 客户端在upload文件时可以任意选择一个trakcer。
3. 选择存储的group: 当tracker接收到upload file的请求时, 会为该文件分配一个可以存储该文件的group。支持如下选择group的规则:
3.1. Round robin, 所有的group间轮询。
3.2. Specified group, 指定某一个确定的group。
3.3. Load balance, 剩余存储空间多多group优先。
4. 选择storage server: 当选定group后, tracker会在group内选择一个storage server给客户端。支持如下选择storage的规则:
4.1. Round robin, 在group内的所有storage间轮询。
4.2. First server ordered by ip, 按ip排序。
4.3. First server ordered by priority, 按优先级排序(优先级在storage上配置)。
5. 选择storage path: 当分配好storage server后, 客户端将向storage发送写文件请求, storage将会为文件分配一个数据存储目录, 支持如下规则:
5.1. Round robin,多个存储目录间轮询。
5.2. 剩余存储空间最多的优先。
6. 生成Fileid: 选定存储目录之后, storage会为文件生一个Fileid。规则:
6.1. 由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成, 然后将这个二进制串进行base64编码, 转换为可打印的字符串。
7. 选择两级目录: 每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测), 路由到其中一个子目录, 然后将文件以fileid为文件名存储到该子目录下。
8. 客户端upload file成功后, 会拿到一个storage生成的文件名, 接下来客户端根据这个文件名即可访问到该文件。