zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    《乘法运算定律》
    pytest(三十九)--内置request读取项目的根目录 rootdir
    《乘除法意义及各部分关系》
    《比例尺》
    《百分数》
    《8的乘法口诀》
    《1升有多少》
    ant-design-vue 上传图片组件
    ant-design-vue快速搭建
    js实现无缝滚动
  • 原文地址:https://www.cnblogs.com/findumars/p/6124348.html
Copyright © 2011-2022 走看看