fastDSF介绍
FastDFS是用c语言编写的一款开源的分布式文件系统,它是由淘宝资深架构师余庆编写并开源。FastDFS专为互联 网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
为什么要使用fastDFS呢?
上边介绍的NFS、GFS都是通用的分布式文件系统,通用的分布式文件系统的优点的是开发体验好,但是系统复杂
性高、性能一般,而专用的分布式文件系统虽然开发体验性差,但是系统复杂性低并且性能高。fastDFS非常适合存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用
socket,通信速度很快。
fastDSF工作原理
fastDSF架构
FastDFS架构包括 Tracker server和Storageserver。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
如下图:

1)Tracker
Tracker Server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提 供文件上传服务。可以将tracker称为追踪服务器或调度服务器。FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
2)Storage
Storage Server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是使用操作系统的文件系统来管理文件。可以将storage称为存储服务器。Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件 完全一致的。一个组的存储容量为该组内的存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最 好是一致的。采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。
3)Storage状态收集
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
文件上传流程

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

组名:文件上传后所在的
storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。虚拟磁盘路径:
storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。数据两级目录:
storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创 建时间戳、文件大小、随机数和文件拓展名等信息。
文件下载流程

tracker根据请求的文件路径即文件ID来快速定义文件。
比如请求下边的文件:

1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。
2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
fastDFS入门
fastDFS安装与配置
FastDFS 安装环境
FastDFS 是 C 语言开发,建议在 linux 上运行,使用 Centos7作为安装环境。安装 FastDFS 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,需要安装 gcc
1 | yum install gcc-c++ |
安装 libevent
FastDFS依赖libevent 库,需要安装
1 | yum -y install libevent |
安装 libfastcommon
libfastcommon 是 FastDFS官方提供的,libfastcommon包含了FastDFS运行所需 要的一些基础库。没有去官网下载。
将libfastcommonV1.0.7.tar.gz拷贝至/usr/local/fastDFS下
1 | cd /usr/local/fastDFS |
注意:libfastcommon 安装好后会自动将库文件拷贝至/usr/lib64 下,由于FastDFS 程序引用 usr/lib目录所以需要将/usr/lib64 下的库文件拷贝至/usr/lib 下。
1 | cp /usr/lib64/libfastcommon.so /usr/lib |
tracker 编译安装
将 FastDFS_v5.05.tar.gz 拷贝至/usr/local/fastDFS下
1 | cd /usr/local/fastDFS |
安装成功将安装目录下的 conf 下的文件拷贝到/etc/fdfs/下
1 | cd conf |
配置
安装成功后进入/etc/fdfs 目录
1 | -rw-r--r--. 1 root root 23981 7月 14 22:54 anti-steal.jpg |
拷贝一份新的tracker配置文件:
1 | cp tracker.conf.sample tracker.conf |
启动
1 | /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart |
执行可以会报文件(/home/FastDFS)不存在
创建文件
mkdir -p /home/FastDFS
启动的日志显示先停止5619 进程(实际环境不是 5619)再启动,如下图:

注意:如果没有显示上图要注意是否正常停止原有进程
1 | # 查到trackerd的进程 |
FastDFS–storage 安装
在解压FastDFS_v5.05.tar.gz时一起安装了FastDFS--storage和 tracker,只需要配置就可以了
配置 FastDFS–storage
1 | # 进入/etc/fdfs目录: |
修改storage.conf具体内容
1 | group_name=group1 |
注意:上面的
base_path和store_path0文件夹一定要存在,否则会上传失败,亲生经历,所以写下来,提醒大家
启动
1 | /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart |
启动的日志显示先停止 8931 进程(实际环境不是 8931)再启动,如下图:

注意:如果没有显示上图要注意是否正常停止原有进程
上传图片测试
通过 fdfs_test 程序
FastDFS安装成功可通过/usr/bin/fdfs_test 程序来测试上传、下载等操作。
修改
/etc/fdfs/client.conf
1 | base_path=/home/fastdfs |
上传格式:
1 | /usr/bin/fdfs_test 客户端配置文件地址 upload 上传文件 |
比如将/home 下的图片上传到 FastDFS 中:
1 | /usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/Vue-logo-001.png |
打印如下日志: 代表上传成功
1 | [root@localhost FastDFS]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/vue-newsletter-logo.png |
重点: http://192.168.40.142/group1/M00/00/00/wKgojl8Ov-iAMZvQAAB2OGvQkY4351.png 就是文件的下载路径。对应 storage 服务器上的 /home/fastdfs/fdfs_storage/data/00/00/wKgojl8Ov-iAMZvQAAB2OGvQkY4351.png文件。由于现在还没有和nginx 整合无法使用 http下载。
FastDFS 和 nginx 整合
nginx 代理
单独安装nginx 代理服务,它的作用是代理访问 storage上的文件,实现负载均衡。nginx 的安装细节参考 nginx 文档,这里使用单机 nginx,也可以使用两台 nginx组成高可用或者采用lvs+nginx访问 Storage 上的nginx。
在 Storage 上安装 nginx
在 storage server 上安装nginx 的目的是对外通过 http 访问storage server 上的文件。使用nginx 的模块FastDFS-nginx-module 的作用是通过 http 方式访问 storage 中的文件,当 storage 本机没有要找的文件时向源 storage 主机代理请求文件。
FastDFS-nginx-module
将FastDFS-nginx-module_v1.16.tar.gz传 至 fastDFS 的 storage 服 务 器 的/usr/local/下,执行如下命令:
1 | # 进入目录 |
修改config 文件将/usr/local/路径改为/usr/,3处地方需要修改

将 FastDFS-nginx-module/src 下的mod_fastdfs.conf拷贝至/etc/fdfs/下
1 | cp mod_fastdfs.conf /etc/fdfs/ |
并修改 mod_fastdfs.conf 的内容:
1 | vi /etc/fdfs/mod_fastdfs.conf |
修改的具体内容:
1 | base_path=/home/FastDFS |
将 libfdfsclient.so拷贝至/usr/lib 下
1 | cp /usr/lib64/libfdfsclient.so /usr/lib/ |
nginx 安装
将 nginx-1.8.0.tar.gz拷贝到
/usr/local下解压 nginx-1.8.0.tar.gz
进入
nginx-1.8.0目录 使用configure命令创建makeFile文件。最后一条命令表示添加FastDFS-nginx-module模块1
2
3
4
5
6
7
8
9
10
11
12
13./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/usr/local/fastdfs-nginx-module/src在配置信息的时候,出现了一下错误:
错误为:
./configure: error: the HTTP rewrite module requires the PCRE library.

安装
pcre-devel解决问题
1 | yum -y install pcre-devel |
还有可能出现:
1 | 错误提示:./configure: error: the HTTP cache module requires md5 functions |
解决办法:
yum -y install openssl openssl-devel
安装后在linux下启动和关闭nginx:
1 | ps aux|grep nginx |
- 执行后可以看到
Makefile文件, - 执行
make编译命令,如果没有,需要下载yum install make
在执行make命令时出现错误:
src/os/unix/ngx_user.c: 在函数‘ngx_libc_crypt’中: src/os/unix/ngx_user.c:36:7:

此处说明运行make时 其编译的函数发生措错误,查阅了网上大量资料发现均是说把 objs/Makefile文件中的-werror删除,可是发现其实根本没用。最后在放弃前一刻 想了一下是不是源代码的问题。 果然在源代码目录/nginx-1.12.2/src/os/unix/中修改ngx_user.c 文件,问题得到了解决
解决:

将对应的makefile文件夹中(如本文中在 /nginx-1.12.2/objs/Makefile) 找到-Werrori并去掉 在重新 回到nginx主目录 make即可

- 执行
make install安装
注意:启动nginx 之前,上边将临时文件目录指定为/var/temp/nginx/client, 需要在/var 下创建此 目录
1 | mkdir -p /var/temp/nginx/client |
nginx 配置文件
进入到nginx目录下的conf目录,执行编译–>安装命令后会在/usr/local目录生成
为什么会在/usr/local目录中?
因为在安装nginx时执行使用
configure命令创建makeFile文件时指定了--prefix=/usr/local/nginx \,所以会在/usr/local目录下生成

进入conf目录,修改nginx.conf文件
1 | vim nginx.conf |
添加虚拟主机:
1 | server { |
说明:
- server_name 指定本机 ip
- location /group1/M00/:
group1为 nginx 服务FastDFS的分组名称,M00是FastDFS 自动生成编号,对应store_path0=/home/FastDFS/fdfs_storage,如果FastDFS 定义store_path1,这里就是 M01
测试
使用浏览器http 访问文件,这里访问上传图片测试的文件
1 | http://192.168.40.142/group1/M00/00/00/wKgojl8Ov-iAMZvQAAB2OGvQkY4351.png |
有多台storage服务器的话,ip 地址改为 192.168.40.143 也可以访问到文件,因为同一个分组的 storage文件互相同步。前提是192.168.40.143必须安装storage服务器






