一、简介
FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。准确地讲,Google FS以及FastDFS、mogileFS、HDFS、TFS等类Google FS都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。
二、FastDFS的架构
图1展示的是FastDFS的系统架构。
图1 FastDFS的系统架构
从图1可以看出,Tracker server之间相互独立,不存在直接联系。
客户端和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。
三、文件上传和下载的交互过程
接下来我们一起看一下文件上传和下载的交互过程。文件上传和下载流程分别如图2、图3所示。文件上传流程的步骤如下:
图2 文件上传流程
图3 文件下载流程
1. Client询问Tracker server上传到的Storage server;
2. Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;
3. Client直接和该Storage server建立连接,进行文件上传,Storage server返回新生成的文件ID,文件上传结束。
文件下载流程的步骤如下:
1. Client询问Tracker server可以下载指定文件的Storage server,参数为文件ID(包含组名和文件名);
2. Tracker server返回一台可用的Storage server;
3. Client直接和该Storage server建立连接,完成文件下载。
四、ip地址分配(本文默认关闭防火墙)
1.172.16.8.8 nginx tracker
2.172.16.8.9 storage1
3.172.168.8.10 storage2
备注:所有的下载地址为http://sourceforge.net/projects/fastdfs/files/?source=navbar
五、安装tracker
1.安装
# wget # tar xf download # cd FastDFS/ # ./make.sh 运行文件 有报错信息 compilation terminated. make: *** [../common/fdfs_global.o] Error 1
2.查看官方文档,需要安装libfastcommon
# wget https://github.com/happyfish100/libfastcommon/archive/master.zip # unzip master.zip # cd libfastcommon-master/ # ./make.sh # ./make.sh install
3.继续安装FastDFS
# cd FastDFS/ # ./make.sh # ./make.sh install
4.配置
# cd /etc/fdfs/ # cp tracker.conf.sample tracker.conf 修改配置文件 disabled=false #启用配置文件 port=22122 #设置tracker的端口号 base_path=/data/fastdfs/trackerd #设置tracker的数据文件和日志目录(需预先创建) http.server_port=18080 #设置http端口号
5.启动
# mkdir -p /data/fastdfs/trackerd # /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart 设置开机启动 # echo '/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart' >> /etc/rc.d/rc.local
六、安装storage(两台都一样,本出给出一台配置)
1.安装 与tracker 安装步骤相同
2.配置
disabled=false #启用配置文件 group_name=group1 #组名,根据实际情况修改 port=23000 #设置storage的端口号 base_path=/data/fastdfs/storage #设置storage的日志目录(需预先创建) store_path_count=1 #存储路径个数,需要和store_path个数匹配 store_path0=/data/fastdfs/storage #存储路径 tracker_server=172.16.8.8:22122 #tracker服务器的IP地址和端口号 http.server_port=18888 #设置http端口号
3.启动
# mkdir -p /data/fastdfs/storage # /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart 设置开机启动 # echo '/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart' >> /etc/rc.d/rc.local
4.查看状态
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
七、在storage安装nginx
在storage上安装nginx主要为了提高http的访问服务,同时解决group中的storage服务的同步延迟问题
1.nginx安装,可以使用源码编译,源码编译请移步本人相关博客http://wangfeng7399.blog.51cto.com/3518031/1403741,在编译安装时添加 --add-module=/root/fastdfs-nginx-module/src/
2.配置
# wget # tar xf download.1 3.解决报错 make的时候会报一下错误, root/fastdfs-nginx-module/src//common.c:21:25: fatal error: fdfs_define.h: No such file or directory #include "fdfs_define.h" ^ compilation terminated. make[1]: *** [objs/addon/src/ngx_http_fastdfs_module.o] Error 1 解决办法: vim /root/fastdfs-nginx-module/src/config CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient" 重新编译,安装即可
4.配置
# cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/. # cp /root/FastDFS/conf/http.conf /etc/fdfs/. /root/FastDFS/conf/mime.types /etc/fdfs/. 修改nginx的配置文件 server { listen 18888; server_name localhost; location ~/group1/M00 { root /fdfs/storage/data; ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
6.启动nginx
八、在tracker安装nginx
在tracker上安装的nginx主要为了提供http访问的反向代理、负载均衡已经缓存服务
1.安装配置与storage上相同
2.配置负载功能
upstream fdfs_group3 { server 172.16.1.207:8080 weight=1 max_fails=2 fail_timeout=30s; server 172.16.1.208:8080 weight=1 max_fails=2 fail_timeout=30s; } server { # 设置服务器端口 listen 8080; # 设置 group1 的负载均衡参数 location /group1/M00 { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache http-cache; proxy_cache_valid 200 304 12h; proxy_cache_key $uri$is_args$args; proxy_pass http://fdfs_group1; expires 30d;
九。测试
cd /etc/fdfs/ cp client.conf.sample client.conf base_path=/data/fdfs/tracker # 日志存放路径 tracker_server=172.16.8.8:22122 #tracker 服务器 IP 地址和端口号 http.tracker_server_port=8080 #tracker 服务器的 http 端口号 上传文件 /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/install3.sh group1/M00/00/00/rBAIClZB6ySAYFbtAAAGpOjLUVA6601.sh 日志报错
[2015-11-10 21:04:04] ERROR - file: ../common/fdfs_global.c, line: 52, the format of filename "group1/M00/00/00/rBAIClZB6ySAYFbtAAAGpOjLUVA6601.sh" is invalid
vi /etc/fdfs/mod_fastdfs.conf
url_have_group_name = true
再次测试上传
[root@vrvap2 fdfs]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/new.jpg
group1/M00/00/00/rBAIClZB7fWAF2BmAADCkWSm8AA128.jpg