该篇博客根据此内容整理点击打开链接
1、什么是FastDFS?
FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB <file_size <500mb)为载体的在线服务,如相册网站、视频网站等等。
2、FastDFS架构
从上图可知,FastDFS架构中有三个角色:跟踪服务器(tracker server)、存储服务器(storage server) 和客户端(client)。
1)trackerserver
跟踪服务器,主要做调度工作,起负载均衡的作用。负责管理所有的storageserver和group,每个storage在启动后会连接tracker,告诉tracker自己所属的group,并保持周期性心跳,tracker根据storage的心跳信息,建立映射表,tracke管理的元数据很少(tracker上的元数据都是由storage汇报产生),并且直接存在内存中,本身不需要持久化任何数据。tracker之间是对等的,因此扩展tracker是很容易的,直接增加tracker服务,同时修改storage的配置,增加新增的tarcker服务的地址和端口,重启即可。所有的tracker都会接受storage的心跳信息,以生成元数据信息。
2)storageserver
存储服务器(又称:存储节点或数据服务器),顾名思义是用来保存文件的和文件属性的。以group为单位,每个group内可以包含多台storageserver,数据互为备份,存储容量空间以group中storage server容量最小的为准。以group为单位组织存储能够方便的进行应用隔离、负责均衡和副本数定制;确定是group的容量受单机容量的限制。group内机器故障,需要依赖group内其他机器重新同步数据来恢复数据(更换坏盘,重启fdfs_storaged即可)。storage存储依赖本地文件系统,storage可配置多个数据存储目录,磁盘不做raid,直接分别挂在到多个目录,将这些目录配置为storage的数据目录即可。
storage接收写请求的时候,会根据配置好的规则,选择其中一个存储目录来存储文件;为了避免单个目录下的文件过多,storage第一次启动的时候,会在每个数据存储目录创建2级子目录,每级256,总共65536个目录,新写的文件会以hash的方式路由到其中一个子目录下,然后将文件数据直接作为一个本地文件存储。
3)client
客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。
3、FastDFS的工作流程
3.1文件上传
上传的流程:
- client询问tracker上传到的storage
- tracker返回一台可用的storage
- client直接和storage通信,完成文件上传
1)选择trackerserver
集群中tracker之间是对等关系,client在上传文件时可以使用任意一个tracker
2)选择存储group
当tracker接收到上传文件的请求的时候,会为该文件分配一个可以存储的group。目前支持选择的group的规则有:
- Roundrobin,轮询
- Sepcifiedgroup,上传的时候指定某个group
- Loadbalance,生成存储空间较多的group优先
3)选择storage server
当选定group后,tracker会在group内选择一个storage server给client,目前支持选择server的规则有:
- Roundrobin,轮询(默认)
- 根据IP地址进行排序,选择第一个服务器(IP地址最小者)
- 根据优先级进行排序,上传优先级由storageserver来设置,参数为uoload_priority
4)选择storagepath
当分配好storageserver后,客户端将向storage发送写文件请求,storage会将文件分配一个数据存储目录,目前支持选择存储路径选择的规则有:
- Roundrobin,轮询(默认)
- loadbalance,选择使用剩余空间最大的存储路径
5)生成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地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
3.2文件下载
1)文件下载流程:
- client询问tracker要下载文件的所在的storage,参数为文件标识(group,文件名)
- tracker返回一台可用的storage
- client直接和storage通信,下载文件
client发送下载某个文件的请求到某个tracker,tracker从文件名中解析出文件的group,文件大小,创建时间等信息,然后为该请求选择一个storage用于读请求
2)选择下载服务器
目前支持的规则有:
- 轮询方式,可以下载当前文件的任意一个storage server
- 从源storage server下载
3)同步时间管理
当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢?
其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。
4)快速定位文件
知道FastDFSFID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访问的文件。
- 通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;
- 存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。