设为首页 收藏本站
查看: 965|回复: 0

[经验分享] Fastdfs 相关问题汇总

[复制链接]

尚未签到

发表于 2019-1-31 12:51:12 | 显示全部楼层 |阅读模式
  定位问题首先要看日志文件。出现问题时,先检查返回的错误号和错误信息。然后查看服务器端日志,相信可以定位到问题所在。
  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持续增长中。。。
  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   
  下载文件:/usr/local/bin/fdfs_download_file   [local_filename]
  删除文件:/usr/local/bin/fdfs_delete_file  
  10. 什么是主从文件?
  主从文件是指文件ID有关联的文件,一个主文件可以对应多个从文件。
  主文件ID = 主文件名 + 主文件扩展名
  从文件ID = 主文件名 + 从文件后缀名 + 从文件扩展名
  使用主从文件的一个典型例子:以图片为例,主文件为原始图片,从文件为该图片的一张或多张缩略图。
  FastDFS中的主从文件只是在文件ID上有联系。FastDFS server端没有记录主从文件对应关系,因此删除主文件,FastDFS不会自动删除从文件。
  删除主文件后,从文件的级联删除,需要由应用端来实现。
  主文件及其从文件均存放到同一个group中。
  主从文件的生成顺序:
  1)先上传主文件(如原文件),得到主文件ID
  2)然后上传从文件(如缩略图),指定主文件ID和从文件后缀名(当然还可以同时指定从文件扩展名),得到从文件ID。
  11. 如何删除无效的storage server?
  可以使用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还在线上服务的情况下,是无法删除掉的。
  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)确认服务器时间基本是一致的,注意服务器时间不能相差太多,不要相差到分钟级别。
  19、能跨机房部署fastdfs吗?
  需要注意什么问题啊?
  跨运营商通信异常问题
  比如电信和网通机房相互通信,可能会存在异常,有两种表现:
  1)不能建立连接,这个比较直接,肯定是网络连接的问题
  2)可以正常建立连接,但接收和发送数据失败,这个问题比较隐蔽,正常网络环境下,不应该出现此类问题。
  还有人碰到过从一个方向建立连接可以正常通信,但从另外一个方向就不能正常通信的情况。
  解决办法:
  尝试将服务端口改小,建议将端口修改为1024以下。比如将storage服务端口由23000修改为873等,也可以试试修改为8080
  如果问题还不能解决,请联系你的网络(机房)服务商。
  假如有A、B两机房,一组5个存储节点(A1、A2部署在A机房,B1、B2、B3部署在B机房),
  那么对A机房的客户端来说,有什么办法能优先访问A1、A2节点,不行再访问B1、B2、B3节点吗?
  上传文件时,tracker可以返回上传文件的storage server列表。
  下载一个文件时,tracker有返回所有能下载该文件的storage server列表的接口。
  相应地,client API中有对应的函数。
  tracker提供有效的storage server列表,路由规则由应用方决定。
  即由应用方决定上传到哪个storage server,或者从哪台storage server下载文件。
  20、我现在已经有很多很多文件了,将近500W的文件数,该怎么使用FastDFS来管事呢,难道需要再重新使用fdfs_upload_file重传一遍吗?重传过后的文件名怎么办?因为这些文件名都是在数据库里有的,重传的话,文件名就变掉了。
  答案:可以使用my-fastfds-client,这个client library支持应用端指定文件ID。
  21、在FastDFS的服务器端配置文件中,bind_addr 这个参数用于需要绑定本机IP地址的场合。只有这个参数和主机特征相关,其余参数都是可以统一配置的。在不需要绑定本机的情况下,为了便于管理和维护,建 议所有tracker server的配置文件相同,同组内的所有storage server的配置文件相同。
  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中输出原文件名。
  >>1、简单看了下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);
  >>2、还有一个问题,每一个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。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670067-1-1.html 上篇帖子: FastDFS集群部署 下篇帖子: FastDFS学习笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表