一、背景介绍:
注:【结论】FDHT的问题!
研发环境使用如下命令来搭建Docker版FastDFS文件服务器,非常易于部署。在一次服务器断电后,FastDFS上传文件报错:错误码:2,错误信息:找不到节点或文件。搭建命令:
docker run -d --restart=always --privileged=true --net=host --name=fdfs -e IP={服务器IP} -e WEB_PORT=80 qbanxiaoli/fastdfs
二、解决过程:
首先,找到项目的github地址(GitHub - qbanxiaoli/fastdfs: FastDFS+FastDHT(单机+集群版)),查看一下docker内部fastdfs的服务组织架构:
发现Docker内部装有FastDFS+FastDHT(单机+集群版)服务(tracker,storage,fastdht,nginx)。通过pe -ef|grep fdfs,发下tracker和storage服务都是在运行的。
bash-5.0# ps -ef|grep fdfs
28 root 0:03 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
51 root 0:07 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
72 root 0:00 grep fdfs
通过 fdfs_monitor /etc/fdfs/client.conf ,发现tracker服务不正常, tracker_server_count参数不存在,下面是我正常情况的结果。
[2023-08-25 01:00:12] DEBUG - base_path=/var/local/fdfs/storage, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
server_count=1, server_index=0
tracker server is myip:22122
group count: 1
Group 1:
group name = group1
disk total space = 46177 MB
disk free space = 29874 MB
trunk free space = 0 MB
storage server count = 1
active server count = 1
storage server port = 23000
storage HTTP port = 80
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0
Storage 1:
id = myip
ip_addr = myip (myip) ACTIVE
然后通过 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart 重启tracker后恢复正常了。但是上传文件系统还是报错:错误码:2,错误信息:找不到节点或文件
所以,开始怀疑是FASTDHT异常引起的问题。
大概查了一下,由于FastDFS本身不能对重复上传的文件进行去重,而FastDHT可以做到去重。 FastDHT是一个高性能的分布式哈希系统,它是基于键值对存储的,而且它需要依赖于Berkeley DB作为数据存储的媒介 ,同时需要依赖于libfastcommon。
通过如下命令我们可以看到fastdfs配置都在 /etc/fdfs 和 /etc/fdht 下。数据和日志在/var/local/fdfs和/var/local/fdht目录下。FastDFS的其他问题可以通过查看tracker或storage的日志文件来排查问题。
bash-5.0# find / -name fdfs
/etc/fdfs
/var/local/fdfs
bash-5.0# find / -name fdht
/etc/fdht
/var/local/fdht
bash-5.0# cd /var/local/fdht/
bash-5.0# ls
__db.001 __db.002 __db.003 data logs tmp
bash-5.0# cd logs
bash-5.0# ls
fdhtd.log
然后我把fdht的__db.001到003文件,包括data目录下的相应文件全部删除,然后重启服务。最后fastdfs就恢复了。
三、解决方法:
删除/var/local/fdht/目录下的__db.001到003文件,并删除/var/local/fdht/data/目录下的db000文件。重启fastdfs容器,恢复服务。有大佬了解具体问题的可以指导我一下,对这个问题的具体原因还是不是很清楚。