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文件上传下载交互过程
文件下载流程
Client询问Tracker server可以下载指定文件的Storage server,参数为文件ID(包含组名和文件名);
Tracker server返回一台可用的Storage server;
Client直接和该Storage server建立连接,完成文件下载。
文件上传流程
Client询问Tracker server上传到的Storage server;
Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;
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