FastDFS系统是一个类似于Google FS的轻量级分布式文件系统,用C语言实现,支持包括Linux、FreeBSD、AIX等UNIX系统。从诞生之初至今,FastDFS已经推出了31个版本。

FastDFS同步机制 

FastDFS为什么要结合Nginx

Version 4.05之前fastdfs内部绑定了libevent作为http服务器.Version 4.05之后的版本删除了内置的web http服务,内置的web http服务是个累赘,不用也罢!


1、背景

FastDFS是一款开源的、分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发。该开源项目的主页是 http://code.google.com/p/fastdfs 。可以通过fastdfs.sourceforge.net 下载。FastDFS论坛是 http://www.csource.org ,目前是指向 ChinaUnix 开源项目孵化平台的一个板块 FastDFS,网址为 bbs.chinaunix.net/forum-240-1.html 。

下面是FastDFS的架构示意图:

特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。


2、原理

1、两个角色 tracker server 和 storage server

   多台 tracker Server 之间保证了 tracker 的分布式,tracker Server 之间是对等的,防止了单点故障。

      同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行。

   

2、FastDFS同步机制 上传 下载 添加

     文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器。每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。


tracker server 

       tracker负责管理所有的storage server和group,每个storage在启动后会主动连接tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group的映射表(即storage 配置group name 一样的为同一group)。

Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受storage的心跳信息,生成元数据信息来提供读写服务。


storage server

storage以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。

以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡; 缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。

group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录,10个目录可并发读写,提高性能。

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




fastdfs做分布式缺点就是不支持挂载硬盘。