文件上传原理

文件上传的原理如下图所示

FastDFS文件上传原理插图
  1. client询问tracker可以上传到哪一个storage,或者指定获取某个组的storage
  2. tracker返回一台可用的storage
  3. client直接和storage通讯完成文件上传
  4. storage保存文件以后给client返回组名(volume)和文件名称

文件上传服务端内部处理的详细机制如下:

选择tracker

当集群中有多个tracker时,由于tracker之间是完全对等的关系,因此客户端在upload文件时可以任意选择一个trakcer

选择group

当客户端没有指定group时,由服务端tracker自动指定。当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

  1. Round robin,所有的group间轮询
  2. Specified group,指定某一个确定的group
  3. Load balance,剩余存储空间多多group优先

选择storage

当选定group后,tracker会在group内选择一个storage节点给客户端,支持如下选择storage的规则:

  1. Round robin,在group内的所有storage间轮询
  2. First server ordered by ip,按ip排序
  3. First server ordered by priority,按优先级排序(优先级在storage上配置)

选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:

  1. Round robin,多个存储目录间轮询
  2. 剩余存储空间最多的优先

生成Fileid

选定存储目录之后,storage会为文件生一个Fileid:

  1. storage server ip(32位整数)
  2. 文件创建时间(unix时间戳,32位整数)
  3. 文件大小
  4. 文件crc32校验码
  5. 随机数(这个字段用来避免文件重名)

Fileid由上述部分拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串

选择文件子目录

当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash,路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下

生成文件名返回客户端

当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名返回客户端,文件名由下述几个部分构成

  1. group name-文件上传后所在的存储组名称
  2. 存储目录 – 存储服务器配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推
  3. 数据两级目录 – 存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件
  4. fileid
  5. 文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成

生成的文件名需返回到客户端,需要由客户端进行保存。

关于FastDFS相关的资料,关注公众号:程序新视界,回复“011”获得完整版PDF文档。



FastDFS文件上传原理插图1

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2020/07/31/fastdfs-upload-2/