存儲文件時,為了節省存儲空間,需要實現文件去重,即同一份文件只在服務器上存儲一份。一種實現是文件上傳后先落到應用服務器上,計算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