0%

搭建FastDFS分布式文件系统

FastDFS介绍

FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。准确地讲,Google FS以及FastDFS、mogileFS、HDFS、TFS等类Google FS都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。

FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,fastfd非常适用于基于文件服务的站点,例如图片分享和视频分享网站。
FastDFS有两个角色:跟踪服务和存储服务,跟踪服务控制,调度文件以负载均衡的方式访问;存储服务包括:文件存储,文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据。
跟踪和存储服务可以由1台或者多台服务器组成,同时可以动态的添加,删除跟踪和存储服务而不会对在线的服务产生影响,在集群中,tracker服务是对等的。
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS架构


客户端和Storage server主动连接Tracker server。Storage server主动向Tracker server报告其状态信息,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。Storage server会连接集群中所有的Tracker server,向他们报告自己的状态。Storage server启动一个单独的线程来完成对一台Tracker server的连接和定时报告。需要说明的是,一个组包含的Storage server不是通过配置文件设定的,而是通过Tracker server获取到的。
不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步。
Storage server采用binlog文件记录文件上传、删除等更新操作。binlog中只记录文件名,不记录文件内容。
文件同步只在同组内的Storage server之间进行,采用push方式,即源头服务器同步给目标服务器。只有源头数据才需要同步,备份数据并不需要再次同步,否则就构成环路了。有个例外,就是新增加一台Storage server时,由已有的一台Storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
Storage server中由专门的线程根据binlog进行文件同步。为了最大程度地避免相互影响以及出于系统简洁性考虑,Storage server对组内除自己以外的每台服务器都会启动一个线程来进行文件同步。
文件同步采用增量同步方式,系统记录已同步的位置(binlog文件偏移量)到标识文件中。标识文件名格式:{dest storage IP}_{port}.mark,例如:192.168.1.14_23000.mark。

FastDFS文件上传下载交互过程

文件下载流程

  1. Client询问Tracker server可以下载指定文件的Storage server,参数为文件ID(包含组名和文件名);
  2. Tracker server返回一台可用的Storage server;
  3. Client直接和该Storage server建立连接,完成文件下载。

文件上传流程

  1. Client询问Tracker server上传到的Storage server;
  2. Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;
  3. Client直接和该Storage server建立连接,进行文件上传,Storage server返回新生成的文件ID,文件上传结束。

FastDFS安装

系统环境

1
CentOS Linux release 7.2.1511 (Core)

下载并安装FastDFS依赖包libfastcommon

1
2
3
4
5
[root@object1 ~]# wget https://codeload.github.com/happyfish100/libfastcommon/zip/master
[root@object1 ~]# unzip master
[root@object1 ~]# cd libfastcommon-master/
[root@object1 libfastcommon-master]# ./make.sh
[root@object1 libfastcommon-master]# ./make.sh install

下载并安装FastDFS

1
2
3
4
[root@object1 ~]# wget https://nchc.dl.sourceforge.net/project/fastdfs/FastDFS%20Server%20Source%20Code/FastDFS%20Server%20with%20PHP%20Extension%20Source%20Code%20V5.08/FastDFS_v5.08.tar.gz
[root@object1 ~]# tar zxvf FastDFS_v5.08.tar.gz
[root@object1 ~]# cd FastDFS
[root@object1 FastDFS]# ./make.sh && ./make.sh install

默认脚本目录

1
[root@object1 ~]# ll /etc/init.d/ | grep fdfs

样例配置文件

1
[root@object1 ~]# ll /etc/fdfs/

注意:虽然FastDFS区分tracker和storage服务器,但是安装的软件及步骤均相同,只是不同的配置文件而已,因此以上安装适用tracker server和storage server

配置跟踪服务器(tracker server)

拷贝tracker server和client端样例配置文件并重命名

1
2
[root@object1 ~]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
[root@object1 ~]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

修改client.conf

1
2
第14行
tracker_server=192.168.1.226:22122

启动tracker server

1
2
[root@object1 ~]# /etc/init.d/fdfs_trackerd start
[root@object1 ~]# ss -tunlp | grep 22122

配置存储服务器(storage server)

拷贝storage server样例配置文件并重命名

1
[root@object1 ~]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

修改storage.conf

1
2
第118行
tracker_server=192.168.1.226:22122

启动storage server(启动storage server的前提是tracker server必须事先已启动)

1
2
3
[root@object1 ~]# /etc/init.d/fdfs_storaged start
[root@object1 ~]# ss -tunlp | grep 23000

文件上传测试

1
2
[root@object1 ~]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/test.jpg 
group1/M00/00/00/wKgB4lkJlSSADZazAAMuQxWPTP8989.jpg

存储服务器(storage server)安装并配置nginx

下载并安装fastdfs-nginx-module模块

注:FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设Tracker服务器将文件上传到了192.168.1.226,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.1.227,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.1.227上取文件,就会出现文件无法访问的错误。而fastdfs-nginx-module可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

1
2
3
4
5
6
7
8
9
10
[root@object1 ~]# wget http://nchc.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
[root@object1 ~]# tar zxvf fastdfs-nginx-module_v1.16.tar.gz
[root@object1 ~]# cd fastdfs-nginx-module/src/
[root@object1 src]# vim config
编辑config文件,执行如下命令进行批量替换并保存退出
:%s+/usr/local/+/usr/+g
[root@object1 src]# cp mod_fastdfs.conf /etc/fdfs/
修改mod_fastdfs.conf
第40行
tracker_server=192.168.1.226:22122

安装nginx依赖库

1
[root@object1 ~]# yum install -y pcre-devel zlib-devel nginx

安装nginx

1
2
3
4
5
[root@object1 ~]# wget http://nginx.org/download/nginx-1.13.0.tar.gz
[root@object1 ~]# tar zxvf nginx-1.13.0.tar.gz
[root@object1 ~]# cd nginx-1.13.0
[root@object1 nginx-1.13.0]# ./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src/
[root@object1 nginx-1.13.0]# make && make install

拷贝FastDFS中的部分配置文件到/etc/fdfs目录中

1
2
[root@object1 nginx-1.13.0]# cp /root/FastDFS/conf/http.conf /etc/fdfs/
[root@object1 nginx-1.13.0]# cp /root/FastDFS/conf/mime.types /etc/fdfs/

配置nginx

1
2
3
4
5
6
7
8
9
[root@object1 ~]# vim /usr/local/nginx/conf/nginx.conf
修改1行
user root; #解决下载操作时报404的问题
修改36行
listen 8888; #storage.conf配置文件一致
添加
location ~/group[0-9]/ {
ngx_fastdfs_module;
}

拷贝nginx服务到/etc/init.d/目录下并启动

1
2
3
[root@object1 ~]# cp /usr/local/nginx/sbin/nginx /etc/init.d/
[root@object1 ~]# /etc/init.d/nginx
[root@object1 ~]# ss -tunlp | grep 8888

通过浏览器访问之前已经上传的文件

1
2
3
4
5
6
7
8
9
10
11
12
http://192.168.1.226:8888/group1/M00/00/00/wKgB4lkJlSSADZazAAMuQxWPTP8989.jpg
访问出现400 Bad Request
查看日志
[root@object1 ~]# vim /usr/local/nginx/logs/error.log

报错信息
[2017-05-03 17:00:38] ERROR - file: ../common/fdfs_global.c, line: 52, the format of filename "group1/M00/00/00/wKgB4lkJlSSADZazAAMuQxWPTP8989.jpg" is invalid

解决方法:
[root@object1 ~]# vim /etc/fdfs/mod_fastdfs.conf
修改53行
url_have_group_name = true