分布式文件系统FASTDFS - wtdig/study GitHub Wiki
分布式文件系统
一、分布式文件系统简介
关键字(Tracker server调度节点、Storage server存储结点)
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。
1)Tracker 集群
FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
2)Storage集群
Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。
采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。
3)Storage状态收集
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
4)文件上传下载
4-2)文件上传
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
group1/M00/00/00/wKgCM1twIXmAJAp1AA0HY2sWCxI.tar.gz
组名(group1)/虚拟磁盘路径(M00)/数据两级目录(00/00)/文件名(wKgCM1twIXmAJAp1AA0HY2sWCxI.tar.gz)
组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
4-2)文件下载过程:
tracker根据请求的文件路径即文件ID 来快速定义文件。
比如请求下边的文件:
1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。
2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
5)服务的使用
client请求tracker进行文件上传、下载、删除。
client可以通过java client API方式进行文件上传、下载、删除。
client可以通过http方式进行文件下载。tracker通过nginx提供http下载接口。
client也可以直接访问storage进行文件上传、下载、删除,但建议client通过tracker进行文件上传、下载、删除。
Tracker Server
每个tracker server互相平等,tracker server上部署nginx是为了对外提供http文件下载接口,tracker上nginx只是起到负载均衡的作用。tracker的nginx会代理转发至storage上的nginx。
tracker上的两个nginx可以采用主备方式实现高可用。nginx高可用参数nginx文档。
Storage Server
每台storage上也部署nginx,storage上的nginx与tracker上的nginx有区别,storage上的nginx需要安装FastDSF-nginx模块,此模块的作用是使用FastDFS和nginx进行整合,nginx对外提供http文件下载接口,注意:nginx只提供文件下载接口不提供上传接口。文件上传仍然通过java client API进行。
二、系统环境搭建
1、单机版
本次服务器192.168.2.50为tracker服务器、192.168.2.51为storage服务器
1)准备需要的软件
在该路径下新建fastdfs文件夹
/usr/software/fastdfs
上传下面的3个软件到该目录下
libfastcommon-master.zip fastdfs依赖的公共包
FastDFS_v5.05.tar.gz fastdfs包
fastdfs-nginx-module_v1.16.tar.gz nginx与fastdfs的整合包(使用http下载文件,例如使用http://192.168.2.51:8888/group1/M00/00/00/wKgCM1twIXmAJAp1AA0HY2sWCxI.tar.gz就可以下载文件)
2)解压安装
事先新建解压安装的路径,本次安装的路径为/usr/wt/fast/
安装gcc。命令:yum install make cmake gcc gcc-c++
授权:chmod 777 libfastcommon-master.zip
解压到指定目录:unzip libfastcommon-master.zip -d /usr/wt/fast/
安装libfastcommon-master:
cd /usr/wt/fast/libfastcommon-master/
./make.sh
./make.sh install
libfastcommon默认安装到了/usr/lib64/这个位置。
建立软连接:
进行软件创建。FastDFS主程序设置的目录为/usr/local/lib/,所以我们需要创建/usr/lib64/下的一些核心执行程序的软连接文件
如果没有/usr/local/lib/,需要新建 mkdir /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/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
安装FastDFS:
chmod 777 FastDFS_v5.05.tar.gz
tar -zxvf FastDFS_v5.05.tar.gz -C /usr/wt/fast/
cd /usr/wt/fast/FastDFS/
./make.sh
./make.sh install
采用默认安装方式脚本文件说明:
1、服务脚本在:
/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_trackerd
2、配置文件在:
/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/tracker.conf.sample
3、dnfs的指令位置:
命令行工具在/usr/bin/目录下Fdfs_*的一些列执行脚本
因为FastDFS服务脚本设置的bin目录为/usr/local/bin/下,但是实际我们安装在了/u
sr/bin/下面。所以我们需要修改FastDFS配置文件中的路径,也就是需要修改俩
个配置文件:
命令:vim /etc/init.d/fdfs_storaged
进行全局替换命令:%s+/usr/local/bin+/usr/bin
命令:vim /etc/init.d/fdfs_trackerd
进行全局替换命令:%s+/usr/local/bin+/usr/bin
vim /etc/init.d/fdfs_storaged
然后输入:,在冒号后面输入%s+/usr/local/bin+/usr/bin;提示有7处改变,然后保存,退出 wq
注意:以上2台服务器都需要(192.168.2.50、192.168.2.51)
3)配置文件
3-1)配置跟踪器tracker(192.168.2.50节点)
/etc/fdfs/目录配置跟踪器文件(注意是192.168.2.50节点),把tracker.conf.samp
le文件进行cope一份:去修改tracker.conf文件
cp tracker.conf.samp tracker.conf
vim tracker.conf
修改:
base_path=/fastdfs/tracker
修改为自己的路径地址:/fastdfs/tracker,此路径为我们在根路径下新建的,如果没有,请新建
启动tracker服务测试:
启动tracker命令:/etc/init.d/fdfs_trackerd start
查看进程命令:ps -el | grep fdfs
停止tracker命令:/etc/init.d/fdfs_trackerd stop
启动之后,/fastdfs/tracker自动新建一个data和logs 2个文件夹
可以设置开机启动跟踪器:(一般生产环境需要开机启动一些服务,如keepaliv
ed、linux、tomcat等等)
命令:vim /etc/rc.d/rc.local
加入配置:/etc/init.d/fdfs_trackerd start
3-2)配置存储结点storage(192.168.2.51节点)
1、进入文件目录:cd /etc/fdfs/,进行copy storage文件一份
命令:cd /etc/fdfs/
命令:cp storage.conf.sample storage.conf
2、修改storage.conf文件
命令:vim /etc/fdfs/storage.conf
修改内容:
base_path=/fastdfs/storage
store_path0=/fastdfs/storage
tracker_server=192.168.2.50:22122
http.server_port=8888
3、创建存储目录:mkdir -p /fastdfs/storage
store_path0 存储数据的位置;tracker_server跟踪服务器的ip地址;http.server_port采用http下载的端口,与nginx的监听端口一致
启动storage服务测试
启动:
/etc/init.d/fdfs_storaged start
关闭:
/etc/init.d/fdfs_storaged stop
(初次启动成功后会在/fastdbf/storage/ 目录下创建 data、logs俩个目录)
同理,也可以设置开机启动存储器:(一般生产环境需要开机启动一些服务,
如keepalived、linux、tomcat等等)
命令:vim /etc/rc.d/rc.local
加入配置:/etc/init.d/fdfs_storaged start
以上单机版dnfs单机版搭建完成
4)服务上传测试
我们先使用命令上传一个文件。注意:是在tracker(跟踪器)中上传。
首先我们在跟踪器(192.168.2.50)里copy一份client.conf文件。
命令:cd /etc/fdfs/
命令:cp client.conf.sample client.conf
client.conf文件
命令:vim /etc/fdfs/client.conf
修改内容:
base_path=/fastdfs/tracker
tracker_server=192.168.2.50:22122
之前的/usr/software/文件夹下的某一个文件上传到FastDFS系统中去,在跟踪器(192.168.1.172)中上传文件,命令如下:
命令:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/software/keepalived-2.0.6.tar.gz
返回一个字符:group1/M00/00/00/wKgCM1twIXmAJAp1AA0HY2sWCxI.tar.gz
我们查看存储器(192.168.2.51)中的/fastdfs/storage/data/00/00文件夹位置,发现已经存在了刚才上传的文件
5)使用http下载(FastDFS与Nginx整合)
在存储节点上(192.168.2.51)安装fastdfs-nginx-module_v1.16.tar.gz包进行整合
tar -zxvf /usr/software/fastdfs/fastdfs-nginx-module_v1.16.tar.gz -C /usr/wt/fast
cd /usr/wt/fast/fastdfs-nginx-module/src/
vim /usr/local/fast/fastdfs-nginx-module/src/config
去掉下图中的local文件层次:/usr/local/include/fastdfs /usr/local/include/fastcommon/
原先:
ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$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\"'"
现在:
ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/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\"'"
安装nginx
./configure --add-module=/usr/wt/fast/fastdfs-nginx-module/src/ --prefix=/usr/wt/nginx
make && make install
解释:
--add-module=/usr/wt/fast/fastdfs-nginx-module/src/ 指定安装模块的目录
-- prefix=/usr/wt/nginx 指定nginx的安装位置
修改配置:
复制fastdfs-ngin-module中的配置文件,到/etc/fdfs目录中,如图所示:
copy命令:cp /usr/wt/fast/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
修改内容:比如连接超时时间、跟踪器路径配置、url的group配置、
connect_timeout=10
tracker_server=192.168.2.50:22122
url_have_group_name = true
store_path0=/fastdfs/storage
复制FastDFS里的2个文件,到/etc/fdfs目录中:
cd /usr/wt/fast/FastDFS/conf/
cp http.conf mime.types /etc/fdfs/
创建一个软连接,在/fastdfs/storage文件存储目录下创建软连接,将其链接到实际存放数据
的目录。
命令:ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
配置nginx的配置:
修改内容:
listen 8888; #监听端口:8888
location ~/group([0-9])/M00 {
#alias /fastdfs/storage/data;
ngx_fastdfs_module;
}
# 配置nginx与fastdfs整合
启动nginx,注意启动之前,tracker服务和storage服务都已经启动;
访问地址:http://192.168.2.51:8888,出现nginx,说明没有问题;
使用下载:http://192.168.2.51:8888/group1/M00/00/00/wKgCM1twIXmAJAp1AA0HY2sWCxI.tar.gz
下载该文件