FastDFS-特点


FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  • Tracker Server跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
  • Storage Server存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
  • Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

架构

FastDFS

上传文件

FastDFS 上传文件

FastDFS向使用者提供基本文件访问接口,比如 upload、download、append、delete 等,以客户端库的方式提供给用户使用。Storage Server 会定期的向 Tracker Server 发送自己的存储信息。 当 Tracker Server Cluster 中的 Tracker Server 不止一个时,各个 Tracker 之间的关系是对等的,所以客户端上传时可以选择任意一个 Tracker
当 Tracker 收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的 group,当选定了 group 后就要决定给客户端分配 group 中的哪一个 storage server。当分配好 storage server 后,客户端向 storage 发送写文件请求,storage 将会为文件分配一个数据存储目录。然后为文件分配一个 fileid,最后根据以上的信息生成文件名存储文件。

下载文件

FastDFS 下载文件

客户端 uploadfile 成功后,会拿到一个 storage 生成的文件名,接下来客户端根据这个文件名即可访问到该文件。跟 uploadfile 一样,在 downloadfile 时客户端可以选择任意 tracker server。发送 download 请求给某个 tracker,必须带上文件名信息,tracke 从文件名中解析出文件的 group、大小、创建时间等信息,然后为该请求选择一个 storage 用来服务读请求。

Nginx 下载文件

Nginx 安装 FastDFS 插件后,可由客户端直接使用文件链接访问文件资源,绕开 tracker server,提高访问效率。Nginx 会负载均衡到其中一台 storage,如果没有就去 tracker server 查找原 storage 在哪台机器,然后读取原 storage 的原文件。

文件同步

写文件时,客户端将文件写至 group 内一个 storage server 即认为写文件成功,storage server 写完文件后,会由后台线程将文件同步至同 group 内其他的 storage server。每个 storage 写文件后,同时会写一份 binlog,binlog 里不包含文件数据,只包含文件名等元信息,这份 binlog 用于后台同步,storage 会记录向 group 内其他 storage 同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有 server 的时钟保持同步。storage 的同步进度会作为元数据的一部分汇报到 tracker 上,tracke 在选择读 storage 的时候会以同步进度作为参考。

文件名中包含时间戳,storage 会记录所有其他 storage 最后一次向本机同步的时间,所有同步时间中的最小值,即 storage_sync = MIN(date list) 之前的文件(文件名中包含时间戳),该机器上都有,同理所有 storage 中的最小时间,即 sync = MIN(storage_sync list) 之前的文件,该卷中所有 storage 上都有


文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录