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

时间: 2024-07-31 02:24:15

FastDFS结合FastDHT实现文件去重存储的相关文章

Android 存储文件方式之一---SharedPreferences 内容提供者,以xml 的方式进行数据 存储。是一种轻量级的文件数据存储

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //UI界面的布局 文件<br><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"

两个文件去重的N种姿势

最近利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率. shell在文本处理上确有极大优势,比如多文本合并.去重等,但是最近遇到了一个难搞的问题,即两个大数据量文件去重. 有txt文件A.txt和B.txt. 其中A为关键词和搜索量,以逗号分隔,约90万行. B为关键词,约400万行. 需要从A中找出与B重复的关键词. 我试了N种姿势,但结果都不尽人意,最奇怪的是有些方法对小数据量的测试文件有用,一旦用在A与B上就会失败,真叫人百思不得其解. 姿势一

js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) { var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '&qu

基于文件的存储

在iOS开发中,经常需要将数据存储到本地,实现的策略有很多,本篇文章简单介绍一下文件存储方式. 存储位置 我们可以将各种各样的数据存储到本地,在iOS应用中,这些文件应当存储在沙盒中 如果是需要持久化的数据应当存储在沙盒的Documents目录当中,如: NSString * docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject]; NSString 

Android 文件的存储和加载

Android 文件的存储和加载,主要用于请求网络中json文件的缓存,引入了一个简单的过期时间,供大家参考学习! 文件存储 1 private void saveLocal(String json, int index) { 2 3 BufferedWriter bw = null; 4 try { 5 File dir=FileUtils.getCacheDir(); 6 //在第一行写一个过期时间 7 File file = new File(dir, getKey()+"_"

使用matlab批量处理图像后在指定文件夹存储

使用matlab批量处理图像后在指定文件夹存储 clear;clc;close all; Files=dir('D:\文件及下载相关\文档\MATLAB\postgraduate\Kodak\*.jpg'); N=length(Files); Names={}; Images={}; for k=1:N Names{k}=Files(k).name; Images{k}=imread(['D:\文件及下载相关\文档\MATLAB\postgraduate\Kodak\' Names{k}]);

在偏好文件中存储数据

SharedPreferences对象使用常规的XML文件来存储数据,这些文件存储在应用程序的数据目录内.该XML文件的结构很简单,因为它只允许存储键/值对,不过Android API还提供了非常方便的抽象,允许开发者以类型安全的方式读写数据. 创建SharedPreferences对象最简单的方式是使用PreferenceManager.getDefaultSharedPreferences()方法,它会返回应用程序默认的偏好对象.使用该方式来存储主要的偏好设置很方便,因为框架会自动管理好文件

基于mogileFS搭建分布式文件系统--海量小文件的存储利器

一.分布式文件系统    1.简介 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.分布式文件系统的设计基于客户机/服务器模式.一个典型的网络可能包括多个供多用户访问的服务器.另外,对等特性允许一些系统扮演客户机和服务器的双重角色.例如,用户可以"发表"一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样. 当下我们处在一个互联网飞速发展的信息社会,在

小文件的存储

对于小文件的存储,指小于16M的文件 import bson bson.binary.Binary() 功能: 将bytes格式字符串装换为mongodb的二进制存储格式 将文件存储到数据库中: #小文件存储方案 #直接装换为二进程格式插入到数据库 from pymongo import MongoClient import bson.binary conn = MongoClient("localhost", 27017) db = conn.image myset = db.pyt