故障现象 描述:

1、应用方面:Java客户端,上传身份证图片和视频失败,有几次,报错时间大概是从 2018 09-27 22:27:34.815。

客户端错误信息:

2、服务器方面:查看日志,发现上传的 那个storage节点 报错了,报错信息为 :

无法 rename /data/xxxx01.tmp 文件到 /data/10/00/xxxxxxx.mp4路径

无法 rename /data/xxxx02.tmp 文件到 /data/10/00/xxxxxxx.mp4路径

无法 rename /data/xxxx03.tmp 文件到 /data/10/00/xxxxxxx.mp4路径

无法 rename /data/xxxx04.tmp 文件到 /data/10/00/xxxxxxx.mp4路径

.....................

无法 rename /data/xxxx99.tmp 文件到 /data/10/00/xxxxxxx.mp4路径

....................

详细如下-----------------

[2018-07-31 01:36:50] INFO - file: tracker_client_thread.c, line: 310, successfully connect to tracker server 10.1.10.243:22122, continuous fail count: 25, as a tracker client, my ip is 10.1.10.247

[2018-08-28 15:27:33] ERROR - file: storage_nio.c, line: 371, client ip: 10.1.10.118, pkg length: -8728791489328468646 < 0

[2018-09-27 19:26:32] ERROR - file: storage_nio.c, line: 371, client ip: 10.1.11.88, pkg length: -939450282112145517 < 0

[2018-09-27 21:25:56] WARNING - file: storage_service.c, line: 506, rename /data/fastdfs/storage/data/.cp819598.tmp to /data/fastdfs/storage/data/10/00/CgEK9Vus2luAWvGOAATtxisTGPM212.mp4 fail, errno: 2, error info: No such file or directory

[2018-09-27 21:25:57] WARNING - file: storage_service.c, line: 506,## rename /data/fastdfs/storage/data/.cp819599.tmp to /data/fastdfs/storage/data/10/00/CgEK9Vus2luAWvGOAATtxisTGPM212.mp4 fail, errno: 2, error info: No such file or directory

....................

[2018-09-27 21:32:07] WARNING - file: storage_service.c, line: 506, rename /data/fastdfs/storage/data/.cp819971.tmp to /data/fastdfs/storage/data/10/00/CgEK9lus29aAUwe5AAciwZj2VXY814.jpg fail, errno: 2, error info: No such file or directory

[2018-09-27 21:32:08] WARNING - file: storage_service.c, line: 506, rename /data/fastdfs/storage/data/.cp819972.tmp to /data/fastdfs/storage/data/10/00/CgEK9Vus2luAWvGOAATtxisTGPM212.mp4 fail, errno: 2, error info: No such file or directory

....................(中间全是一样的报错,总共有 905048 - 819598 = 85450次)

[2018-09-28 09:28:07] WARNING - file: storage_service.c, line: 506, rename /data/fastdfs/storage/data/.cp905047.tmp to /data/fastdfs/storage/data/10/00/CgEK9lus29aAUwe5AAciwZj2VXY814.jpg fail, errno: 2, error info: No such file or directory

[2018-09-28 09:28:08] WARNING - file: storage_service.c, line: 506, rename /data/fastdfs/storage/data/.cp905048.tmp to /data/fastdfs/storage/data/10/00/CgEK9Vus2luAWvGOAATtxisTGPM212.mp4 fail, errno: 2, error info: No such file or directory

查看data目录,发现有8万多个临时文件,恰好等于报错的日志条数。

全程只有两个文件:

最开始是 21:25:56 是 CgEK9Vus2luAWvGOAATtxisTGPM212.mp4 这个文件,

后面21:32:07 又增加了CgEK9lus29aAUwe5AAciwZj2VXY814.jpg

另外两个storage日志如下:

storage2:

[2018-09-11 08:15:09] ERROR - file: storage_nio.c, line: 371, client ip: 10.1.10.119, pkg length: -8037590831910596577 < 0

[2018-09-21 09:28:30] ERROR - file: storage_nio.c, line: 371, client ip: 10.1.11.88, pkg length: -6839366949275813527 < 0

[2018-09-27 21:32:08] ERROR - file: tracker_proto.c, line: 48, server: 10.1.10.247:23000, response status 2 != 0

[2018-09-27 21:32:08] ERROR - file: storage_sync.c, line: 255, fdfs_recv_response fail, result: 2

[2018-09-27 21:32:09] INFO - file: storage_sync.c, line: 2733, successfully connect to storage server 10.1.10.247:23000

.......(中间一直重复 tracker_proto.c、storage_sync.c 报错信息,一直持续到2018-09-28 09:28:07)

[2018-09-28 09:28:06] ERROR - file: tracker_proto.c, line: 48, server: 10.1.10.247:23000, response status 2 != 0

[2018-09-28 09:28:06] ERROR - file: storage_sync.c, line: 255, fdfs_recv_response fail, result: 2

[2018-09-28 09:28:07] INFO - file: storage_sync.c, line: 2733, successfully connect to storage server 10.1.10.247:23000

storage1:

[2018-07-31 01:36:51] INFO - file: tracker_client_thread.c, line: 310, successfully connect to tracker server 10.1.10.243:22122, continuous fail count: 25, as a tracker client, my ip is 10.1.10.245

[2018-09-27 21:25:57] ERROR - file: tracker_proto.c, line: 48, server: 10.1.10.247:23000, response status 2 != 0

[2018-09-27 21:25:57] ERROR - file: storage_sync.c, line: 255, fdfs_recv_response fail, result: 2

[2018-09-27 21:25:58] INFO - file: storage_sync.c, line: 2733, successfully connect to storage server 10.1.10.247:23000

.......

[2018-09-28 09:28:06] ERROR - file: tracker_proto.c, line: 48, server: 10.1.10.247:23000, response status 2 != 0

[2018-09-28 09:28:06] ERROR - file: storage_sync.c, line: 255, fdfs_recv_response fail, result: 2

[2018-09-28 09:28:07] INFO - file: storage_sync.c, line: 2733, successfully connect to storage server 10.1.10.247:23000

临时解决方案:

一共有3个storage,关闭报错的那个storage,应用上传文件恢复正常。

故障排查分析:

关键点如下

1、为何无法 rename ?

答案:经过检查发现,是因为 /data/10 这个目录不存在。

启动FastDFS服务器时,正常情况下, /data/目录会有 包括00、10、11、12等在内的255 个目录。

其他254个目录都有,为何 /data/10/ 这个目录没有? 刚好文件同步到这个目录,肯定会报错。

2、查看 storage_service.c 源代码(这个文件有8000多行而且没有注释),找到506行:

static int storage_sync_copy_file_rename_filename(

    .......

    

    if (rename(pFileContext->filename, full_filename) != 0)

    {

        result = errno != 0 ? errno : EPERM;

        logWarning("file: "__FILE__", line: %d, " \

            "rename %s to %s fail, " \

            "errno: %d, error info: %s", __LINE__, \

            pFileContext->filename, full_filename, \

            result, STRERROR(result));

        return result;

    }

}

STORAGE_PROTO_CMD_SYNC_CREATE_FILE

 -> storage_sync_copy_file_done_callback()

 -> storage_sync_copy_file_rename_filename()

在同步文件时,会执行这个rename的操作,看上去同步失败,发起方会再次发起同步请求,直到同步成功为止。

3、这个文件同步失败的问题,影响到文件的上传了,导致文件上传只要是到这个storage的请求都会失败。

按道理说,同步文件失败,和新上传的文件没有联系的。会不会是因为服务器忙着同步文件,而无法响应其他请求?(根据客户端的报错来看,是getStoreStorage fail,errno code: 28,确实是连不上这个storage了。但是根据报错的频率来看,基本上是1秒钟一次,速度很快,而且服务器整体CPU、内存、磁盘空间都是正常的)

原因分析和初步结论:

此次事故,系 有两个文件 同步失败,失败后无限循环重试,引起某个 storage 无法再收到上传请求。

1、同步失败引起的原因是 因为 /data/10/ 这个目录不存在。为什么这个目录不存在,有两种可能性:

  1. 最开始有这个目录,但是由于某种故障或者bug,程序将这个目录删除了。

  2. 有人动过fastdfs服务器,不小心把这个目录删除了。(据悉,之前有用过unison去同步过文件,会不会是同步文件时把这个目录清除了?)

2、fastdfs自身程序不完善,体现在两个方面:

  1. 同步文件失败时,不应该无限循环且无间隔的去重试。

  2. 某两个文件同步失败,不应该整个storage都无法继续接受新的上传请求。

初步解决方案和应对策略:

分析:正常情况下,/data/下面的目录,不会无缘无故消失,生产系统已经运行几个月了,之前都很稳定。

但是如果真的再出现这种情况,无论是意外删除,还是程序bug导致,都需要避免。

这个问题的特征很清楚,只要有 同步失败,都很可能会引起此次的问题。监控fastdfs的日志,一旦有文件多次同步失败,就告警。恢复方式比较简单,手工同步一下,再重启一般就OK了。

关于fastdfs的bug,只能尝试联系作者,等等看能否修复,但是这个作者最近几年很不活跃,这个项目几乎没人维护。

找对c语言很熟悉的人,研究一下fastdfs源码,自己改一下,但是难度也比较大,fastdfs的源码还是比较复杂,而且没有代码注释,要看懂还是得花很大功夫。

题外话

其实,我并不推荐使用FastDFS,因为它并不满足我对中间件的选型要求,

我推荐使用:SeaweedFS【https://github.com/chrislusf/seaweedfs】

两者简单对比:比如Contributors(贡献者)数量,FastDFS为4,而SeaweedFS为61,发布版本数量,前者为6,后者为54,最重要的,FastDFS有250多个open的issues没人解决,近5年多,就没人再维护了,想想多可怕……再有,以我多年代码推敲和评审的眼光来看,FastDFS的源码很糟糕,谁愿意去参与维护?

FastDFS问题分析和总结相关推荐

  1. 2022年4月9日记:Linux服务器开发,Darren,fastdfs架构分析和配置

    ──────────────────────────────────── ┌------------┐ │▉▉♥♥♥♥♥♥♥♥ 99% │ ♥❤ 鱼沈雁杳天涯路,始信人间别离苦. └--------- ...

  2. 2023程序员秋招准备 c/c++Linux后端开发岗(简历/技术面)技能体系总结

    前言 23年秋招已经打响了:同学们都有准备好了吗?现在就业环境怎么样就不用我说了吧:之前很多的贴说哀鸿遍野删了又写,写了又删.各个互联网大厂招聘情况都不堪入目:百度提前批基本只给了实习生,字节也缩招将 ...

  3. c++架构师需要掌握哪些知识

    目录 本文技术梳理主要针对于三类人群的技术需求 c/c++Linux服务器端开发岗位分析 经常被问到的问题: 技术体系建立的好处 c/c++Linux服务器开发技术学习路径 一.精进基石 二.高性能网 ...

  4. C/C++Linux服务器开发高级架构师/Linux后台开发架构师丨高级进阶学习

    01 课程介绍 [录播]课程介绍(66分钟) 免费试学 [录播]磁盘存储链式的B树与B+树(131分钟) 免费试学 免费学习视频链接点击:C/C++Linux服务器开发高级架构师/Linux后台架构师 ...

  5. 【零声教育】C/C++Linux服务器开发/高级架构师 课程

    随着去年年底的疫情,很多线下的学习都变成了网课的形式,各种付费学习也萌生出来,很多决定要报名付费网课例如零声学院C/C++linux后台服务器高级架构师的程序员,报名之前总会问我这样一个问题,除了视频 ...

  6. FastDFS文件同步机制分析

    FastDFS文件同步机制 一.tracker server目录及文件结构 二.storage server目录及文件结构 三.FastDFS文件同步 3.1.同步日志所在目录 3.2.binlog格 ...

  7. FastDFS合并存储原理分析

    FastDFS合并存储原理分析 基于FastDFS 5.03/5.04 2014-12-03 一.合并存储简介 在处理海量小文件问题上,文件系统处理性能会受到显著的影响,在读写次数与吞吐量这两个指标上 ...

  8. TFS,FastDFS性能对比与分析

    TFS,FastDFS对比 统一称存储元数据的为master server,存储文件的为slave server. 1)Master单点:TFS,FastDFS都不存在master单点问题. 2)Sl ...

  9. FastDFS之Linux下搭建

    1.软件环境 CentOS6.5 FastDFS v5.05 libfastcommon- - master.zip(是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库) fast ...

最新文章

  1. 广州富力再引强援 95后潜力中锋桂宏加盟球队
  2. 【leetcode】Balanced Binary Tree(middle)
  3. tcp连接探测Keepalive和心跳包
  4. python 3d绘图 拖动_使用python-matplotlib连续3D绘图(即图形更新)?
  5. python gui编程框架_工程师必知的几个Python GUI框架
  6. 横屏展示 fragment 监听面积并非全屏,部分面积监听失效
  7. MySQL dayofweek()函数
  8. 数据库日志路径--数据库清理垃圾日志路径
  9. 楼板计算塑形弹性_柴油发电机机房设计标准及原则:机房接地选址、柴发容量计算书...
  10. 寒武纪讯飞京东等合搞AI芯片评测标准,作者包括陈云霁陈天石
  11. 阅读理解常规解题思路
  12. Java基础编程题——水仙花数
  13. Redis 列表(List) Redis Lpush 命令
  14. 《羊了个羊》谁还在玩我笑他两年半
  15. 计算机视觉不规则roi原理,C++ 中利用 Opencv 得到不规则的ROI 区域(已知不规则区域)...
  16. 小程序typescript_16天:从概念到实现的TypeScript应用程序
  17. 白夜追凶 :手 Q 图片的显示和发送逻辑
  18. Android 高仿豌豆荚 一键安装app 功能 实现
  19. java零钱换整程序_Leetcode 322. 零钱兑换
  20. 数据挖掘课程笔记--关联分析

热门文章

  1. python 读取配置文件,报错configparser.NoSectionError: No section 解决方案
  2. LeetCode 127. 单词接龙(C++)*
  3. 中科院院士:几乎没有任何研究课题会完全按照预期发展;如果有,这种研究不会有任何突破、不会给人带来任何惊喜...
  4. Win7注册表写入失败怎么办?Win7写入注册表失败的解决方法
  5. Eclipse 3.5.2配置J2ME环境和 WTK2.5.2下载(转)
  6. ColorImpact v2.8.1.378 汉化注册版
  7. 要么干、要么滚,别在这里混!
  8. 事件抽取与事件图谱构建
  9. js实现文字无限滚动轮播
  10. Android蓝牙技术+Demo