分布式文件系统FastDFS快速入门

什么是FastDFS?

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500mb)为载体的在线服务,如相册网站、视频网站等等。

FastDFS架构

从上图可知,FastDFS架构中有三个角色:跟踪服务器(tracker server)存储服务器(storage server) 客户端(client)

tracker server

跟踪服务器,主要做调度工作,起负载均衡的作用。负责管理所有的storage server和group,每个storage在启动后会连接tracker,告诉tracker自己所属的group,并保持周期性心跳,tracker根据storage的心跳信息,建立映射表,tracke管理的元数据很少(tracker上的元数据都是由storage汇报产生),并且直接存在内存中,本身不需要持久化任何数据。tracker之间是对等的,因此扩展tracker是很容易的,直接增加tracker服务,同时修改storage的配置,增加新增的tarcker服务的地址和端口,重启即可。所有的tracker都会接受storage的心跳信息,以生成元数据信息。

storage server

存储服务器(又称:存储节点或数据服务器),顾名思义是用来保存文件的和文件属性的。以group为单位,每个group内可以包含多台storage server,数据互为备份,存储容量空间以group中storage server容量最小的为准。以group为单位组织存储能够方便的进行应用隔离、负责均衡和副本数定制;确定是group的容量受单机容量的限制。group内机器故障,需要依赖group内其他机器重新同步数据来恢复数据(更换坏盘,重启fdfs_storaged即可)。storage存储依赖本地文件系统,storage课配置多个数据存储目录,磁盘不做raid,直接分别挂在到多个目录,将这些目录配置为storage的数据目录即可。

storage接收写请求的时候,会根据配置好的规则,选择其中一个存储目录来存储文件;为了避免单个目录下的文件过多,storage第一次启动的时候,会在每个数据存储目录创建2级子目录,每级256,总共65536个目录,新写的文件会以hash的方式路由到其中一个子目录下,然后将文件数据直接作为一个本地文件存储。

client

客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。

FastDFS的工作流程

文件上传

文件上传

上传的流程:

  1. client询问tracker上传到的storage
  2. tracker返回一台可用的storage
  3. client直接和storage通信,完成文件上传

选择tracker server

集群中tracker之间是对等关系,client在上传文件时可以使用任意一个tracker

选择存储group

当tracker接收到上传文件的请求的时候,会为该文件分配一个可以存储的group。目前支持选择的group的规则有:

  1. Round robin,轮询
  2. Sepcified group,上传的时候指定某个group
  3. Load balance,生成存储空间较多的group优先

选择storage server

当选定group后,tracker会在group内选择一个storage server给client,目前支持选择server的规则有:

  1. Round robin,轮询(默认)
  2. 根据IP地址进行排序,选择第一个服务器(IP地址最小者)
  3. 根据优先级进行排序,上传优先级由storage server来设置,参数为uoload_priority

选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage会将文件分配一个数据存储目录,目前支持选择存储路径选择的规则有:

  1. Round robin,轮询(默认)
  2. load balance,选择使用剩余空间最大的存储路径

生成file id

选择存储目录之后,storage会生成一个file_id,采用base64编码,包含有:storage server ip,文件创建时间,文件大小,文件CRC32校验码和随机数。每个存储目录下有两个256*256个子目录,storage会按文件file_id进行两次hash,路由到其中一个子目录,然后将文件以file_id为名字存储。
文件路径如下:

group0/M00/00/02/exwf8b8lFJIxx2234841AAAbpQt7xVI473456.txt

组名:group0 磁盘: M00 目录:00/02 文件名:exwf8b8lFJIxx2234841AAAbpQt7xVI473456.txt

文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名

  • 组名:文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,需要客户端自行保存。
  • 虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项store_path*对应。
  • 数据两级目录:存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
  • 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

文件下载

文件下载流程:

  1. client询问tracker要下载文件的所在的storage,参数为文件标识(group,文件名)
  2. tracker返回一台可用的storage
  3. client直接和storage通信,下载文件

client发送下载某个文件的请求到某个tracker,tracker从文件名中解析出文件的group,文件大小,创建时间等信息,然后为该请求选择一个storage用于读请求

选择下载服务器

目前支持的规则有:

  1. 轮询方式,可以下载当前文件的任意一个storage server
  2. 从源storage server下载

同步时间管理

当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢?

其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。

快速定位文件

知道FastDFS FID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访问的文件。

  1. 通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;
  2. 存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。