FastDFS 介绍
FastDFS 开源地址:https://github.com/happyfish100
分布式文件系统: Distributed file system, DFS,又叫做网络文件系统:Network File System。一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
FastDFS 是一个开源的轻量级分布式文件系统,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合中小文件(建议范围:4KB < file_size <500MB),对以文件为载体的在线服务,如相册网站、视频网站等。
FastDFS 系统架构介绍
FastDFS 由跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)构成。
跟踪服务器(Tracker Server): 主要做调度工作,起到均衡的作用;负责管理所有的 storage server
和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。tracker 根据 storage 的心跳信息,建立 group==>[storage serverlist]
的映射表。
Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。
存储服务器(Storage Server): 主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group 内 storage server 数量即为该 group 的副本数),比如将不同应用数据存到不同的 group 就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的 group 来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖 group 内地其他机器,使得恢复时间会很长。
group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。storage接受到写文件请求时,会根据配置好的规则选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据作为本地文件存储到该目录中。
客户端(Client): 主要是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
安装步骤
服务器规划
这里我们使用3台服务器部署最基本的架构,分别为1台 tracker 服务器,两台 storage 服务器组成 group1,具体如下:
IP 地址 | 主机名 | 角色 |
---|---|---|
193.168.55.40 | fastdfs-01 | tracker1 |
193.168.55.41 | fastdfs-02 | storage1 |
193.168.55.42 | fastdfs-03 | storage2 |
环境准备
下载 FastDFS
在 fastdfs-01 主机上使用以下命令下载 fastdfs 相关组件
1
2
3
4
5
6
7
8
9
10
11
12cd /usr/local/src/
# 下载 libfastcommon
git clone https://github.com/happyfish100/libfastcommon.git --depth 1
# 下载 fastdfs-nginx-module
git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
# 下载 fastdfs
git clone https://github.com/happyfish100/fastdfs.git --depth 1
# 下载 Nginx
wget http://nginx.org/download/nginx-1.20.2.tar.gz- libfastcommon: 是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库,基础环境,安装即可。
- fastdfs-nginx-module: FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进行文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 193.168.55.41,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 193.168.55.42,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 193.168.55.42 上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
使用以下命令将下载好的文件同步到其他两台主机
1
2scp -r fastdfs fastdfs-nginx-module/ libfastcommon/ nginx-1.20.2.tar.gz root@193.168.55.41:/usr/local/src
scp -r fastdfs fastdfs-nginx-module/ libfastcommon/ nginx-1.20.2.tar.gz root@193.168.55.42:/usr/local/src
安装环境依赖
在每台服务器上执行以下命令安装 FastDFS 所依赖的环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21yum install -y \
git \
gcc \
gcc-c++ \
make \
automake \
autoconf \
libtool \
pcre \
pcre-devel \
zlib \
zlib-devel \
openssl-devel \
wget \
vim \
libevent \
libevent-devel \
perl \
unzip \
net-tools \
openssl
安装 FastDFS
安装 libfastcommon
在每台服务器上依次执行以下命令进行编译并安装 libfastcommon
1
2cd libfastcommon/
./make.sh && ./make.sh install检查执行的结果,查看安装是否成功
1
2
3
4
5[root@fastdfs-01 src]# ls /usr/lib64|grep libfastcommon
libfastcommon.so
[root@fastdfs-01 src]# ls /usr/lib|grep libfastcommon
libfastcommon.so
安装 fastdfs
在每台服务器上依次执行如下命令进行编译安装 fastdfs。
1
2cd fastdfs/
./make.sh && ./make.sh install检查执行的结果,查看安装是否成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@fastdfs-01 src]# ls /usr/bin|grep fdfs
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
安装部署 tracker 服务
tracker 服务器安装 Nginx
注意: tracker 上不需要安装 fastdfs-nginx-module
在 tracker 服务器上依次执行以下命令安装 Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# 解压 Nginx 源码包
tar xvf nginx-1.20.2.tar.gz
# 添加 Nginx 运行用户 www
useradd -s /sbin/nologin -M www
# 执行预编译环境检查
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--user=www \
--group=www \
--with-http_sub_module \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_flv_module \
--with-http_mp4_module
# 编译安装
make && make install为方便操作,创建 nginx 命令的软连接
1
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
查看指定的编译参数是否起作用,主要是
--with-http_stub_status_module
1
2
3
4
5
6# nginx -V
nginx version: nginx/1.20.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --user=www --group=www --with-http_sub_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module
配置并启动 tracker
在 tracker 服务器上创建 tracker 所需的目录
1
2mkdir -p /data/fastdfs/tracker
chmod 777 /data/fastdfs/tracker配置 tracker 服务,修改
/etc/fdfs/tracker.conf
文件,若文件不存在,可以将tracker.conf.sample
文件复制一份并重命名为tracker.conf
1
2# 只需要修改 base_path 一项的值为我们在上面所创建的目录即可
base_path = /data/fastdfs/tracker修改
/usr/lib/systemd/system/fdfs_trackerd.service
服务配置文件,主要修改 PID 文件存放位置,修改后文件内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[Unit]
Description=FastDFS trackerd service
After=network-online.target
[Service]
Type=forking
PIDFile=/data/fastdfs/tracker/data/fdfs_trackerd.pid
ExecStart=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
ExecStop=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
# No artificial start/stop timeout
TimeoutSec=0
# Disable OOM kill by Linux kernel
OOMScoreAdjust=-1000
[Install]
WantedBy=multi-user.target启动 tracker 服务,并配置开机启动
1
2
3# systemctl daemon-reload
# systemctl enable --now fdfs_trackerd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/fdfs_trackerd.service to /usr/lib/systemd/system/fdfs_trackerd.service.检查 tracker 服务是否启动成功
1
2
3
4
5
6
7[root@fastdfs-01 src]# netstat -anptl |grep 22122
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 8084/fdfs_trackerd
tcp 0 0 193.168.55.40:22122 193.168.55.41:49076 ESTABLISHED 8084/fdfs_trackerd
tcp 0 0 193.168.55.40:22122 193.168.55.42:41960 ESTABLISHED 8084/fdfs_trackerd
[root@fastdfs-01 src]# ps aux |grep fdfs
root 8084 0.0 0.1 155360 7948 ? Sl Dec21 0:20 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
安装部署 storage 服务
storage 服务器安装 Nginx
每台 storage 服务器都需要执行以下命令,安装 nginx 及 fastdfs-nginx-module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# 添加 nginx 运行所需用户
useradd -s /sbin/nologin -M www
# 解压 nginx
tar xvf nginx-1.20.2.tar.gz
# 预编译 Nginx
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--user=www \
--group=www \
--with-http_sub_module \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_flv_module \
--with-http_mp4_module \
--add-module=/usr/local/src/fastdfs-nginx-module/src/
# 编译以及安装 nginx
make && make install为方便操作,创建 nginx 命令的软连接
1
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
查看指定的编译参数是否起作用,主要是
--add-module=/usr/local/src/fastdfs-nginx-module/src/
1
2
3
4
5
6# nginx -V
nginx version: nginx/1.20.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --user=www --group=www --with-http_sub_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --add-module=/usr/local/src/fastdfs-nginx-module/src/
配置并启动 storage 服务
在两台 storage 服务器上创建 storage 所需目录
1
2mkdir -p /data/fastdfs/storage
chmod 777 /data/fastdfs/storage/配置 storage 服务,修改
/etc/fdfs/storage.conf
文件,需要配置项如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14# 组名称
group_name = group1
# 配置base_path为上面所创建的storage目录
base_path = /data/fastdfs/storage
# store_path: 存储所在的目录,可以设置多个,注意从0开始
store_path0 = /data/fastdfs/storage
# tracker_server的ip和端口
tracker_server = 193.168.55.40:22122
# 指定http服务的端口
http.server_port = 80修改
/usr/lib/systemd/system/fdfs_storaged.service
服务配置文件,主要修改 PID 文件存放位置,修改后文件内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[Unit]
Description=FastDFS storaged service
After=network-online.target
[Service]
Type=forking
PIDFile=/data/fastdfs/storage/data/fdfs_storaged.pid
ExecStart=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
ExecStop=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
# No artificial start/stop timeout
TimeoutSec=0
# Disable OOM kill by Linux kernel
OOMScoreAdjust=-1000
[Install]
WantedBy=multi-user.target启动 tracker 服务,并配置开机启动
1
2systemctl daemon-reload
systemctl enable --now fdfs_storaged.service检查 storage 服务是否启动成功
1
2
3
4
5
6
7[root@fastdfs-02 ~]# ps aux |grep fdfs
root 10945 0.0 1.6 281824 67208 ? Sl 10:04 0:01 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
[root@fastdfs-02 ~]# netstat -anptl |grep 23000
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 10945/fdfs_storaged
tcp 0 0 193.168.55.41:23000 193.168.55.42:36096 ESTABLISHED 10945/fdfs_storaged
tcp 0 0 193.168.55.41:47542 193.168.55.42:23000 ESTABLISHED 10945/fdfs_storaged
配置 fastdfs-nginx-module
在所有存储服务器上,配置fastdfs-nginx-module
生成配置文件
1
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
修改配置文件,配置以下几项
1
2
3
4
5
6
7
8
9
10
11
12
13tracker_server=193.168.55.40:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path_count=1
store_path0=/data/fastdfs/storage
group_count = 1 # 有几个组这里就填写几
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/storage注意:
- 最上面的 group_name: 如果集群中存在多个 group,当机器属于 group1 这组时,值为 group1; 当机器属于 group2 这组时,值为 group2。
url_have_group_name = true
。 注意: 这一项不要漏掉,会导至 nginx 不正常工作
复制另两个 web 访问用到配置文件到 fdfs 配置目录下:
1
2cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/
cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/
配置 Storage 的 Nginx 服务
在每台 storage 服务器上配置 nginx,编辑 Nginx 配置文件,在
server listen 80
的这个 server 配置下面,增加一个location
1
2
3
4
5
6
7
8
9
10
11
12...
server {
listen 80;
server_name localhost;
... 省略 N 行 ...
location ~/group([0-9]) {
root /data/fastdfs/storage/data;
ngx_fastdfs_module;
}
...启动 Nginx
1
/usr/local/nginx/sbin/nginx
配置 client 测试
在 tracker 服务器上,修改 /etc/fdfs/client.conf 文件,配置 fastdfs 的客户端使用的配置文件,需要修改的内容如下:
1
2base_path = /data/fastdfs/tracker
tracker_server = 193.168.55.40:22122从客户端的配置可以看到: 客户端只需要了解 tracker_server 的信息。tracker server 作用也正是负载均衡和调度
用 client.conf 配置文件测试上传一个文件
1
2
3
4
5
6# 创建测试文件
echo 'Test file1' > ~/b.txt
# 测试上传
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf ~/b.txt
group1/M00/00/00/wag3KWHCjvOAJRWtAAAAC-lM3z8038.txt注意返回的是 group1,我们可以 group1 下面的两台机器均找到此txt文件:
配置 tracker 的 Nginx 服务
说明: 这一步等待四台 storage server 配置完成后再进行。使用 n=Nginx 做 upstream 负载均衡的原因: 可以通过一个地址访问后端的多个 group
文件上传完成后,从浏览器访问各个 storage 的 Nginx 即可,例如:
1
2http://193.168.55.41/group1/M00/00/00/wag3KWHCjvOAJRWtAAAAC-lM3z8038.txt
http://193.168.55.42/group1/M00/00/00/wag3KWHCjvOAJRWtAAAAC-lM3z8038.txt说明: 各台 storage server 的 ip 地址后面跟着上传时所返回的地址。注意:只能访问各台机器所在的 group
如果想通过统一的 ip 地址进行访问,需要在 Nginx 中通过 upstream 访问到后端的机器,此 Nginx 应运行在 tracker 上
- 配置 tracker 服务器的 nginx.conf 文件,在 http 配置段,增加以下内容
1
include vhost/*.conf;
- 新建虚拟主机
fastdfs.china-snow.net.conf
,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15upstream fdfs_group1 {
server 193.168.55.41:80 weight=1 max_fails=2 fail_timeout=30s;
server 193.168.55.42:80 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name fastdfs.china-snow.net;
location /group1 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://fdfs_group1;
expires 30d;
}
}- 重启 Nginx,测试在浏览器中访问
1
http://193.168.55.40/group1/M00/00/00/wag3KWHCjvOAJRWtAAAAC-lM3z8038.txt