分布式文件系统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

下载该文件