FastDFS的基本知识
一、FastDFS是啥?
FastDFS 是以C语言开发的一项开源轻量级分布式文件系统。由阿里巴巴开发并开源。
主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
因此,特别适合以文件为载体的在线服务,例如图片网站,视频网站等。
二、FastDFS的基本组成
FastDFS文件系统由两大部分构成,一个是客户端,一个是服务端。
客户端通常指我们的程序,比如我们的Java程序去连接FastDFS、操作FastDFS,那我们的Java程序就是一个客户端。FastDFS提供专有API访问,目前提供了C、Java和PHP几种编程语言的API,用来访问FastDFS文件系统。
服务端由两个部分构成:一个是跟踪服务器(tracker),一个是存储服务器(storage)。
跟踪服务器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽。因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。
存储服务器(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等。
三、FastDFS的工作流程
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,最后根据以上的信息生成文件名存储文件。存储完成后将信息返回给client。
file_id:采用 Base64 编码,包含字段包括:storage server ip、文件创建时间、文件大小、文件 CRC32 校验码和随机数。
路径信息:在每一个storage存储节点中,每个存储目录下有两个 256*256 个子目录,storage 会按文件 file_id 进行两次 hash,路由到其中一个子目录,然后将文件以 file_id 为文件名存储到该子目录下,最后生成文件路径:group 名称、虚拟磁盘路径、hash选择的数据两级目录、file_id。例如文件路径group1/M00/00/02/wKgDrE342weJHG87966.sh
。
(二)FastDFS中文件下载流程
文件下载与上传类似,都需要首先经过tracker的调度。
当客户端向Tracker发起下载请求时,先查询storage,并检测同步状态,返回对应的storage server的ip和端口,
然后客户端会带着文件信息(组名,路径,文件名),去访问相关的storage,进行文件的下载。
(三)FastDFS内部的文件同步
跟upload file一样,在下载文件时客户端也可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
可以从任意的storage中上传和下载,是因为DFS内部有文件同步。写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。