1. 程式人生 > >【FastDFS】FastDFS+FastDHT完成檔案上傳去重

【FastDFS】FastDFS+FastDHT完成檔案上傳去重

一、前言

      最近公司讓我搞FastDFS分散式檔案系統。整個叢集環境已經搭建成功啦。但是有一個問題一直困擾著我,那就是重複檔案的上傳。即使是同一個檔案,多次上傳,返回的id也是不一樣的。這樣就造成了磁碟資源的極大浪費。但是呢FastDFS本身是不支援重複檔案去重的。好在FastDFS的作者餘慶提供了一種解決思路。那就是FastDHT。

      FastDHT是分散式雜湊系統(DHT),使用BerkeleyDB做資料儲存,使用libevent做網路IO處理。依賴於libfastcommon。

二、安裝

1、基本環境:

       CentOS7、libfastcommon、Berkeley、FastDHT

2、安裝前需要的環境gcc

yum install make cmake gcc gcc-c++

3、正式安裝

進入下載目錄:cd/usr/local/src

下載libfastcommon、Berkeley DB、FastDHT

①安裝libfastcommon   (安裝FastDFS應該已經裝了。無需重複安裝)

解壓、進入解壓縮目錄

unzip libfastcommon-master.zip
cd libfastcommon-master

編譯、安裝

./make.sh && ./make.sh install

②安裝 Berkeley DB。我下載的版本是db-6.0.30版本

進入解壓縮目錄

cd /usr/local/src/db-6.0.30/ build_unix/

進行提權:

chmod 777 ../dist/configure
選擇安裝目錄
../dist/configure --prefix=/usr/local/db-6.0.30
編譯、安裝
make && make install
(編譯安裝的時間有點長,請耐心等待)
安裝完db,會在/usr/local目錄下生成db-6.0.30目錄

③安裝fastDHT

cd /usr/local/src/
unzip fastdht-master.zip
cd fastdht-master 
vim make.sh
編譯之前需要先修改make.sh檔案。在大約27修改CFLAGS為:
CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/local/db-6.0.30/include/ -L/usr/local/db-6.0.30/lib/'
編譯、安裝
./make.sh && ./make.sh install

最後會在/usr/local/bin生成安裝後的檔案,在/etc/fdht下生成配置檔案。

二、環境配置

1、建立目錄

     mkdir/fastdht

2、修改fdhtd.conf檔案

vim /etc/fdht/fdhtd.conf
port=11411
base_path=/fastdht(該目錄必須是已經存在的)
#include /etc/fdht/fdht_servers.conf(本行前有#表示開啟,如果想關閉此選項,則應該為##開頭)

3、修改fdht_servers.conf檔案

vim /etc/fdht/fdht_servers.conf
group_count = 2   (數字可自定義)
group0 = 192.168.224.223:11411
group0 = 192.168.224.224:11411
group1 = 192.168.224.223:11411
group1 = 192.168.224.224:11411

4、修改fdht_client.conf檔案

vim /etc/fdht/fdht_client.conf
keep_alive=1  --> (本選項關聯 storaged.conf檔案)
base_path= /fastdht (該目錄必須是已經存在的)
#include /etc/fdht/fdht_servers.conf
(注意: #和include之間沒有空格)

5、修改storage.conf檔案

vim /etc/fdfs/storage.conf

line 195:  check_file_duplicate=1
(本配置項解釋: 是否檢測上傳檔案已經存在。如果已經存在,則不存在檔案內容,建立一個索引連結以節省磁碟空間)
line 206:  key_namespace=FastDFS
(本配置項解釋: 當上個引數設定為1時 , 在FastDHT中的名稱空間)
line 210  keep_alive=1 
(本配置項解釋: 長連線配置選項,如果為0則為短連線 1為長連線)
line 217:  #include /etc/fdht/fdht_servers.conf
(本配置項解釋: 可以通過 #include filename 方式來載入 FastDHT servers  的配置)
(注意: #和include之間沒有空格)

三、啟動FastDHT

1、啟動命令:

fdhtd /etc/fdhtd/fdhtd.conf
2、重啟命令:
fdhtd /etc/fdht/fdhtd.conf restart

3、出錯排查

若出現如下錯誤


第一步:cp /usr/local/db-6.0.30/lib/libdb-6.0.so /usr/lib/

第二步:檢視動態連結庫是否全連結完畢

ldd /usr/local/bin/fdhtd

由圖中可知缺少libdb-6.0.so

4、執行ldconfig命令

ldconfig

(ldconfig命令的用途, 主要是在預設搜尋目錄(/lib和/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下, 搜尋出可共享的動態連結庫(格式如lib*.so*), 進而創建出動態裝入程式(ld.so)所需的連線和快取檔案. 快取檔案預設為/etc/ld.so.cache, 此檔案儲存已排好序的動態連結庫名字列表)

5、再次執行ldd /usr/local/bin/fdhtd


有圖中可知已經不缺少libdb-6.0so啦。

6、再次啟動FastDHT

fdhtd /etc/fdht/fdhtd.conf

7、檢視埠是否啟動

netstat -an | grep 11411

(注意:要先啟動FastDHT。在啟動storage,才能使檔案去重功能生效。)

8、設定FastDHT開機自啟

vi /etc/rc.local  

加入以下配置:

fdhtd /etc/fdht/fdhtd.conf

如果開啟自啟不生效,可能是centOS找不到fdhtd檔案。建議把全路徑寫上:/usr/local/bin/fdhtd /etc/fdht/fdhtd.conf。

執行命令,使之生效:

chmod +x /etc/rc.local 

9、效果展示圖

       多次執行命令來上傳同一個檔案。如 /usr/bin/fdfs_upload_file /etc/fdfs/client.conf/usr/local/src/1234.jpeg    最終的效果圖如下圖所示。

       

       從圖中可以看出,生成了許多類似快捷方式的圖表。這說明FastDHT檔案去重功能已經成功實現。