一.介绍
技术论坛: http://bbs.chinaunix.net/forum-240-1.html
资源地址: https://sourceforge.net/projects/fastdfs/
源码资源: https://github.com/happyfish100
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。
跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
1.架构与流程
client询问tracker上传到的storage,不需要附加参数;
tracker返回一台可用的storage;
client直接和storage通讯完成文件上传
client询问tracker下载文件的storage,参数为文件标识(组名和文件名);
tracker返回一台可用的storage;
client直接和storage通讯完成文件下载。
2 FastDFS运行时目录结构
2.1 Tracker Server目录
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
|__trackerd.log:tracker server日志文件
3.2 Storage Server目录
|${base_path}
|__data
| |__.data_init_flag:当前storage server初始化信息
| |__storage_stat.dat:当前storage server统计信息
| |__sync:存放数据同步相关文件
| | |__binlog.index:当前的binlog文件索引号
| | |__binlog.###:存放更新操作记录(日志)
| | |__${ip_addr}_${port}.mark:存放同步的完成情况
| |
| |__一级目录:256个存放数据文件的目录,如:00, 1F
| |__二级目录:256个存放数据文件的目录
|__logs
|__storaged.log:storage server日志文
一、 安装
准备两个Linux服务器。两个服务器分别作为tracker服务器(跟踪服务器)和storage服务器(存储服务器)。
Tracker服务器 : 192.168.52.100
Storage服务器 : 192.168.2.101
课上环境中,所有的安装包都存放在/root/upload目录中。解压后的安装包根据具体命令查看。(/usr/local/fastdfs)
1 核心安装
Tracker Server 和 Storage Server完全一致的安装。
安装FastDFS 5.08版本
1.1 安装FastDFS依赖
FastDFS是C语言开发的应用。安装必须使用make、cmake和gcc编译器。
yum install -y make cmake gcc gcc-c++
yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget
1.2 解压FastDFS核心库
libfastcommon是从FastDFS 和FastDHT 中提取出来的公共C函数库
cd /root/upload
yum install zip unzip
unzip libfastcommon-master.zip -d /usr/local/fastdfs
1.3 进入解压后的目录
cd /usr/local/fastdfs/libfastcommon-master
1.4 编译安装
libfastcommon没有提供make命令安装文件。使用的是shell脚本执行编译和安装。shell脚本为make.sh
编译
./make.sh
安装
./make.sh install
有固定的默认安装位置。在/usr/lib64和/usr/include/fastcommon两个目录中。
1.5 创建软连接
因为 FastDFS 主程序设置的 lib 目录是/usr/local/lib,所以需要创建软链接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/local/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/local/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
1.6 解压FastDFS主程序
本案例使用5.08版本FastDFS。
cd /root/upload
tar -zxf FastDFS_v5.08.tar.gz -C /usr/local/fastdfs
1.7 进入FastDFS主程序源码目录
cd /usr/local/fastdfs/FastDFS
1.8 修改安装路径
此操作可选。在集群环境中使用默认安装路径安装。两种安装方式都尝试一下。
vi /usr/local/fastdfs/FastDFS/make.sh
TARGET_PREFIX=DESTDIR/usr/local
1.9 编译安装
./make.sh
./make.sh install
安装后,FastDFS主程序所在位置是:
/usr/local/bin - 可执行文件所在位置。默认安装在/usr/bin中。
/etc/fdfs - 配置文件所在位置。就是默认位置。
/usr/local/lib64 - 主程序代码所在位置。默认在/usr/bin中。
/usr/local/include/fastdfs - 包含的一些插件组所在位置。默认在/usr/include/fastdfs中。
1.10FastDFS安装后资源简介
1.10.1 服务脚本
/etc/init.d/目录中,脚本文件是 - fdfs-storaged和fdfs-trackerd
ls /etc/init.d/ | grep fdfs
1.10.2 配置文件模板
/etc/fdfs/目录中,配置文件是 - client.conf.sample、storage.conf.sample和tracker.conf.sample
ls /etc/fdfs/
tracker.conf.sample - 跟踪器服务配置文件模板
storage.conf.sample - 存储服务器配置文件模板
client.conf.sample - FastDFS提供的命令行客户端配置文件模板。可以通过命令行测试FastDFS有效性。
1.10.3 内置命令
/usr/local/bin/目录中。命令有若干。可通过命令在控制台访问FastDFS。
ls /usr/local/bin/ | grep fdfs
以上为通用安装,FastDFS的跟踪服务和存储服务是通过配置实现的。后续内容为跟踪服务和存储服务的具体配置。
2 tracker基础配置
只在tracker server节点中配置。192.168.52.100
2.1 创建跟踪服务配置文件
FastDFS提供了配置文件模板,可以根据模板创建需要使用的配置文件。
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
2.2 修改配置文件
tracker.conf配置文件用于描述跟踪服务的行为,需要进行下述修改:
vi /etc/fdfs/tracker.conf
port=22122 # 默认服务端口
base_path=/home/yuqing/fastdfs -> base_path=/fastdfs/tracker(自定义目录)
base_path是FastDFSTracker启动后使用的根目录。也就是data和logs所在位置。
2.3 创建自定义目录
为配置文件中定义的base_path变量创建对应的目录。
mkdir -p /fastdfs/tracker
2.4 修改启动服务脚本
vi /etc/init.d/fdfs_trackerd
将 PRG=/usr/bin/fdfs_trackerd 修改为 PRG=/usr/local/bin/fdfs_trackerd
2.5 启动服务
/etc/init.d/fdfs_trackerd start
启动成功后,配置文件中base_path指向的目录中出现FastDFS服务相关数据目录(data目录、logs目录)
2.6 查看服务状态
/etc/init.d/fdfs_trackerd status
ps aux | grep fdfs
2.7 停止服务
/etc/init.d/fdfs_trackerd stop
2.8 重启服务
/etc/init.d/fdfs_trackerd restart
2.9 设置开启自启
vi /etc/rc.d/rc.local
新增内容 - /etc/init.d/fdfs_trackerd start
3 storage基础配置
只在storage server中配置。192.168.2.100
3.1 创建存储服务配置文件
FastDFS提供了配置文件模板,可以根据模板创建需要使用的配置文件。
cd /etc/fdfs
cp storage.conf.sample storage.conf
3.2 修改配置文件
storage.conf配置文件用于描述存储服务的行为,需要进行下述修改:
vi /etc/fdfs/storage.conf
base_path=/home/yuqing/fastdfs -> base_path=/fastdfs/storage/base (自定义目录)
store_path0=/home/yuqing/fastdfs -> store_path0=/fastdfs/storage/store(自定义目录)
tracker_server=192.168.52.100:22122 -> tracker_server=tracker服务IP:22122
base_path - 基础路径。用于保存storage server基础数据内容和日志内容的目录。
store_path0 - 存储路径。是用于保存FastDFS中存储文件的目录,就是要创建256*256个子目录的位置。
base_path和store_path0可以使用同一个目录。
tracker_server - 跟踪服务器位置。就是跟踪服务器的ip和端口。
3.3 创建自定义目录
mkdir -p /fastdfs/storage/base
mkdir -p /fastdfs/storage/store
3.4 修改服务脚本
vi /etc/init.d/fdfs_storaged
将PRG=/usr/bin/fdfs_storaged 修改为PRG=/usr/local/bin/fdfs_storaged
3.5 启动服务(要求tracker服务必须已启动)
/etc/init.d/fdfs_storaged start
启动成功后,配置文件中base_path指向的目录中出现FastDFS服务相关数据目录(data目录、logs目录),配置文件中的store_path0指向的目录中同样出现FastDFS存储相关数据录(data目录)。其中$store_path0/data/目录中默认创建若干子孙目录(两级目录层级总计256*256个目录),是用于存储具体文件数据的。
Storage服务器启动比较慢,因为第一次启动的时候,需要创建256*256个目录。
3.6 查看服务状态
/etc/init.d/fdfs_storaged status
ps aux | grep fdfs
3.7 停止服务
/etc/init.d/fdfs_storaged stop
3.8 重启服务
/etc/init.d/fdfs_storaged restart
3.9 设置开机自启
vi /etc/rc.d/rc.local
新增内容 - /etc/init.d/fdfs_storaged start
因启动前提为tracker服务必须已启动,不推荐开启自启。
4 客户端基础配置
不是必须的。就是用于使用命令行测试FastDFS才需要配置的。
4.1 创建客户端配置文件
在tracker服务结点所在服务器中配置客户端。同样通过配置文件模板创建对应配置文件。
cd /etc/fdfs
cp client.conf.sample client.conf
4.2 修改配置文件
client.conf配置文件中主要描述客户端的行为,需要进行下述修改:
vi /etc/fdfs/client.conf
base_path=/home/yuqing/fastdfs -> base_path=/fastdfs/client (自定义目录)
tracker_server=192.168.52.100:22122 -> tracker_server=tracker服务IP:22122
base_path - 就是客户端命令行执行过程时临时数据存储位置。
4.3 创建自定义目录
mkdir -p /fastdfs/client
5 控制台测试FastDFS
命令所在: /usr/local/bin目录。 (如果在安装FastDFS过程中,没有修改make.sh文件中的TARGET_PREFIX属性值,命令所在为/usr/bin目录)
5.1 上传文件
/usr/local/bin/fdfs_upload_file /etc/fdfs/client.conf /要上传的文件
上传结束后,返回group1/M00/00/00/xxxxxxxxxx.xxx,检查storage服务结点中的store_path0/data/00/00/目录中,不能完全保证)。
课上测试的上传文件结果:group1/M00/00/00/wKgCbltTYaeACDWgAAVCLEPUQWI.tar.gz
卷名 : group1
文件名 : M00/00/00/wKgCbltTYaeACDWgAAVCLEPUQWI.tar.gz
其中M00是一个虚拟目录,相当于windows中的快捷方式,引用的是$store_path0/data目录。
5.2 删除文件
/usr/local/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/xxxxxxx.xxx
删除结束后,检查$store_path0/data/00/00/目录中是否还有文件。
6 安装Nginx组件
如果FastDFS中保存的是图片信息。希望在WEB应用中可以直接访问FastDFS中的图片进行显示。如果操作?
安装Nginx是为了WEB应用中可以使用HTTP协议直接访问Storage服务中存储的文件。在#storage结点#所在服务器安装Nginx组件。
需要安装两部分内容。
Nginx应用,在安装nginx应用的时候,同时要在nginx中增加一个FastDFS的组件。Module。
6.1 解压fastdfs-nginx-module_v1.16.tar.gz
tar -zxf fastdfs-nginx-module_v1.16.tar.gz -C /usr/local/fastdfs
6.2 修改fastdfs-nginx-module_v1.16.tar.gz源文件中的配置
此操作必须修改,否则Nginx编译会报错。
cd /usr/local/fastdfs/fastdfs-nginx-module/src
vi /usr/local/fastdfs/fastdfs-nginx-module/src/config
参数是用于配置安装nginx中的FastDFS组件的时候,在什么位置查找FastDFS核心代码。
源数据:
ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='"/etc/fdfs/mod_fastdfs.conf"'"
|
修改后内容:(如果安装FastDFS时,没有修改make.sh文件,则改为:CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/")
|
ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='"/etc/fdfs/mod_fastdfs.conf"'"
|
6.3 安装Nginx
6.3.1 安装Nginx需要的依赖
yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel
6.3.3 解压Nginx
tar -zxf nginx-1.8.0.tar.gz -C /usr/local/fastdfs/
6.3.4 进入Nginx源码目录
cd /usr/local/fastdfs/nginx-1.8.0/
6.3.5 配置Nginx安装信息
./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/fastdfs-nginx-module/src
--add-module必须定义,此配置信息是用于指定安装Nginx时需要加载的模块,如果未指定,Nginx安装过程不会加载fastdfs-nginx-module模块,后续功能无法实现。
6.3.6 创建目录
Nginx运行时需要创建若干临时文件,如果默认安装不需创建此目录。
mkdir -p /var/temp/nginx
6.3.7 编译安装
make
make install
6.3.8 配置fastdfs-nginx-module模块配置文件
复制配置文件/usr/local/fastdfs/fastdfs-nginx-module/src/mod_fastdfs.conf到/etc/fdfs目录中
cp /usr/local/fastdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
cd /etc/fdfs/
修改配置文件mod_fastdfs.conf
vi mod_fastdfs.conf
源配置:
connect_timeout=2 #连接超时时间,单位秒
tracker_server=tracker:22122 #tracker服务结点
url_have_group_name = false #URL中是否包含group名称
store_path0=/home/yuqing/fastdfs # storage服务结点的存储位置,与配置storage结点一致
|
参考修改值:
|
connect_timeout=10
tracker_server=192.168.2.109:22122
url_have_group_name = true
store_path0=/fastdfs/storage/store
|
6.3.9 提供FastDFS需要的HTTP配置文件
复制FastDFS安装包中的两个配置文件(http.conf和mime.types)到/etc/fdfs目录中
cp /usr/local/fastdfs/FastDFS/conf/http.conf /etc/fdfs/
cp /usr/local/fastdfs/FastDFS/conf/mime.types /etc/fdfs/
6.3.10 创建nginx启动需要的软连接
创建软连接
ln -s /usr/local/lib64/libfdfsclient.so /usr/lib64/libfdfsclient.so
nginx启动后,会在默认的/usr/lib64目录中查找需要的so文件。如果在安装FastDFS时,修改了make.sh文件中的TARGET_PREFIX参数,则必须创建此软连接
6.3.11 创建网络访问存储服务的软连接
ln -s /fastdfs/storage/store/data/ /fastdfs/storage/store/data/M00
在上传文件到FastDFS后,FastDFS会返回group1/M00/00/00/xxxxxxxxxx.xxx。其中group1是卷名,在mod_fastdfs.conf配置文件中已配置了url_have_group_name,以保证URL解析正确。而其中的M00是FastDFS保存数据时使用的虚拟目录,需要将这个虚拟目录定位到真实数据目录上。
6.3.12 修改nginx配置文件
cd /usr/local/nginx/conf
vi nginx.conf
参考修改配置:(部分配置信息,不要完整复制)
|
user root; # Nginx需要访问linux文件系统,必须有文件系统的权限。User root代表nginx访问文件系统的权限是root用户权限。如果不开启权限,可能有404访问错误。
server{
listen 8888; # storage配置中,有http.server_port=8888的配置信息,必须一致。配置文件是/etc/fdfs/storaged.conf
server_name localhost;
location ~/group([0-9])/M00{
ngx_fastdfs_module;
}
}
|
6.3.13 测试WEB访问存储服务中的文件
使用浏览器查看FastDFS中保存的文件:
http://ip:8888/group1/M00/00/00/xxxxxxx.xxx
测试上传的文件: group1/M00/00/00/wKgCbltTmv-ASTG2AAAmTx4ns0s172.jpg
测试WEB访问地址:
http://192.168.52.101:8888/group1/M00/00/00/wKgCbltTmv-ASTG2AAAmTx4ns0s172.jpg