FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS 架构包括 Tracker serverStorage server。客户端请求 Tracker server 进行文 件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。

  • Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些 策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器调度服务器
  • Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上, Storageserver 没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将 storage 称为存储服务器

服务端两个角色:

  • Tracker: 管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
  • Storage: 实际保存文件, Storage 分为多个组,每个组之间保存的文件是不同的。每 个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念

安装准备

1、安装gcc(编译时需要)

FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc

yum install -y gcc gcc-c++

2、安装libevent(运行时需求)

若安装了桌面图形界面,就不需要安装;FastDFS依赖libevent库;

yum -y install libevent libevent-devel

3、安装libfastcommon 并优化tcp

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

#下载
git clone https://github.com/happyfish100/libfastcommon.git
#切换到目录
cd /usr/local/libfastcommon
#编译安装
./make.sh           #编译
./make.sh install   #安装
安装libfastcommon结果

4. 优化内核

#编辑
vim /etc/sysctl.conf

#修改下面四项
net.ipv4.tcp_syncookies  = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle =  1

net.ipv4.tcp_fin_timeout = 30

#重新加载
sysctl -p

安装FastDFS

#下载FastDFS发行版
cd /usr/local
wget https://github.com/happyfish100/fastdfs/archive/V5.11.zip
unzip V5.11.zip

#安装
cd fastdfs-5.11
./make.sh && ./make.sh install

#删除安装包
rm -rf ../V5.11.zip
FastDFS安装成功

配置FastDFS

安装成功后,将conf目录中的配置文件拷贝到/etc/fdfs下,开始进行FastDFS的配置。

#复制原始配置文件目录
cp /usr/local/FastDFS/conf/* /etc/fdfs

#切换到配置目录下
cd /etc/fdfs

配置Tracker

#从样例配置复制
cp tracker.conf.example tracker.conf
vim tracker.conf

#修改以下项
base_path=/data/fastdfs/tracker
#侦听端口
port=22122
#http访问端口
http.server_port=8122
#保存并退出
:wq

#创建对应目录
mkdir -p /data/fastdfs/tracker

#启动tracker,后面可跟具体的启动命令
fdfs_trackerd /etc/fdfs/tracker.conf [restart]

#启动后会在base_path下生成data和log两个目录

如果配置多个tracker服务器构成集群,需要使用nginx反向代理,在多个tracker之间负载均衡

配置Storage

#从样例配置复制
cp storage.conf.example storage.conf
vim storage.conf

#修改以下项
group_name=group1  #存储组名称,在集群配置时,同一组的storage server 存储相同的数据
base_path=/data/fastdfs/storage
store_path_count=1 #存储目录数量,代表数据可存放入几个分区,在多个硬盘时用到
store_path0=/data/fastdfs/data  #后面的数字从0开始,一共可配置存储目录数量个,分别代表每个存储目录的路径

tracker_server=192.168.1.3:22122 #tracker服务器地址,可配置多个

#侦听端口
port=23000
#http访问端口
http.server_port=8122
#保存并退出
:wq

#创建对应目录
mkdir -p /data/fastdfs/storage
mkdir -p /data/fastdfs/data

#启动storage,后面可跟具体的启动命令
fdfs_storaged /etc/fdfs/storage.conf [restart]

#启动后会在base_path下生成data和log两个目录

可以配置多个storage, 两两分组,互为备份。同组之间存储同一数据,可以进行读写分离。

防火墙配置

为了使得外部能够访问,需要配置防火墙,开放使用到的端口

#使用iptable开放端口
iptables -i INPUT 1 -p tcp --dport 8122 -j ACCEPT
iptables -i INPUT 1 -p tcp --dport 8230 -j ACCEPT
iptables -i INPUT 1 -p tcp --dport 22122 -j ACCEPT
iptables -i INPUT 1 -p tcp --dport 23000 -j ACCEPT
#保存配置
service iptables save

FastDFS测试

在测试之前,首先需要配置客户端。

#从样例配置复制
cp client.conf.example client.conf
vim client.conf

#修改以下项
base_path=/data/fastdfs/client
#tracker服务器,此处端口应和tracker_server的http.server_port保持一致。
tracker_server=192.168.1.3:8122

#保存并退出
:wq

#创建对应目录
mkdir -p /data/fastdfs/client

#上传测试
fdfs_test /etc/fdfs/client.conf upload /tmp/test.png

#此时,即可在/data/fastdfs/data目录下找到对应的文件。
图片上传测试结果

FastDFS和Nginx的整合

上传到FastDFS的文件可以通过存储目录路径直接去访问,也可以通过和nginx集成,通过tracker服务重定向后进行访问。通过存储目录路径访问配置简单快捷,但只能满足单存储服务器,单存储目录的情况。使用nginx集成tracker服务器,可以应对Storage服务有多个的情况,也可以满足多个存储目录的使用要求。

tracker的负载均衡

如果tracker服务器有多个,可以在nginx中使用upstream反向代理tracker服务器,实现多个tracker的负载均衡。

storage和nginx的集成

如果storage只有一个实例,可以使用nginx直接代理storage中文件的访问,将root目录指向文件存储目录。如果有多个storage server实例,那么其和nginx的集成需要安装nginx的第三方模块fastdfs-nginx-module。

#下载fastdfs-nginx-module
cd /usr/local/src
wget ...
unzip ...

#编译安装nginx的第三方模块


#配置

此处一直编译不成功,提示缺少头文件。待解决后再续本文。c

集成FastDHT

常见问题

  1. 外网访问

如果需要外网访问,那么tracker和storage都需要配置外网IP,且storage通过外网IP注册到tracker。

2.