FastDFS 分布式文件系统基本原理

一、FastDFS介绍

FastDFS 是一个使用C编写的开源的高性能分布式文件系统(Distributed File System,简称DFS),由淘宝开发平台部资深架构师余庆开发。FastDFS孵化平台(ChinaUnix)版块地址: http://bbs.chinaunix.net/forum-240-1.html

FastDFS对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量
存储和负载均衡的问题,特别适合以文件为载体的在线服务,如相册网站、视频网站、电商网站等等。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

二、架构原理分析

1.架构分析

FFastDFS系统中有如下三个角色:

①:Tracker Server:跟踪服务器

  • 主要做调度工作,并对Storage Server起到负载均衡的作用;
  • 负责管理所有的Storage Server 和group,每个Storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。
  • Tracker Server可以有多台,Tracker Server之间是相互平等的关系并且同事提供服务,Tracker Server不存在单点故障,Tracker Server采用轮询方式工作,当请求的Server无法提供服务的时候,则会换另一个Tracker Server。

②Storage Server:存储服务器

  • 主要提供存储和备份服务;
  • 以group为单位,不同的group之间相互独立,每个group内可以有多台storage server,数据互为备份;
  • 采用分组存储方式的好处是灵活、可控性较强,比如上传文件的时候,可以由客户端直接指定上传到的group,也可以由Tracker进行调度选择;
  • 一个分组存储服务器的访问压力大的时候,可以在改组增加存储服务器来扩充服务能力(纵向扩容),当系统容量不足是,可以增加组来扩充存储容量(横向扩容)。

③client:客户端

  • 上传和下载数据的服务器,即就是我们自己项目所部署在的服务器。

                                          FastDFS架构图

2.存储策略

为了支持大容量存储,存储服务器使用分组(group)的组织方式,存储系统是由一个或者多个group组成,group与group之间的文件是相互独立的,所有的group文件容量的累加就是整个存储系统中的文件容量。

一个group可以由一台或者多台存储服务器组成,一个group可以由一台或者多台存储服务器组成,一个group下的各个服务器中的文件都是相同的,同group中的各个服务器起到了冗余备份和负载均衡的作用。

在group中增加服务器时,同步已有的文件是由系统自动完成,同步完成后,系统会将新的服务器切换到线上提供服务,当存储空间不足时,动态添加group,给该group中增加一个或者多个服务器,具扩大了存储容量(横向扩容)。

3.Storage状态收集

Storage Server 会通过配置连接到集群中的所有Tracker Server,定时报告自己的状态,包含磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

Storage的状态如下:

FDFS_STORAGE_STATUS_INIT :初始化,尚未得到同步已有数据的源服务器
FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
FDFS_STORAGE_STATUS_SYNCING :同步中
FDFS_STORAGE_STATUS_DELETED :已删除,该服务器从本组中摘除(注:本状态的功能尚未实现)
FDFS_STORAGE_STATUS_OFFLINE :离线
FDFS_STORAGE_STATUS_ONLINE :在线,尚不能提供服务
FDFS_STORAGE_STATUS_ACTIVE :在线,可以提供服务

4.文件上传流程,图解分析

 

1.Tracker Server 收集Storage Server的状态信息

Storage Server定时向已知的Tracker Server(可以使多个)发送磁盘空间,文件同步状况,文件上传下载等统计信息。Storage Server会向连接整个集群中的所有Tracker Server报告自己的状态。

2.选择Tracker Server

当集群中不止一个Tracker Server时,由于每个Tracker之间的关系是完全对等的,客户端在upload文件的时候可以任意选择一个Tracker。

3.选择存储的group

当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

①Round Robin:在所有的group之间轮询

②Specified group:指定某一个确定的group

③Load balance:剩余存储空间多的group优先

4.选择Storage Server

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

①Round Robin:在group内的所有Storage之间轮询

②First Server ordered by ip :按照ip排序

③First Server ordered by priority :按照优先级排序,优先级可以再storage上面进行配置

5.选择Storage path

当分配好storage server后,客户端向storage发送写文件的请求,storage将会为文件分配一个数据存储目录,支持如下规则(在storage配置文件中可以通过配置storage_path*参数来设置,该参数可以设置多个,通过*来进行区别):

①Round Robin:多个存储目录之间轮询

②剩余存储空间最多的优先

6.生成文件名

当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

7.选择两级目录

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

8.生成fileid

选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。

 

5.同group的storage间文件同步

写文件时,当客户端将文件上传至group内的一个storage server就认为写文件成功,storage写文件后,会由后台线程将文件同步至group内其他的storage server。

每个Storage写文件后,同时会写一份binlog,binlog中不包含文件数据,只包含文件名等元信息,这份binlog用户后台同步,Storage会记录向group中其他Storage同步的进度,以便重启后能够接上次的进度继续同步;进度会以时间戳的方式进行记录,所以尽量保证集群内的多有服务器的时间保持同步。

同步规则如下

1.只在本组的Storage Server之间进行同步;

2.源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;

3.当新增一台Storage Server 时,由已有的一台Storage Server将已有的所有数据(包含源头数据和备份数据)同步给新增的服务器。

Storage的同步进度会作为元数据的一部分汇报到tracker上,tracker在选择读storage的时候会以同步进度作为参考。

6.文件下载

 

客户端上传文件成功后,会获得一个Storage生成的文件名,在客户端根据该文件名就可以访问到该文件

1.Tracker Server 收集Storage Server的状态信息

Storage Server定时向已知的Tracker Server(可以使多个)发送磁盘空间,文件同步状况,文件上传下载等统计信息。Storage Server会向连接整个集群中的所有Tracker Server报告自己的状态。

2.选择Tracker Server

与上传文件时一样,在下载文件的时候客户端也可以选择任意的Tracker Server

3.选择Storage Server

客户端发送下载请求给某个Tracker,必须带上文件名信息,Tracker从文件名中解析出文件所在的group、路径信息、文件大小、创建时间、源Storage Server ip等信息,然后为该请求选择一个Storage用来服务读请求。

 

7.新增Storage Server 分析

当group中新增一台Storage Server C的时候,由系统自动完成已有数据的同步。

1. Storage Server C连接Tracker Server,Tracker Server 将Storage Server C的状态设置为 FDFS_STORAGE_STATUS_INIT。Storage Server C询问追加同步的源服务器和追加同步截止时间点,如果该group中只有Storage Server C或者该group中成功上传的文件数目为0,则没有数据同步,Storage Server就可以提供在线服务,此时Tracker会将其状态设置为FDFS_STORAGE_STATUS_ONLINE,否则Tracker会将其状态设置为FDFS_STORAGE_STATUS_WAIT_SYNC,进入第二步处理。

2. 假设Tracker Server分配想Storage Server C同步数据的源Storage Server为B,同组的Tracker Server和Storage Server通讯得知新增了Storage Server C,将会启动同步线程,并向Tracker Server询问Storage Server C追加至同步的源服务器和截止时间点。Storage Server B将把截止时间之前的的所有数据同步给Storage Server C,而其余的Storage Server从截止时间之后进行正常同步,只把源头数据同步给Storage Server C 。到了截止时间之后,Storage Server B会将对Storage Server C的同步由追加同步改为正常同步,只同步源头数据;

3.Storage Server B向Storage Server C同步完所有数据后,暂时没有数据同步时,Storage Server B请求Tracker Server将Storage Server C的状态设置为FDFS_STORAGE_STATUS_ONLINE;

4.当Storage Server C向 Tracker Server发起heart beat时,Tracker Server将其状态改为FDFS_STORAGE_STATUS_ACTIVE。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章