fastdfs合并存储的一个深层次bug排查(代码片段)

Huazie Huazie     2022-12-03     715

关键词:

FastDFS合并存储Bug修复

本篇文章转载于FastDFS作者 余庆 大佬的 FastDFS分享与交流 公众号。

1. 问题

FastDFS V3 引入合并存储(trunk file)特性后,有用户反馈上传文件提示 trunk 空间被占用的问题。我在测试环境中经过一通测试,在极其偶然的情况下也能重现这个问题。然后就开始排查这个问题。

2. 分析

FastDFS 一个 group(存储分组)内有一台 storage server 被选举为 trunk server,用于管理和分配该组的 trunk 可用空间。为了高效管理 trunk file 的可用空间,我们使用了平衡二叉树 AVL。我们很自然地怀疑 trunk 空间管理和分配出了 bug。于是对管理和分配trunk空间的代码前前后后做了不下10遍的代码 review,直到看花眼了,也没有发现任何问题。也怀疑过 AVL 实现有 bug,于是写单元测试对 AVL 进行了大量测试,也没有发现任何问题。

这个问题很难复现,尝试通过代码 review 解决,但多次无功而返。合并存储这个潜在 bug 一直存在,导致合并存储存在风险,我心里很忐忑。

到了2017年初,我再次尝试解决这个困扰多年的 bug。既然代码排查没有任何效果,那就想办法重现吧。于是我开始通过小规模压力测试试图复现这个问题,通过上传和删除文件并行,问题终于得到复现,并且多次压测可以大概率复现。这次我盯住 trunk 空间分配的 binlog,写脚本进行分析和排查,发现 binlog 记录本身是正确的。但在发生 trunk 空间冲突的时间点,从 binlog 中发现一个 trunk 空间被回收后几乎立即就被分配出去了,我凭直觉抓住了这条关键线索。

继续 review 代码,然并卵,依然一无所获。业界有个说法我比较认可:问题能够稳定复现,就等于解决了一大半。在这么明显的线索的指引下,我终于转变了思路,开始思考这个成精的 bug 是否是多机环境导致的。然后。。。,经过反复推敲,我终于终于想明白了这个 bug 是如何被触发的了: 多机环境下操作时序问题

以前的排查重心在 trunk 空间管理,经反复验证,这块是没问题的。问题在于一个 group 的多台 storage server 均可执行文件上传操作,而 FastDFS 对文件操作分发(复制)到其他存储节点采用异步方式,一个 trunk 空间的回收和再利用机制本身没有问题,但 storage server 在其 trunk file上存放用户上传的文件时,就可能会因时序问题而导致冲突(trunk server 返回该空间可用,但因文件同步延迟导致实际还在被其他文件占用)。具体如何引起乱序和冲突的,留给各位读者去思考。

4. 解决方法

问题的现象和原因找到后,解决方法就很容易了:指定 group 中的一台 storage server 上传文件即可。FastDFS 默认配置是轮流(round robin)上传到各台 storage server 的,通过 tracker.conf 配置文件中的 store_server 这个参数来设置。贴一下配置示例:

# which storage server to upload file

# 0: round robin (default)

# 1: the first server order by ip address

# 2: the first server order by priority (the minimal)

# Note: if use_trunk_file set to true, must set store_server to 1 or 2

store_server=0

千万不要小看Note这一句话,其背后是满满的辛酸和血泪啊!

补充说明一下,在开启合并存储,即 use_trunk_file 设置为 true 的情况下,为了避免上述乱序问题,若 store_server 设置为 0 的话,程序将强制调整为 1

V3 最后一个版本是V3.11,通过查看 HISTORY 文件,其发布日期为 2012-08-04。直到 2017-03-29,终于修复了 trunk 文件空间偶发冲突的问题。

贴出 HISTORY 文件中的 changelog 为证(git log 也可以查到 ):

Version 5.10  2017-03-29
 * adjust parameter store_server when use_trunk_file is true

一个修复了约5年的bug,必须记录在案。

FastDFS项目地址: https://github.com/happyfish100/fastdfs

fastdfs(代码片段)

一、简介#FastDFS是一个轻量级的开源分布式文件系统#FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡#FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储#支持存储服务器在线扩容#支... 查看详情

记一个bug的排查过程---复盘(代码片段)

...求:菜单的click事件,支持多条客服消息。上线后,只有一个功能不好使,是点击菜单,预期发一条文本类型的客服消息。实际操作时,点这个菜单项后,什么也没有发生。elk上看日志,也没有什么报错。也不应该有报错,如果... 查看详情

一次程序bug的排查

这周准备下一个QA测试的版本,把版本发到测试环境就开始发现各种问题,修修补补搞了一周,总算告一段落了。 分析一下几个bug的问题,都集中在程序模块的整合中。一个模块的一个小的修改,造成另一个模块的连锁反应... 查看详情

从入门到精通(分布式文件系统架构)-fastdfs,fastdfs-nginx整合,合并存储,存储缩略图,图片压缩,java客户端

从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端 查看详情

fastdfs文件系统扩容(代码片段)

1.简介  FastDFS文件服务器在设计时,为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中... 查看详情

fastdfs分布式文件存储(代码片段)

FastDFS分布式文件存储什么是FastDFS?FastDFS是一个开源的轻量级的分布式文件系统。他解决了大量数据存储和负载均衡等问题。特别适合以中小文件(4KB<FileSize<500MB)为载体的在线服务,如视频,音频,图片网站等等。FastDFS... 查看详情

解bug之路-记一次调用外网服务概率性失败问题的排查(代码片段)

...基础环境配置导致的问题。笔者在一次偶然情况下解决了一个调用外网服务概率性失败的问题。在此将排查过程发出来,希望读者遇到此问题的时候,能够知道如何入手。起因笔者的新系统上线,需要PE执行操作。但是负责操作... 查看详情

01.分布式存储之fastdfs简介及部署(代码片段)

FastDFS介绍FastDFS是一个C语言实现的开源轻量级分布式文件系统,作者余庆(happyfish100),支持Linux、FreeBSD、AID等Unix系统,解决了大数据存储和读写负载均衡等问题,适合存储4KB~500MB之间的小文件,如图片网站、短视频网站、文档、app下载... 查看详情

fastdfs(代码片段)

简介FastDFS是一个高性能的分布式文件系统。功能文件存储、文件同步、文件访问(文件上传、文件下载)。目标大容量存储和负载均衡的问题。依赖<dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-jav... 查看详情

部署fastdfs(代码片段)

一、什么是FastDFS?FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:文件大小为4KB-500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开... 查看详情

部署fastdfs(代码片段)

一、什么是FastDFS?FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:文件大小为4KB-500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开... 查看详情

网络基础登录对接cas-跨域导致的一个意想不到的bug(代码片段)

...开发人员得出了结论,就是跨域问题,导致前端获取不到存储到localStorage中的Token(最终会存储为Cookie),所以访问后端时,没有携带该token值,最终登录失败,并基于此准备一些相对复杂的解决方案。根因分析与解决方案根因分析... 查看详情

java-定位排查bug(代码片段)

在开发过程中难免会遇到bug,理解bug的含义,定位bug的位置,对于解决bug至关重要!掌握高效的排错技巧,对于程序员来说必不可少。目录一、错误异常的分类二、常见报错信息及原因(持续更新中)... 查看详情

fastdfs分布式存储实战

《FastDFS分布式存储实战》技术选型FastDFS相关组件及原理FastDFS介绍FastDFS架构FastDFS工作流程上传同步机制下载文件合并原理实验环境说明FastDFS部署初始化系统安装libfastcommon和fastdfsstorageserver安装nginx配置mod_fastdfs.conf配置下载网关... 查看详情

从零搭建分布式文件系统minio比fastdfs要更合适(代码片段)

前两天跟大家分享了一篇关于如何利用FastDFS组件来自建分布式文件系统的文章,有兴趣的朋友可以阅读下《用asp.netcore结合fastdfs打造分布式文件存储系统》。通过留言发现大家虽然感兴趣,但是都觉得部署比较麻烦。的确,fastd... 查看详情

电商分布式文件存储fastdfs(代码片段)

文章目录目标一、FastDFS简介1FastDFS体系结构2上传流程二、FastDFS搭建1安装FastDFS镜像2、配置Nginx三、文件存储微服务1pom.xml依赖2、FastDFS配置3application.yml配置4启动类5、文件上传5.1、文件信息封装5.2、文件操作5.3、文件上传5.4、Post... 查看详情

fastdfs安装与使用(代码片段)

1.FastDFS介绍FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(trackerserver)、存储服务器(storageserver)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB<file_size<5... 查看详情

排查gcc4.4.x版本优化switch-enum的bug(代码片段)

起因一次偶然碰到一个诡异的bug,现象是同一份C++代码使用GCC4.4.x版本在开启优化前和优化后的结果不一样,优化后的代码逻辑不正确。示例代码如下://main.cpp#include<stdio.h>enumTypeERR_A=-1,ERR_B=0,ERR_C=1,;voidfunc(Typett)switch(tt)caseERR... 查看详情