FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key valuepair)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。
跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
分布式存储安装与使用:https://my.oschina.net/harlanblog/blog/466487?fromerr=cqe6bTu2
上传交互过程
编辑
1. client询问tracker上传到的storage,不需要附加参数;
2. tracker返回一台可用的storage;
3. client直接和storage通讯完成文件上传。
FastDFS file download
下载交互过程
编辑
1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
2. tracker返回一台可用的storage;
3. client直接和storage通讯完成文件下载。
需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。
===========================================================================================================================================
两台linux
dfs memcached:172.16.1.11
storage 存储:172.16.1.12
首先要关闭所有服务器的防火墙
iptables -F
/etc/init.d/iptabls stop
1.0.1安装依赖包 (所有机器)
yum -y install libevent libevent-devel perl make gcc zlib zlib-devel pcre pcre-devel gcc-c++ openssl-devel
1.0.2安装libfastcommon(所有机器)
tar -zxvf V1.0.7.tar.gz
cd /libfastcommon-1.0.7
./make.sh
./make.sh install
可以看到libfastcommon.so默认安装到了/usr/lib64/libfastcommon.so
但是FastDFS主程序设置的lib目录是/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
1.0.3安装fastDFS (tracker、storage、php端都按照此方法) (所有机器)
先解压缩至/root/fastDFS/fastdfs-5.05
./make.sh
./make.sh install
安装完毕后可以看到fastDFS的相关配置文件
ls /etc/fdfs/
client.conf.sample storage.conf.sample tracker.conf.sample
把以上三个文件cp client.conf storage.conf tracker.conf
tracker.conf//负责均衡调度服务器配置文件
client.conf//客户端上传配置文件
storage.conf//文件存储服务器配置文件
1.0.4启动fastDFS tracker (172.16.1.11)
//创建目录,用于记录 tracker日志、storage server等信息。
mkdir -m 755 -p /opt/fastdfs
# -m 建立目录时同时设置目录的权限
# -p 建立多个目录。
//修改tracker.conf
vi /etc/fdfs/tracker.conf
bind_addr=
port=22122
base_path=/usrdata/fastdfs
http.server_port=8080 //如果本机没用到8080可以不修改
/启动tracker
fdfs_trackerd /etc/fdfs/tracker.conf
写入开机启动脚本
vim /etc/rc.local(chmod +x /etc/rc.local)
fdfs_trackerd /etc/fdfs/tracker.conf
关闭服务的命令:
kill fdfs_trackerd
//查看端口是否开启,看到22122和8080(8080默认没有)就说明启动正常。如果没有,查看/www/fastDFS/logs里的日志
netstat -tnlp
1.0.4启动fastDFS storage (172.16.1.12)
//创建目录,用于存储文件。
mkdir -m 777 -p /opt/fastdfs
//修改storage.conf
vi /etc/fdfs/storage.conf
group_name=group1
bind_addr=
port=23000
base_path=/opt/fastdfs
store_path0=/opt/fastdfs
tracker_server=172.16.1.11:22122 //根据自己的tracker server IP
http.server_port=801(http访问文件的端口默认为8888,nginx中配置的监听端口保持一致)
##http.disabled=true //因为我们要用nginx了,这个就关闭它(新版本已经取消此项)
//启动storage
fdfs_storaged /etc/fdfs/storage.conf
关闭服务的命令:
kill fdfs_storaged
写入开机启动脚本
vim /etc/rc.local
fdfs_storaged /etc/fdfs/storage.conf
假如启动时卡住了,报错:ERROR - file: storage_ip_changed_dealer.c, line: 180, connect to tracker server 172.16.1.11:22122 fail, errno: 113, error info: No route to host.
解决方法:关闭tracker防火墙
/etc/init.d/iptables stop
3、nginx配置:在storage上安装nginx
安装nginx插件 fastdfs-nginx-module_v1.16.tar
cd /opt/app/fastdfs-nginx-module /src/
修改config文件
vim /opt/app/fastdfs-nginx-module/src/config
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
改为
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L /usr/lib -lfastcommon -lfdfsclient"
cp /opt/app/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
base_path=/opt/fastdfs
tracker_server=172.16.1.11:22122
group_name=group1
url_have_group_name = true (系统默认false)
store_path0=/opt/fastdfs
配置文件服务器的软链接:相当于快捷方式 #ln –s [源文件] [新建链接名]
ln -s /opt/fastdfs/data /opt/fastdfs/data/M00 (配置文件中storage存放数据的路径)
nginx安装
cd /root/fastDFS/nginx-1.8.0
./configure --prefix=/opt/app/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/opt/app/fastdfs-nginx-module/src ( 增加扩展模块, 使用扩展模块来解决文件同步延迟问题)
make && make install
默认安装路径 /usr/local/nginx/conf/
配置nginx.conf
server {
listen 801;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /group1/M00{
root /opt/fastdfs/data;
ngx_fastdfs_module;
}
:q
clear
}
启动服务
/usr/local/nginx/sbin/nginx
CentOS FastDFS配置之常见错误
Q:/fdfs_trackerd: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
A:export LD_LIBRARY_PATH=/usr/loal/lib(libevent的安装路径,可以通过find来查找)
Q:Command 'ifconfig' is available in '/sbin/ifconfig'
The command could not be located because '/sbin' is not included in the PATH environment variable.
This is most likely caused by the lack of administrative priviledges associated with your user account.
ifconfig: command not found
A:export PATH=$PATH:/sbin
Q:nginx@ubuntu:~/fastdfs/bak$ ./run_nginx.sh
/home/nginx/nginx/sbin/nginx: error while loading shared libraries: libfastcommon.so: cannot open shared object file: No such file or directory
A:找不到fastdfs的库文件,因为前面执行了 export LD_LIBRARY_PATH=/usr/local/lib,所以 为了使得使用方便,就把所有需要用到的LIB放在一起:
cp libf*.so /usr/local/lib
ls -l /usr/local/lib/libf* 如果没有链接映射,就需要自己做一个或者把四个文件全部拷过去
sudo ln -sf /home/nginx/fastdfs/lib/libfastcommon.so.1 /usr/local/lib/libfastcommon.so
sudo ln -sf /home/nginx/fastdfs/lib/libfdfsclient.so.1 /usr/local/lib/libfdfsclient.so
注意:做软链接的时候需要加绝对路径,不然会出现黑色的提示。
Q:400 badrequest
[2011-12-12 15:24:21] ERROR - file: /tmp/fastdfs-nginx-module/src/common.c, line: 561, logic file: M00/00/00/wKgBNU7lqyjzJZ4mAA4CRXl5SCQ670.jpg not exists
2011/12/12 15:24:21 [error] 14147#0: *1 open() "/home/nginx/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.1.123, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.1.53:8090"
A:修改/fastdfs/conf/mod_fastdfs.conf
里面url_have_group_name = true
Q: 在tracker的日志里报出此类错误
ERROR - file: tracker_mem.c, line: 1406, the format of the file "/home/bstar/dfs_data/data/storage_sync_timestamp.dat" is invalid, group: group3, row count:1 > server count:0
A:修改data里面的 storage_sync_timestamp.dat,把group3的信息删掉,然后重启tracker
A:修改data里面的storage_servers_new.dat
Q:在启动tracker的时候出现此类错误:
ERROR - file: ../common/fdfs_http_shared.c, line: 128, param "http.mime_types_filename" not exist or is empty
A:修改tracker.conf里面,把##include http.conf 改为#include http.conf ,再重启
Q:ERROR - file: tracker_http_check.c, line: 132, http check alive, connect to http server 192.168.1.53:8888 fail, errno: 111, error info: Connection refused
A:端口不对。要配置storage和nginx端口一致/
Q:ERROR - file: /home/nginx/install/fastdfs-nginx-module/src/common.c, line: 561, logic file: M00/00/00/wKgBNU7wRbrcAYGuAALOPrGJ7YQ668.jpg not exists
A:apache和nginx扩展模块版本v1.06及以上版本,需要在配置文件/etc/fdfs/fastdfs_mod.conf中设置storage server的存储路径信息。
一个示例如下所示:
store_path_count=1
store_path0=/home/yuqing/fastdfs
store_path_count和store_path#均需要正确设置,必须和storage.conf中的相应配置完全一致
Q: DEBUG - file: tracker_proto.c, line: 48, server: 192.168.1.51:22122, response status 28 != 0
tracker_query_storage fail, error no: 28, error info: No space left on device
A:空间不足
Q:EBUG - file: storage_disk_recovery.c, line: 699, disk recovery: begin recovery data path: /home/nginx/fastdfs ...
A:这个是数据迁移后的问题,这个需要之前配置的sub_dir的数目前后保持一致。
Q:启动storage server时,一直处于僵死状态。
启动storage server,storage将连接tracker server,如果连不上,关闭防火墙。
出现这样情况,请检查连接不上tracker server的防火墙原因。
A:从V2.03以后,多tracker server在启动时会做时间上的检测,判断是否需要从别的tracker server同步4个系统文件。
触发时机是第一个storage server连接上tracker server后,并发起join请求。
如果集群中有2台tracker server,而其中一台tracker没有启动,可能会导致storage server一直处于僵死状态。
Q:执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2
A:错误号2表示没有ACTIVE状态的storage server。可以执行fdfs_monitor查看服务器状态。
Q:如何删除无效的storage server?
A:可以使用fdfs_monitor来删除。命令行如下:
/usr/local/bin/fdfs_monitor delete
例如:
/usr/local/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.100
注意:如果被删除的storage server的状态是ACTIVE,也就是该storage server还在线上服务的情况下,是无法删除掉的。
Q:nginx和apache扩展模块与FastDFS server版本对应关系
A:扩展模块1.05: 针对FastDFs server v2.x,要求server版本大于等于v2.09
扩展模块1.07及以上版本: 针对FastDFs server v3.x
Q:上传文件失败,返回错误码28,这是怎么回事?
A:返回错误码28,表示磁盘空间不足。注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,缺省值为4GB,即预留4GB的空间。请酌情设置reserved_storage_space这个参数,比如可以设置为磁盘总空间的20%左右。
Q:nginx扩展模块,不能正常显示图片的问题
A:在配置文件/etc/fdfs/mod_fastdfs.conf中,缺省的设置是这样的:http.need_find_content_type=false这个参数在nginx中需要设置为true,apache中应该设置为false
Q:启动 FastDFS 的 tracker 和 storage 服务后,通过 fdfs_monitor 命令查看 tracker 和 storage 的通信状态,发现 storage 的状态始终为 offline,怎么办?
A:先查看 tracker 和 storage 的日志,确认服务是否有问题;如果日志显示正常,则有可能是在操作过程中,删除了 tracker 或 storage 某一方的缓存文件,导致缓存不匹配。此时,先关闭 tracker 和 storage 服务,删除 tracker.conf 和 storage.conf 中指定的 base_path 目录下的 data 文件,再重启服务即可。
注意:如果删除了 FastDHT 的 base_path 目录下的文件,切片集信息将全部丢失。
Q:分布式切图时,控制台为什么会提示“No buffer space available (maximum connections reached?):connect”?
A:分布式切图过程中,向 FastDFS 存储上传切片时,占用的端口数增多,可能会达到本地操作系统的端口数的上限,所以出现上述问题。可通过如下方式规避:
•Windows 系统
运行 “regedit.exe”,打开注册表,找到 “HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesTcpipParameters”位置,添加“TcpTimedWaitDelay”,类型为 DWORD,值为30;添加“MaxUserPort”,类型为 DWORD,值为20000(调大系统可用端口数)。
•Linux 系统
运行 “vi /etc/sysctl.conf”,编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行“/sbin/sysctl -p”让参数生效即可。
Q:安装 FastDFS 和 FastDHT 后,为什么在 /usr/local/bin 目录下找不到 fdfs_trackerd、fdfs_storaged 和 fdhtd 这3个命令?
A:出现此问题的原因,是由于系统的 libevent 版本太低导致 FastDFS 编译失败。请检查 libevent 版本是否为1.4.x 或以上。
Q:启动 fastDHT 服务的时候,提示“段错误”,是什么原因?
A:这是因为 fdhtd 需要的依赖 libdb-5.3.so 没有正确安装或被指向链接。可以使用命令 ldd /usr/local/bin/fdhtd 查看 fdhtd 命令的依赖项,如果显示的 libdb 依赖不是5.3版本,请首先确认安装 db 时,是否指定了安装路径为 /usr 目录。如果是安装在 /usr 路径下的,但仍然没有正确依赖 libdb.5.3.so,则需要手动在 /lib64 目录下创建 libdb.so 的符号链接,指向 BDB 5.3 的动态库。
Q:FastDFS 和 FastDHT 服务正常,但是添加切图任务失败,查看 debug 版的 iserver.log,日志显示“向 FastDFS 的 storageServer 上传数据 tileset_names 时,发生 MyException ,异常信息是:getStoreStorage fail, errno code: 28”,这是什么原因?
A:错误代码28表示 No space left on device。FastDFS 可在 tracker.conf 配置文件中设置 reserved_storage_sapce 参数,即 storage 的预留存储空间大小,默认为10%。如果预留空间小于该设置值,将出现28错误。
1、安装完fastdht后,启动fastdfs的storage报错fdfs_storaged: symbol lookup error: fdfs_storaged: undefined symbol: g_current_time
解决方法:重新安装libfastcommon