FastDFS結合FastDHT實現文件去重存儲

存儲文件時,爲了節省存儲空間,須要實現文件去重,即同一份文件只在服務器上存儲一份。一種實現是文件上傳後先落到應用服務器上,計算MD5並存儲到數據庫中,而後決定是否上傳存儲服務器。這樣作的缺點是應用服務器端須要作併發控制,實現相對來講比較複雜。數據庫

image

FastDFS自己支持文件的排重處理機制,但須要FastDHT做爲文件hash的索引存儲。FastDHT是FastDFS同一個做者的開源key-value數據庫。其排重原理爲:windows

FastDFS的storage server每次上傳均計算文件的hash值,而後從FastDHT服務器上進行查找比對,若是沒有返回,則寫入hash,並將文件保存;若是有返回,則創建一個新的文件連接(軟鏈),不保存文件。centos

實驗環境搭建:服務器

一、利用vmware player新建虛擬機,安裝centos系統。併發

我用的是東北大學的一個鏡像http://mirror.neu.edu.cn/centos/6.8/isos/i386/,取得文件爲CentOS-6.8-i386-LiveCD.iso測試

二、安裝fastdfsspa

網上安裝資料挺多,推薦參考https://my.oschina.net/harlanblog/blog/466487?fromerr=cqe6bTu2,咱們主要想測試FASTDHT的功能,所以完成到第5步便可。.net

三、安裝fastdht線程

參考http://www.javashuo.com/article/p-dgseldgg-kv.html中fastdht的安裝server

搭建過程遇到的問題:

一、安裝完fastdht後,啓動fastdfs的storage報錯fdfs_storaged: symbol lookup error: fdfs_storaged: undefined symbol: g_current_time

解決方法:從新安裝libfastcommon(參考上面安裝fastdfs的第二步)

二、測試程序在虛擬機的宿主機上,也就是須要宿主機的程序訪問虛擬機的fastdfs服務,搭建環境後發現虛擬機上能夠上網,能ping通宿主機。

可是宿主機的程序訪問虛擬機的fastdfs服務時報錯connection time out

解決方法:安裝telnet服務,關閉防火牆。此時啓動fastdfs服務,假設虛擬機IP爲192.168.0.1,fastdfs服務端口爲22122,則在宿主機(windows系統)的命令窗口

telnet 192.168.0.1 22122 鏈接成功則說明能夠正常訪問fastdfs服務了。

測試:

一、同一文件分兩次前後上傳(串行)

image

二、同一文件同時上傳(並行,三個線程同一文件同時上傳)

image

image

結論:

通過測試集成FastDHT後,FastDFS能夠實現文件去重,這樣在fastdfs的客戶端就不須要作額外的併發控制,能夠減小很大一部分工做量。可是當前FastDFS去重功能是跟FastDHT綁定起來的,暫時不支持其餘的K-V庫,並且FastDHT網上的資料較少,若是hold不住它的源碼(c語言實現),用起來仍是存在很大風險的。

相關文章
相關標籤/搜索