FastDFS文件上传原理
文件上传原理
文件上传的原理如下图所示
- client询问tracker可以上传到哪一个storage,或者指定获取某个组的storage
- tracker返回一台可用的storage
- client直接和storage通讯完成文件上传
- storage保存文件以后给client返回组名(volume)和文件名称
文件上传服务端内部处理的详细机制如下:
选择tracker
当集群中有多个tracker时,由于tracker之间是完全对等的关系,因此客户端在upload文件时可以任意选择一个trakcer
选择group
当客户端没有指定group时,由服务端tracker自动指定。当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:
- Round robin,所有的group间轮询
- Specified group,指定某一个确定的group
- Load balance,剩余存储空间多多group优先
选择storage
当选定group后,tracker会在group内选择一个storage节点给客户端,支持如下选择storage的规则:
- Round robin,在group内的所有storage间轮询
- First server ordered by ip,按ip排序
- First server ordered by priority,按优先级排序(优先级在storage上配置)
选择storage path
当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:
- Round robin,多个存储目录间轮询
- 剩余存储空间最多的优先
生成Fileid
选定存储目录之后,storage会为文件生一个Fileid:
- storage server ip(32位整数)
- 文件创建时间(unix时间戳,32位整数)
- 文件大小
- 文件crc32校验码
- 随机数(这个字段用来避免文件重名)
Fileid由上述部分拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串
选择文件子目录
当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash,路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下
生成文件名返回客户端
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名返回客户端,文件名由下述几个部分构成
- group name-文件上传后所在的存储组名称
- 存储目录 – 存储服务器配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推
- 数据两级目录 – 存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件
- fileid
- 文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成
生成的文件名需返回到客户端,需要由客户端进行保存。
关于FastDFS相关的资料,关注公众号:程序新视界,回复“011”获得完整版PDF文档。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接