FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

一:FastDFS原理

FastDFS 是一个开源的轻量级分布式文件系统,纯C实现,目前提供了C、Java和PHP API。功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以中小文件(建议范围:4KB<file_size<500MB)为载体的在线服务。

Fast DFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage server)和客户端(Client)。client 请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由Storage server 完成文件上传和下载,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage,从而实现软 RAID10。

1:FastDFS架构

(1)tracker server

跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的storage server 和 group,每个storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,这样使得 tracker 非常容易扩展,直接增加 tracker 机器即可扩展为tracker cluster 米服务,cluster 里每个tracker 之间是完全对等的,所有的 tracker 都接受 stroage 的心跳信息,生成元数据信息来提供读写服务,tracker 根据storage 的心跳信息,建立group==>[storage server list]的映射表。

(2)Storage server

存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storageserver,数据互为备份。客户端上传的文件最终存储在 storage服务器上,storage server 没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将 storage 称为存储服务器。storage可配置多个数据存储目录,比如有 10 块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这 10个目录都配置为 storage 的数据存储目录。

(3)Client

客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。FastDFs 向使用者提供基本文件访问接口,比如 upload、download、append、delete 等,以客户端库的方式提供给用户使用。

FastDFS分布式存储_服务器

跟踪服务器和存储节点都可以由一台或多台服务器构成,跟踪服务器和存储节点均可以随时增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对等,可以根据服务器压力情况随时增加或减少。

2:文件的上传

FastDFS分布式存储_客户端_02

Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

上传的内部机制如下:
(1)选择tracker server

当集群中不止一个tracker server时,由于tracker之间是完全对等无状态的关系,当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group。

(2)选择storage server

当选定group后,tracker会在group内选择一个storage server给客户端

(3)选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录

(4)生成Fileid

选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。

(5)生成文件名

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

3:文件的下载

FastDFS分布式存储_nginx_03

跟upload file一样,在download file时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。

(1)定位文件

客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

FastDFS分布式存储_客户端_04

(1)组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。

(2)虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。

(3)数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

(4)文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

4:集成nginx

FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。

假设Tracker服务器将文件上传到了192.168.4.125,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.4.126上取文件,就会出现文件无法访问的错误。

而fastdfs-nginx-module可以重定向文件连接到文件上传时的源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

另外,使用nginx反向代理后,后端可以以HTTP请求的方式来访问文件资源。访问nginx反向代理+上传文件时的ID。

 https://www.cnblogs.com/withLevi/p/15835469.html

二:FastDFS部署

1:环境要求

服务器:CentOs Linux release 7.9.2009(core)FastDFs 下载地址:https://github.com/happyfish100

(1)fastdfs

(2)libfastcommon

(3)fastdfs-nginx-module

(4)nginx-1.18.0

跟踪服务器1【主机】(Tracker1):192.168.10.101

跟踪服务器2【备机】(Tracker2):192.168.10.102

存储服务器1(storage1):192.168.10.103

存储服务器2(storage2):192.168.10.104

代理服务器(nginx)

2:在所有节点安装如下组件(代理服务器除外)
(1)检查Linux上是否安装了gcc libevent

FastDFS分布式存储_客户端_05

(2)安装libfastcommon

FastDFS分布式存储_客户端_06

FastDFS分布式存储_服务器_07

(3)安装编译FASTDFS

FastDFS分布式存储_nginx_08

(4)检查文件与目录

服务脚本检查

FastDFS分布式存储_服务器_09

配置文件检查

FastDFS分布式存储_nginx_10

命令工具检查

FastDFS分布式存储_nginx_11

3:配置tracker服务器(在101和102两个主机上执行)
(1)复制tracker样例配置文件,并重命名

FastDFS分布式存储_nginx_12

(2)修改tracker配置文件

FastDFS分布式存储_客户端_13

(3)创建base_path指定的目录

FastDFS分布式存储_nginx_14

(4)启动tracker服务器

FastDFS分布式存储_客户端_15

初次启动,会在/fastdfs/tracker目录下生成logs,data两个目录。

检查FastDFS Tracker Server是否启动成功:

FastDFS分布式存储_服务器_16

重启服务:

fdfs_trackerd /etc/fdfs/tracker.conf restart

4:配置STORAGE服务(在103和104主机上设置)
(1)复制storage样例配置文件,并重命名

FastDFS分布式存储_服务器_17

(2)编辑配置文件

FastDFS分布式存储_服务器_18

(3)创建基础数据目录

FastDFS分布式存储_客户端_19

(4)启动storage服务器,并检查进程

FastDFS分布式存储_nginx_20

重启用如下命令

fdfs_storaged /etc/fdfs/storage.conf restart

5:配置client(在任意一个节点Fastdfs节点上配置)

FastDFS分布式存储_nginx_21

6:测试上传文件

FastDFS分布式存储_服务器_22

FastDFS分布式存储_客户端_23

7:在所有storage节点安装fastdfs-nginx-module和nginx

FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。fastdfs-nginx-module可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的fastdfs-nginx-module在nginx安装时使用)。

(1)解压并修改fastdfs-nginx-module的配置文件

FastDFS分布式存储_服务器_24

进入解压完的目录,到src目录,修改config文件,将文件路径中存在的local删掉。

FastDFS分布式存储_服务器_25

(2)编译安装nginx

FastDFS分布式存储_客户端_26

这里的--add-module后面的值就是刚刚拷贝的fastdfs-nginx-module的src目录。

FastDFS分布式存储_nginx_27

(3)配置FASTDFS

将 fastdfs-nginx-module 模块下的 mod fastdfs.conf 文件拷贝到 /etc/fdfs/目录

FastDFS分布式存储_服务器_28

找到下面的配置进行修改:

1、base_path=/tmp 用户存储日志的,将其改为/fastdfs/temp

2、tracker_server=tracker:22122 修改为当前服务器的 ip 地址

3、group_name=groupname1 修改为之前 storage 中同样的名字

4、url_have_group_name = false 这个表示是否需要增加一个上述自定义名字的需要,改为 true

FastDFS分布式存储_客户端_29

(4)复制 FastDFs 的部分配置文件到/etc/fdfs 目录

FastDFS分布式存储_服务器_30

(5)在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录

FastDFS分布式存储_nginx_31

(6)配置 NGINX

FastDFS分布式存储_nginx_32

修改 nginx.conf 文件,在 http 指令块中新增如下配置

FastDFS分布式存储_客户端_33

FastDFS分布式存储_客户端_34

(7)浏览器访问图片

FastDFS分布式存储_服务器_35

8:部署nginx代理(在105主机上配置)

FastDFS分布式存储_客户端_36

FastDFS分布式存储_客户端_37

FastDFS分布式存储_nginx_38

测试访问

FastDFS分布式存储_nginx_39