1. 分布式文件系统介绍

概述:FastDFS是一款开源的轻量级分布式文件系统,主要用它来对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。

FastDFS服务端有两个角色:跟踪器(tracker)存储节点(storage)

跟踪器主要做调度工作,在访问上起负载均衡的作用。

存储节点主要的工作:存储、同步和提供存取接口。

FastDFS系统结构如下图所示:

工作原理说明:

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

为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷 的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起 到了冗余备份和负载均衡的作用。

在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。

当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

2. 文件上传流程

FastDFS中的文件标识分为两部分:卷名和文件名,二者缺一不可。

文件上传的交互流程:

  1. client询问tracker可以执行上传操作的storage,不需要附加参数;
  2. tracker返回一台可用的storage的ip地址和端口号。
  3. client直接与storage通讯完成文件上传。

3. 文件下载流程

文件下载的交互流程:

  1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名)。
  2. tracker返回一台可用的storage;
  3. client直接和storage通讯完成文件的下载;

需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。

4. 搭建服务器

4.1 安装依赖的环境

安装FastDFS需要先从官网下载源码,然后进行编译,但是编译需要gcc环境,所以需要先安装gcc。

1
# yum -y install gcc-c++

FastDFS依赖于libevent库,需要安装:

1
# yum -y install libevent

4.2 上传安装文件

需要的安装文件如下,有需要的朋友就自己寻找到相应官网下载即可。

在/usr/local/目录下新建fastdfs目录,然后按住alt+p键即可实现拖进虚拟机

1
2
3
# cd /usr/local
# mkdir fastdfs/
按住alt+p,并用cd切换到/usr/local/fastdfs目录下进行拖拽

4.3 安装libfastcommon

libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的的一些基础库。

1
2
3
4
5
# cd /usr/local/fastdfs
# tar -zxvf libfastcommonV1.0.7.tar.gz
# cd libfastcommon-1.0.7
# ./make.sh
# ./make.sh install

注意: libfastcommon安装好后会自动将库文件拷贝至/usr/lib64下,由于FastDFS程序引用usr/lib目录,所以需要将/usr/lib64下的库文件拷贝至/usr/lib下。

1
2
# cp /usr/lib64/libfastcommon.so /usr/lib
# ll /usr/lib

4.4 安装FastDFS(tracker + storage)

此处我们将tracker和storage配置在一台服务器上,真实环境应该要考虑高可用,需要配置在多台服务器上。

1
2
3
4
5
# cd /usr/local/fastdfs
# tar -zxvf FastDFS_v5.05.tar.gz
# cd FastDFS
# ./make.sh
# ./make.sh install

安装成功后将安装目录下的conf下的文件拷贝到/etc/fdfs/下。

1
2
# cd /usr/local/fastdfs/FastDFS/conf/
# cp * /etc/fdfs/

4.4.1 安装Tracker服务

配置tracker服务。修改/etc/fdfs/tracker.conf文件。

启动tracker:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

重启使用命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

4.4.2 安装storage服务

  1. 如果是在不同的服务器安装,则前面的两步需要重新执行。

  2. 配置storage服务。修改/etc/fdfs /storage.conf

启动storage:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

重启storage:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

5. 配置客户端

分三步走:

  1. 将/usr/local/FastDFS/client目录下的libfdfsclient.so文件拷贝到/usr/lib/目录
1
2
# cd /usr/local/FastDFS/client
# cp libfdfsclient.so /usr/lib/
  1. 修改配置文件/etc/fdfs/client.conf

  1. 测试

在/root/目录下新建hi.html文件,编辑

启动tracker和storage,并用客户端上传

1
2
3
# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
# /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/hi.html

然后复制url地址即可访问:

注意:第一次访问是访问不到的,从URL地址观察会发现访问的其实就是80默认端口,所以需要让虚拟机的防火墙对80端口开放。

1
2
3
# firewall-cmd --add--service=http --permaent
# firewall-cmd --add-port=80/tcp --permanent
# firewall-cmd --list-all

但是开放80端口之后,会发现其实还是访问不到的,因为客户端访问FastDFS会存在一个ftp协议,而url地址使用的是http协议,所以需要配置Nginx和Nginx插件,让客户端去访问Nginx,而Nginx找Nginx插件,Nginx插件去访问FastDFS。这样才能达到预期效果。

6. 安装Nginx和Nginx插件

Nginx需要依赖一些环境(gcc在前面已经安装,所以这里不用再次安装)

1
2
3
4
# yum -y install gcc-c++
# yum -y install pcre pcre-devel
# yum -y install zlib zlib-devel
# yum -y install openssl openssl-devel

安装Nginx和Nginx插件,两者结合

  1. 解压插件压缩包
1
# tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
  1. 修改fastdfs_nginx_module/src/config文件,把其中的local去掉。

  1. 把fastdfs-nginx-module/src/mod_fastdfs.conf文件复制到/etc/fdfs目录下。并编辑该文件:

  1. 解压Nginx,进入其目录。
  2. 给Nginx添加插件
1
#./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src
  1. make
  2. make install

注意:Nginx默认安装路径是/usr/local/nginx目录下,所以进入此目录中

  1. Nginx的配置
1
# cd /usr/local/nginx/conf

在nginx的配置文件中添加一个location:

  1. 启动nginx
1
2
3
# cd /usr/local/nginx/sbin/
# ./nginx
# ps -ef | gerep nginx

7. 测试上传访问

将一张图片拖入/root目录:

开启tracker和storage,并上传

1
2
3
# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
# /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/3301.jfif

尝试访问:

成功!!!