定位问题首先要看日志文件。出现问题时,先检查返回的错误号和错误信息。而后查看服务器端日志,相信能够定位到问题所在。
1. FastDFS适用的场景以及不适用的场景?
FastDFS是为互联网应用量身定作的一套分布式文件存储系统,很是适合用来存储用户图片、视频、文档等文件。对于互联网应用,和其余分布式文件系统相比,优点很是明显。具体状况你们能够看相关的介绍文档,包括FastDFS介绍PPT等等。
出于简洁考虑,FastDFS没有对文件作分块存储,所以不太适合分布式计算场景。
2. FastDFS须要的编译和运行环境是怎样的?
FastDFS Server仅支持unix系统,在Linux和FreeBSD测试经过。在Solaris系统下网络通讯方面有些问题。
编译须要的其余库文件有pthread和libevent。
pthread使用系统自带的便可。
对libevent的版本要求为1.4.x,建议使用最新的stable版本,如1.4.14b。
注意,千万不要使用libevent 2.0非stable版本。
测试了一下,libevent 2.0.10是能够正常工做的。
在64位系统下,可能须要本身在/usr/lib64下建立libevent.so的符号连接。好比:
ln -s /usr/lib/libevent.so /usr/lib64/libevent.so
在ubuntu 11及后续版本,可能会出现找不到动态库pthread库,解决方法参见:http://bbs.chinaunix.net/thread-2324388-1-2.html
3. 有人在生产环境中使用FastDFS吗?
答案是确定的。据我所知,至少有20家公司在使用FastDFS,其中有好几家是作网盘的公司。
其中存储量最大的一家,集群中存储group数有200个,存储服务器超过200台,存储容量达到3PB,文件数近1亿,Group持续增加中。。。html
4. 启动storage server时,一直处于僵死状态。
A:启动storage server,storage将链接tracker server,若是连不上,将一直重试。直到链接成功,启动才算真正完成。
出现这样状况,请检查链接不上tracker server的缘由。
友情提示:从V2.03之后,多tracker server在启动时会作时间上的检测,判断是否须要从别的tracker server同步4个系统文件。
触发时机是第一个storage server链接上tracker server后,并发起join请求。
若是集群中有2台tracker server,而其中一台tracker没有启动,可能会致使storage server一直处于僵死状态。
5. 执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2
错误号表示没有ACTIVE状态的storage server。能够执行fdfs_monitor查看服务器状态。
6. 如何让server进程退出运行?
直接kill便可让server进程正常退出,可使用killall命令,例如:
killall fdfs_trackerd
killall fdfs_storaged
也可使用FastDFS自带的stop.sh脚本,如:
/usr/local/bin/stop.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
stop.sh只会中止命令行(包括参数)彻底相同的进程。
千万不要使用-9参数强杀,不然可能会致使binlog数据丢失的问题。
7. 如何重启server进程?
能够kill掉server进程后,执行启动命令行。如:
killall fdfs_trackerd
/usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
或者直接使用FastDFS自带的restart.sh脚本,如:
/usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
8. 跨运营商通讯异常问题
好比电信和网通机房相互通讯,可能会存在异常,有两种表现:
1)不能创建链接,这个比较直接,确定是网络链接的问题
2)能够正常创建链接,但接收和发送数据失败,这个问题比较隐蔽,正常网络环境下,不该该出现此类问题。
还有人碰到过从一个方向创建链接能够正常通讯,但从另一个方向就不能正常通讯的状况。
解决办法:
尝试将服务端口改小,建议将端口修改成1024如下。好比将storage服务端口由23000修改成873等,也能够试试修改成8080
若是问题还不能解决,请联系你的网络(机房)服务商。
9. fdfs_test和fdfs_test1是作什么用的?
这两个是FastDFS自带的测试程序,会对一个文件上传两次,分别做为主文件和从文件。返回的文件ID也是两个。
而且会上传文件附加属性,storage server上会生成4个文件。
这两个程序仅用于测试目的,请不要用做实际用途。
V2.05提供了比较正式的三个小工具:
上传文件:/usr/local/bin/fdfs_upload_file <config_file> <local_filename>
下载文件:/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename]
删除文件:/usr/local/bin/fdfs_delete_file <config_file> <file_id>
10. 什么是主从文件?
主从文件是指文件ID有关联的文件,一个主文件能够对应多个从文件。
主文件ID = 主文件名 + 主文件扩展名
从文件ID = 主文件名 + 从文件后缀名 + 从文件扩展名
使用主从文件的一个典型例子:以图片为例,主文件为原始图片,从文件为该图片的一张或多张缩略图。
FastDFS中的主从文件只是在文件ID上有联系。FastDFS server端没有记录主从文件对应关系,所以删除主文件,FastDFS不会自动删除从文件。
删除主文件后,从文件的级联删除,须要由应用端来实现。
主文件及其从文件均存放到同一个group中。
主从文件的生成顺序:
1)先上传主文件(如原文件),获得主文件ID
2)而后上传从文件(如缩略图),指定主文件ID和从文件后缀名(固然还能够同时指定从文件扩展名),获得从文件ID。
java
11. 如何删除无效的storage server?
可使用fdfs_monitor来删除。命令行以下:
/usr/local/bin/fdfs_monitor <config_filename> delete <group_name> <storage_ip>
例如:
/usr/local/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.100
注意:若是被删除的storage server的状态是ACTIVE,也就是该storage server还在线上服务的状况下,是没法删除掉的。
12. FastDFS扩展模块升级到V1.06及以上版本的注意事项
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中的相应配置彻底一致,不然将致使文件不能正确下载!
13. nginx和apache扩展模块与FastDFS server版本对应关系
扩展模块1.05: 针对FastDFs server v2.x,要求server版本大于等于v2.09
扩展模块1.07及以上版本: 针对FastDFs server v3.x
14. FastDFS有QQ技术交流群吗?
有的。群号:164684842,欢迎你们加入交流。
15. 上传文件失败,返回错误码28,这是怎么回事?
返回错误码28,表示磁盘空间不足。注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,缺省值为4GB,即预留4GB的空间。
请酌情设置reserved_storage_space这个参数,好比能够设置为磁盘总空间的20%左右。
16. fdfs_trackerd或者fdfs_storaged的日志中出现:malloc task buff failed字样的错误,这是怎么回事?
出现此类信息表示已经达到最大链接数。server端支持的最大链接数能够经过max_connections这个参数来设置。
出现这样的问题,须要排查一下是否客户端使用不当致使的,好比客户端没有及时关闭无用的链接。
17. FastDFS的文件ID中能够反解出哪些字段?
文件ID中除了包含group name和存储路径外,文件名中能够反解出以下几个字段:
1)文件建立时间(unix时间戳,32位整数)
2)文件大小
3)上传到的源storage server IP地址(32位整数)
4)文件crc32校验码
5)随机数(这个字段用来避免文件重名)
18. 为何生成的token验证没法经过?
出现这样的问题,请进行以下两项检查:
1)确认调用token生成函数,传递的文件ID中没有包含group name。传递的文件ID格式形如:M00/00/1B/wKgnVE84utyOG9hEAAATz5-S0SI99.java
2)确认服务器时间基本是一致的,注意服务器时间不能相差太多,不要相差到分钟级别。
nginx
1九、能跨机房部署fastdfs吗?
须要注意什么问题啊?
跨运营商通讯异常问题
好比电信和网通机房相互通讯,可能会存在异常,有两种表现:
1)不能创建链接,这个比较直接,确定是网络链接的问题
2)能够正常创建链接,但接收和发送数据失败,这个问题比较隐蔽,正常网络环境下,不该该出现此类问题。
还有人碰到过从一个方向创建链接能够正常通讯,但从另一个方向就不能正常通讯的状况。
解决办法:
尝试将服务端口改小,建议将端口修改成1024如下。好比将storage服务端口由23000修改成873等,也能够试试修改成8080
若是问题还不能解决,请联系你的网络(机房)服务商。
web
假若有A、B两机房,一组5个存储节点(A一、A2部署在A机房,B一、B二、B3部署在B机房),
那么对A机房的客户端来讲,有什么办法能优先访问A一、A2节点,不行再访问B一、B二、B3节点吗?数据库
上传文件时,tracker能够返回上传文件的storage server列表。
下载一个文件时,tracker有返回全部能下载该文件的storage server列表的接口。
相应地,client API中有对应的函数。
tracker提供有效的storage server列表,路由规则由应用方决定。
即由应用方决定上传到哪一个storage server,或者从哪台storage server下载文件。apache
20、我如今已经有不少不少文件了,将近500W的文件数,该怎么使用FastDFS来管事呢,难道须要再从新使用fdfs_upload_file重传一遍吗?重传事后的文件名怎么办?由于这些文件名都是在数据库里有的,重传的话,文件名就变掉了。
答案:可使用my-fastfds-client,这个client library支持应用端指定文件ID。ubuntu
2一、在FastDFS的服务器端配置文件中,bind_addr 这个参数用于须要绑定本机IP地址的场合。只有这个参数和主机特征相关,其他参数都是能够统一配置的。在不须要绑定本机的状况下,为了便于管理和维护,建 议全部tracker server的配置文件相同,同组内的全部storage server的配置文件相同。api
tracker server的配置文件中没有出现storage server,而storage server的配置文件中会列举出全部的tracker server。这就决定了storage server和tracker server之间的链接由storage server主动发起,storage server为每一个tracker server启动一个线程进行链接和通信,这部分的通讯协议请参阅《FastDFS HOWTO -- Protocol》中的“2. storage server to tracker server command”。服务器
tracker server会在内存中 保存storage分组及各个组下的storage server,并将链接过本身的storage server及其分组保存到文件中,以便下次重启服务时能直接从本地磁盘中得到storage相关信息。storage server会在内存中记录本组的全部服务器,并将服务器信息记录到文件中。tracker server和storage server之间相互同步storage server列表:
1. 若是一个组内增长了新的storage server或者storage server的状态发生了改变,tracker server都会将storage server列表同步给该组内的全部storage server。以新增storage server为例,由于新加入的storage server主动链接tracker server,tracker server发现有新的storage server加入,就会将该组内全部的storage server返回给新加入的storage server,并从新将该组的storage server列表返回给该组内的其余storage server;
2. 若是新增长一台tracker server,storage server链接该tracker server,发现该tracker server返回的本组storage server列表比本机记录的要少,就会将该tracker server上没有的storage server同步给该tracker server。网络
同一组内的storage server之间是对等的,文件上传、删除等操做能够在任意一台storage server上进行。文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器。以文件上传为例,假设一个组内有3台storage server A、B和C,文件F上传到服务器B,由B将文件F同步到其他的两台服务器A和C。咱们不妨把文件F上传到服务器B的操做为源头操做,在服务器B上的F文件 为源头数据;文件F被同步到服务器A和C的操做为备份操做,在A和C上的F文件为备份数据。同步规则总结以下:
1. 只在本组内的storage server之间进行同步;
2. 源头数据才须要同步,备份数据不须要再次同步,不然就构成环路了;
3. 上述第二条规则有个例外,就是新增长一台storage server时,由已有的一台storage server将已有的全部数据(包括源头数据和备份数据)同步给该新增服务器。
storage server有7个状态,以下:
# FDFS_STORAGE_STATUS_INIT :初始化,还没有获得同步已有数据的源服务器
# FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已获得同步已有数据的源服务器
# FDFS_STORAGE_STATUS_SYNCING :同步中
# FDFS_STORAGE_STATUS_DELETED :已删除,该服务器从本组中摘除(注:本状态的功能还没有实现)
# FDFS_STORAGE_STATUS_OFFLINE :离线
# FDFS_STORAGE_STATUS_ONLINE :在线,尚不能提供服务
# FDFS_STORAGE_STATUS_ACTIVE :在线,能够提供服务
当storage server的状态为FDFS_STORAGE_STATUS_ONLINE时,当该storage server向tracker server发起一次heart beat时,tracker server将其状态更改成FDFS_STORAGE_STATUS_ACTIVE。
组内新增长一台storage server A时,由系统自动完成已有数据同步,处理逻辑以下:
1. storage server A链接tracker server,tracker server将storage server A的状态设置为FDFS_STORAGE_STATUS_INIT。storage server A询问追加同步的源服务器和追加同步截至时间点,若是该组内只有storage server A或该组内已成功上传的文件数为0,则没有数据须要同步,storage server A就能够提供在线服务,此时tracker将其状态设置为FDFS_STORAGE_STATUS_ONLINE,不然tracker server将其状态设置为FDFS_STORAGE_STATUS_WAIT_SYNC,进入第二步的处理;
2. 假设tracker server分配向storage server A同步已有数据的源storage server为B。同组的storage server和tracker server通信得知新增了storage server A,将启动同步线程,并向tracker server询问向storage server A追加同步的源服务器和截至时间点。storage server B将把截至时间点以前的全部数据同步给storage server A;而其他的storage server从截至时间点以后进行正常同步,只把源头数据同步给storage server A。到了截至时间点以后,storage server B对storage server A的同步将由追加同步切换为正常同步,只同步源头数据;
3. storage server B向storage server A同步完全部数据,暂时没有数据要同步时,storage server B请求tracker server将storage server A的状态设置为FDFS_STORAGE_STATUS_ONLINE;
4 当storage server A向tracker server发起heart beat时,tracker server将其状态更改成FDFS_STORAGE_STATUS_ACTIVE。
FastDFS注意事项
>>1.除了在storage.conf里的tracker_server增长tracker的ip和端口,其余地方要注意什么?
恩,tracker server ip和端口,确定是要正确设置的。支持多tracker server,每行设置一个tracker。
另外,base_path也要正确设置。
其他参数,一般采用缺省配置便可。你能够看一下配置说明那个帖子。
>>每台tracker和storage的启动有没有前后关系?
正常状况下,应该先启动tracker。
FastDFS不会有这样的要求,你要启动storage也是没有任何问题的。
>>2.想要把fastDFS产生的记录清空,再从新搭建一次,应该删除哪些文件?
中止storage server和tracker server,删除base_path下的data子目录便可。
注意:storage 的data目录下保存了上传文件,删除时请慎重。
>>>>[2010-12-15 15:51:35] ERROR - file: ../common/pthread_func.c, line: 163, create thread failed, startup threads: 2173, errno: 11, error info: Resource temporarily unavailable
最后这一行已经说明问题了,建立的线程太多,使用的资源已经达到系统上限。
解决方法:继续使用现有版本,调小max_connections这个参数,好比调整为1024。
另一个方法,升级到2.x,好比2.05。2.x采用异步IO模型,可使用有限的几个线程,支持大量的并发链接。
好比,线程数能够配置为4,支持的最大链接数能够配置为1024或者更高。
昨天看了代码发现程序会在启动服务的时候,会建立设置的链接数,用来检验服务器是否可以支持使用者设置的最大链接。
>>>>程序中要访问,好比上传文件,可使用FastDFS提供的java API。
客户端经过HTTP下载文件时,能够走web server,如apache、nginx等。
>>>>请问经过http下载文件时,可否让下载的文件名称自动变成原文件名称?
可使用文件附加属性来存储该文件的原文件名。在apache或nginx扩展模块中,能够在HTTP Header中输出原文件名。
>>一、简单看了下Java client的代码,看到能够经过client api获取上传文件的group name and filename,请问可否直接经过API获取http访问地址?
A: 生成http访问地址,没有提供现成的方法,但提供了示例代码,在TestClient1.java和TestClient.java中均有。摘录一下TestClient.java中的代码以下:
int ts;
String token;
String file_url;
InetSocketAddress inetSockAddr;
System.err.println("file_id: " + file_id);
inetSockAddr = trackerServer.getInetSocketAddress();
file_url = "http://" + inetSockAddr.getAddress().getHostAddress();
if (ClientGlobal.g_tracker_http_port != 80)
{
file_url += ":" + ClientGlobal.g_tracker_http_port;
}
file_url += "/" + file_id;
if (ClientGlobal.g_anti_steal_token)
{
ts = (int)(System.currentTimeMillis() / 1000);
token = ProtoCommon.getToken(file_id, ts, ClientGlobal.g_secret_key);
file_url += "?token=" + token + "&ts=" + ts;
}
System.err.println("file url: " + file_url);
>>二、还有一个问题,每个group是否存储了全部的上传文件;仍是说group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。
A: 答案为后者。即:group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。
FastDFS存储服务器的硬盘能够作RAID,好比RAID5等等,这样系统中的mount point只有一个。
也能够单个硬盘直接mount使用,这样系统中的mount point就是多个(多个硬盘的状况下)。
RAID5并不能充分发挥各个磁盘的最大吞吐量,出于磁盘IO效率考虑,建议采用第二种作法,这样磁盘总体IO吞吐量最理想的状况下,为各个硬盘IO吞吐量之和。
采用多个mount point的状况下,若是有一块硬盘损坏,能够有两种修复方法:
1. 更换掉坏掉的硬盘,在服务中止的状况下,手工复制已有服务器上该路径的文件到该mount point,而后启动FastDFS服务程序fdfs_storaged;
2. 更换一台一样配置的新服务器,或者更换掉坏的硬盘后,重作系统,而后启动FastDFS服务fdfs_storaged便可。
只要${base_path}这个路径所在硬盘没有坏,也就是系统数据文件(如${base_path}/data/sync/*)都在的状况下,文件自动同步是没有任何问题的。
从新启动: root@ubuntu:/# /usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
FastDFS系统中的文件ID与用户存储进去的逻辑文件是不一样的,因为没有索引服务器,那么这种文件名映射关系不是要须要由用户本身来保存?
的确如此,目前的确须要由应用端来保存。
FastDFS系统中的文件ID与用户存储进去的逻辑文件是不一样的,我有一个客户端,想经过文件名进行操做,不知该怎样实现?也就是说,文件名到ID的转换,我本身写的客户端该怎么转换呢?
像你这样的应用场合,再加一层好了,实现文件名到文件ID的转换。好比能够基于数据库来作,或者经过分布式kv系统,如TT、FastDHT等等来作。
>>这些Track Server的内容是对等的,仍是分组,每一个Track Server负责一部分Storage Server?
对等的。
>>Client是绑定一个Track Server,仍是能够绑定多个或所有?
在一个集群中,应该绑定所有。
>>Storage Server也是一样的问题,是绑定一个Track Server,仍是能够多个或者所有?
在一个集群中,应该绑定所有。
>>若是没有绑定所有Tracker Sever,那么Tracker Sever之间可能会出现不一致的状况。我看到文档说Tracker Sever之间不进行数据同步,这种问题如何解决呢? 应该绑定全部Tracker server啊。 万一有个别storage server没有绑定全部tracker server,也不会出现问题。 正确的作法是绑定全部tracker server。