FastDFS 搭建分布式文件管理系统

FastDFS 搭建分布式文件管理系统

FastDFS 简介

FastDFS 是一个开源的高性能分布式文件系统(Distributed File System)。它的主要功能包括:文件存储、文件同步和文件访问以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线服务。

FastDFS 开源地址:https://github.com/happyfish100/fastdfs

由于网络上已有很多详细的关于 FastDFS 的介绍,故此处不再赘述。请查看参考文章中的第 1、2 条。

FastDFS 架构图

FastDFS 分布式文件系统架构图

FastDFS 上传流程

FastDFS 文件上传流程示意图

FastDFS 下载流程

FastDFS 文件下载流程示意图

安装 FastDFS

配置防火墙

本篇文章是基于 CentOS v8.2.2004 版本,以下操作均为单机环境,单机 IP 地址为 192.168.61.128。在安装 FastDFS 之前,需要先进行防火墙的设置。防火墙的相关命令如下:

1
2
3
4
5
6
7
8
## 暂时关闭防火墙
systemctl stop firewalld

## 永久关闭防火墙
systemctl disable firewalld

## 启用防火墙
systemctl enable firewalld

下载安装 libfastcommon

libfastcommon 是从 FastDFS 抽取出来的公共 c 函数库。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
## 下载
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

## 解压
tar -zxvf V1.0.43.tar.gz
cd libfastcommon-1.0.43

## 编译安装
./make.sh
./make.sh install

libfastcommon.so 安装到了 /usr/lib64/libfastcommon.so,但是 FastDFS 主程序设置的 lib 目录是 /usr/local/lib,所以需要创建软链接。

1
2
3
4
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

下载安装 FastDFS

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
## 下载
wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

## 解压
tar -zxvf V6.06.tar.gz
cd fastdfs-6.06

## 编译安装
./make.sh
./make.sh install

安装完成之后,服务脚本存储在 /etc/init.d/ 中,详细文件如下:

/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_tracker

默认配置文件存储在 /etc/fdfs/ 中,详细文件如下:

/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/tracker.conf.sample

命令工具存储在 /usr/bin/ 中,详细文件如下:

fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_regenerate_filename
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
stop.sh
restart.sh

配置 FastDFS Tracker 服务

修改配置文件

从上文可知,配置文件在 /etc/fdfs/ 中,我们需要拷贝一份并进行一些修改。

1
2
3
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
vim tracker.conf

需要修改的部分如下:

1
2
3
4
5
## Tracker 数据和日志存储目录
base_path = /home/fastdfs/tracker

## HTTP 服务端口
http.server_port = 80

根据上述配置,创建配置中的目录

1
mkdir -p /home/fastdfs/tracker

启动 Tracker 服务

初次成功启动,会在 base_path 即 /home/fastdfs/tracker 下创建 data、logs 两个目录。启动命令如下:

1
2
3
/etc/init.d/fdfs_trackerd start
## 或
service fdfs_trackerd start

启动后,可以通过 netstat 命令查看是都启动成功,若得到以下类似输出,22122 端口处于监听状态,则表示 Tracker 服务安装并启动成功。

1
netstat -unltp | grep fdfs
## 输出内容
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      6220/fdfs_trackerd

同理,可以通过下列命令关闭 Tracker 服务或者设置 Tracker 开机自启:

1
2
3
4
5
## 关闭服务
service fdfs_trackerd stop

## 开机自启
chkconfig fdfs_trackerd on

配置 FastDFS Storage 服务

修改配置文件

与配置 Tracker 服务类似,首先我们也需要拷贝样例配置文件并进行相应修改。

1
2
3
cd /etc/fdfs
cp storage.conf.sample storage.conf
vim storage.conf

需要修改的部分如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
## Tracker 数据和日志存储目录
base_path = /home/fastdfs/storage

## 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录
store_path_count=1

## 逐一配置 store_path_count 个路径,索引号基于 0
## 如果不配置 store_path0,那它就和 base_path 对应的路径一样
store_path0=/home/fastdfs/file

## FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。
## 如果本参数为 N(默认 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N*N 个存放文件的子目录
subdir_count_per_path=256

## tracker_server 的列表 ,会主动连接 tracker_server
## 有多个 tracker server 时,每个 tracker server 写一行
tracker_server=192.168.61.128:22122

## HTTP 服务端口
http.server_port = 80

根据上述配置,创建配置中的目录

1
2
3
4
5
## base_path
mkdir -p /home/fastdfs/storage

## store_path0
mkdir -p /home/fastdfs/file

启动 Storage 服务

启动 Storage 前确保 Tracker 是启动的。初次启动成功,会在 base_path 即 /home/fastdfs/storage/ 目录下创建 data、logs 两个目录。启动命令如下:

1
2
3
/etc/init.d/fdfs_storaged start
## 或
service fdfs_storaged start

启动后,可以通过下列命令查看 Storage 服务是否启动成功。若输出结果与下列输出类似,23000 端口正处于监听状态,则 Storage 服务启动成功。

1
netstat -unltp | grep fdfs
## 输出内容
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      6257/fdfs_storaged
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      6220/fdfs_trackerd

同理,可以通过下列命令关闭 Tracker 服务或者设置 Tracker 开机自启:

1
2
3
4
5
## 关闭服务
service fdfs_storaged stop

## 开机自启
chkconfig fdfs_storaged on

此时我们可以在 store_path0 目录下看到 Storage 服务自动创建的 N*N 个子目录

1
2
3
4
5
6
7
ls /home/fastdfs/file/data/

## 统计文件夹数量
ls -l | grep "^d" | wc -l

cd 00
ls -l | grep "^d" | wc -l
## 输出内容
00  0A  14  1E  28  32  3C  46  50  5A  64  6E  78  82  8C  96  A0  AA  B4  BE  C8  D2  DC  E6  F0  FA
01  0B  15  1F  29  33  3D  47  51  5B  65  6F  79  83  8D  97  A1  AB  B5  BF  C9  D3  DD  E7  F1  FB
02  0C  16  20  2A  34  3E  48  52  5C  66  70  7A  84  8E  98  A2  AC  B6  C0  CA  D4  DE  E8  F2  FC
03  0D  17  21  2B  35  3F  49  53  5D  67  71  7B  85  8F  99  A3  AD  B7  C1  CB  D5  DF  E9  F3  FD
04  0E  18  22  2C  36  40  4A  54  5E  68  72  7C  86  90  9A  A4  AE  B8  C2  CC  D6  E0  EA  F4  FE
05  0F  19  23  2D  37  41  4B  55  5F  69  73  7D  87  91  9B  A5  AF  B9  C3  CD  D7  E1  EB  F5  FF
06  10  1A  24  2E  38  42  4C  56  60  6A  74  7E  88  92  9C  A6  B0  BA  C4  CE  D8  E2  EC  F6
07  11  1B  25  2F  39  43  4D  57  61  6B  75  7F  89  93  9D  A7  B1  BB  C5  CF  D9  E3  ED  F7
08  12  1C  26  30  3A  44  4E  58  62  6C  76  80  8A  94  9E  A8  B2  BC  C6  D0  DA  E4  EE  F8
09  13  1D  27  31  3B  45  4F  59  63  6D  77  81  8B  95  9F  A9  B3  BD  C7  D1  DB  E5  EF  F9

256

256

文件上传测试

修改配置文件

与配置 Storage 服务类似,首先我们也需要拷贝客户端样例配置文件并进行相应修改。

1
2
3
cd /etc/fdfs
cp client.conf.sample client.conf
vim client.conf

需要修改的部分如下:

1
2
3
4
5
## Client 的数据和日志目录
base_path=/home/fastdfs/client

## Tracker端口
tracker_server=192.168.61.128:22122

上传图片测试

执行下列命令,尝试上传一张图片到 FastDFS 中:

1
fdfs_upload_file /home/Pictures/1989.jpg

上传成功后,会输出文件 ID:group1/M00/00/00/wKg9gF-f0aKAUJAlAARra4mLMhc390.jpg

返回的文件 ID 由 group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

FastDFS 文件 ID 结构示例

配置 Nginx

安装 Nginx 的相关操作请查看文章 初识 Nginx,此处不再赘述。

修改配置

经过上述操作之后,文件已经可以通过命令行的方式上传到 FastDFS 中,但还无法下载,此时我们需要使用 Nginx 来实现下载功能。修改 Nginx 配置文件,在 server 组内添加以下内容:

1
2
3
4
5
6
7
8
9
server {
    listen       80;
    server_name  localhost;

    ## 添加以下部分
    location /group1/M00 {
        alias /home/fastdfs/file/data;
    }
}

然后重启 Nginx,访问服务器 ip/fileid 进行测试,根据上述例子,此处访问 http://192.168.61.128/group1/M00/00/00/wKg9gF-f0aKAUJAlAARra4mLMhc390.jpg

测试结果如下图,可以看到已经访问成功,HTTP 状态码返回 200。

FastDFS 文件访问测试结果

配置 fastdfs-nginx-module 模块

模块简介

fastdfs-nginx-module 可以重定向文件链接到源服务器,避免由于 Storage 服务器复制延迟导致文件无法访问而产生的错误。

下载解压

1
2
3
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
tar -zxvf V1.22.tar.gz
cd fastdfs-nginx-module

为 Nginx 添加模块

首先进入 Nginx 源目录,然后执行 ./configure 命令,具体命令如下:

1
2
3
4
nginx -s stop
cd /usr/local/software/nginx-1.18.0
./configure --prefix=/usr/local/nginx/ --add-module=$YOUR_PATH/fastdfs-nginx-module/src
make && make install

其中,/usr/local/software/nginx-1.18.0 为 Nginx 源目录,--prefix 参数指定新版本生成的目录,--add-module 参数表示添加模块,$YOUR_PATH 需要手动替换为 fastdfs-nginx-module 模块的文件路径,本例中为 /usr/local/software/fastdfs-nginx-module

安装好之后可以通过以下命令查看 Nginx 模块,如果输出与下列内容类似,则表示模块添加成功。

1
nginx -V
## 输出内容
nginx version: nginx/1.18.0
built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)
configure arguments: --prefix=/usr/local/nginx/ --add-module=/usr/local/software/fastdfs-nginx-module/src

修改 Nginx 配置

修改 nginx.conf,在 server 中做出如下修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server {
    listen       80;
    server_name  localhost;

    ## 删除以下部分
    location /group1/M00 {
        alias /home/fastdfs/file/data;
    }

    ## 添加以下部分
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
}

修改 fastdfs-nginx-module 配置

复制 fastdfs-nginx-module 源码中的配置文件到 /etc/fdfs 目录,兵做以下修改。

1
2
cd /usr/local/software/fastdfs-nginx-module/src
cp mod_fastdfs.conf /etc/fdfs/
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
## Tracker Server
tracker_server=192.168.61.128:22122

## Storage Server 默认端口
storage_server_port=23000

## 如果文件 ID 的 uri 中包含 /group**,则要设置为 true
url_have_group_name = true

## Storage 配置的 store_path0 路径,必须和 storage.conf 中的一致
store_path0=/home/fastdfs/file

复制 FastDFS 的部分配置文件到 /etc/fdfs 目录

1
2
cd /usr/local/software/fastdfs-5.05/conf/
cp anti-steal.jpg http.conf mime.types /etc/fdfs/

测试

配置完成之后,我们先启动 Nginx 服务,并观察输出内容,如果与下列输出类似,则表示配置成功。

1
nginx
## 输出内容
ngx_http_fastdfs_set pid=11648

此时我们可以在浏览器中访问前文中上传的文件,能下载文件则表示 fastdfs-nginx-module 模块安装成功。注意和和前文中直接使用 Nginx 路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。访问结果如下图所示。

FastDFS 通过 Nginx 模块访问文件测试

至此,FastDFS 搭建分布式文件管理系统就初步完成了,在下一篇文章中,将介绍如何在客户端上通过 Java 来实现文件的上传和下载。

参考文章

  1. 用 FastDFS 一步步搭建文件管理系统
  2. FastDFS 简介
  3. FastDFS Distributed File Storage
  4. FastDFS 配置文件详解(修订版 1)
  5. 初识 Nginx
  6. fastdfs nginx module installation introduction
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy