首页 > 代码库 > FastDFS结合FastDHT实现文件去重存储

FastDFS结合FastDHT实现文件去重存储

存储文件时,为了节省存储空间,需要实现文件去重,即同一份文件只在服务器上存储一份。一种实现是文件上传后先落到应用服务器上,计算MD5并存储到数据库中,然后决定是否上传存储服务器。这样做的缺点是应用服务器端需要做并发控制,实现相对来说比较复杂。

技术分享

FastDFS本身支持文件的排重处理机制,但需要FastDHT作为文件hash的索引存储。FastDHT是FastDFS同一个作者的开源key-value数据库。其排重原理为:

FastDFS的storage server每次上传均计算文件的hash值,然后从FastDHT服务器上进行查找比对,如果没有返回,则写入hash,并将文件保存;如果有返回,则建立一个新的文件链接(软链),不保存文件。

实验环境搭建:

1、利用vmware player新建虚拟机,安装centos系统。

我用的是东北大学的一个镜像http://mirror.neu.edu.cn/centos/6.8/isos/i386/,取得文件为CentOS-6.8-i386-LiveCD.iso

2、安装fastdfs

网上安装资料挺多,推荐参考https://my.oschina.net/harlanblog/blog/466487?fromerr=cqe6bTu2,我们主要想测试FASTDHT的功能,因此完成到第5步即可。

3、安装fastdht

参考https://my.oschina.net/u/999023/blog/796238中fastdht的安装

搭建过程遇到的问题:

1、安装完fastdht后,启动fastdfs的storage报错fdfs_storaged: symbol lookup error: fdfs_storaged: undefined symbol: g_current_time

解决方法:重新安装libfastcommon(参考上面安装fastdfs的第二步)

2、测试程序在虚拟机的宿主机上,也就是需要宿主机的程序访问虚拟机的fastdfs服务,搭建环境后发现虚拟机上可以上网,能ping通宿主机。

但是宿主机的程序访问虚拟机的fastdfs服务时报错connection time out

解决方法:安装telnet服务,关闭防火墙。此时启动fastdfs服务,假设虚拟机IP为192.168.0.1,fastdfs服务端口为22122,则在宿主机(windows系统)的命令窗口

telnet 192.168.0.1 22122 连接成功则说明可以正常访问fastdfs服务了。

测试:

1、同一文件分两次先后上传(串行)

技术分享

2、同一文件同时上传(并行,三个线程同一文件同时上传)

技术分享

技术分享

结论:

经过测试集成FastDHT后,FastDFS可以实现文件去重,这样在fastdfs的客户端就不需要做额外的并发控制,可以减少很大一部分工作量。但是当前FastDFS去重功能是跟FastDHT绑定起来的,暂时不支持其他的K-V库,而且FastDHT网上的资料较少,如果hold不住它的源码(c语言实现),用起来还是存在很大风险的。

 

https://my.oschina.net/u/999023/blog/796287#comment-list

FastDFS结合FastDHT实现文件去重存储