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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM