1. 程式人生 > >用FastDFS一步步搭建檔案管理系統(FastDFS + Nginx )

用FastDFS一步步搭建檔案管理系統(FastDFS + Nginx )

 一、FastDFS介紹

1、簡介

FastDFS 是一個開源的高效能分散式檔案系統(DFS)。 它的主要功能包括:檔案儲存,檔案同步和檔案訪問,以及高容量和負載平衡。主要解決了海量資料儲存問題,特別適合以中小檔案(建議範圍:4KB < file_size <500MB)為載體的線上服務。

FastDFS 系統有三個角色:跟蹤伺服器(Tracker Server)、儲存伺服器(Storage Server)和客戶端(Client)。

  Tracker Server:跟蹤伺服器,主要做排程工作,起到均衡的作用;負責管理所有的 storage server和 group,每個 storage 在啟動後會連線 Tracker,告知自己所屬 group 等資訊,並保持週期性心跳。

  Storage Server:儲存伺服器,主要提供容量和備份服務;以 group 為單位,每個 group 內可以有多臺 storage server,資料互為備份。

  Client:客戶端,上傳下載資料的伺服器,也就是我們自己的專案所部署在的伺服器。

2、FastDFS的儲存策略

為了支援大容量,儲存節點(伺服器)採用了分卷(或分組)的組織方式。儲存系統由一個或多個卷組成,卷與卷之間的檔案是相互獨立的,所有卷的檔案容量累加就是整個儲存系統中的檔案容量。一個卷可以由一臺或多臺儲存伺服器組成,一個卷下的儲存伺服器中的檔案都是相同的,卷中的多臺儲存伺服器起到了冗餘備份和負載均衡的作用。

在卷中增加伺服器時,同步已有的檔案由系統自動完成,同步完成後,系統自動將新增伺服器切換到線上提供服務。當儲存空間不足或即將耗盡時,可以動態添加捲。只需要增加一臺或多臺伺服器,並將它們配置為一個新的卷,這樣就擴大了儲存系統的容量。

3、FastDFS的上傳過程

FastDFS向使用者提供基本檔案訪問介面,比如upload、download、append、delete等,以客戶端庫的方式提供給使用者使用。

Storage Server會定期的向Tracker Server傳送自己的儲存資訊。當Tracker Server Cluster中的Tracker Server不止一個時,各個Tracker之間的關係是對等的,所以客戶端上傳時可以選擇任意一個Tracker。

當Tracker收到客戶端上傳檔案的請求時,會為該檔案分配一個可以儲存檔案的group,當選定了group後就要決定給客戶端分配group中的哪一個storage server。當分配好storage server後,客戶端向storage傳送寫檔案請求,storage將會為檔案分配一個數據儲存目錄。然後為檔案分配一個fileid,最後根據以上的資訊生成檔名儲存檔案。

4、FastDFS的檔案同步

寫檔案時,客戶端將檔案寫至group內一個storage server即認為寫檔案成功,storage server寫完檔案後,會由後臺執行緒將檔案同步至同group內其他的storage server。

每個storage寫檔案後,同時會寫一份binlog,binlog裡不包含檔案資料,只包含檔名等元資訊,這份binlog用於後臺同步,storage會記錄向group內其他storage同步的進度,以便重啟後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證叢集內所有server的時鐘保持同步。

storage的同步進度會作為元資料的一部分彙報到tracker上,tracke在選擇讀storage的時候會以同步進度作為參考。

5、FastDFS的檔案下載

客戶端uploadfile成功後,會拿到一個storage生成的檔名,接下來客戶端根據這個檔名即可訪問到該檔案。

跟upload file一樣,在downloadfile時客戶端可以選擇任意tracker server。tracker傳送download請求給某個tracker,必須帶上檔名資訊,tracke從檔名中解析出檔案的group、大小、建立時間等資訊,然後為該請求選擇一個storage用來服務讀請求。

二、安裝FastDFS環境

最新的版本可以在這裡獲取,本文下載的版本是5.08,FastDFS是為網際網路應用量身定做的一套分散式檔案儲存系統,非常適合用來儲存使用者圖片、視訊、文件等檔案。對於網際網路應用,和其他分散式檔案系統相比,優勢非常明顯。具體情況大家可以看相關的介紹文件,包括FastDFS介紹PPT等等。

出於簡潔考慮,FastDFS沒有對檔案做分塊儲存,因此不太適合分散式計算場景。

下載好後,server端分為兩個部分,一個是tracker,一個是storage。顧名思義,前者排程管理,負載均衡,後者則是實際的儲存節點。兩個都能做成叢集,以防止單點故障。以前的4.x版本依賴libevent,現在不需要了,只需要libfastcommon。安裝方法如下:

1. 下載安裝libfastcommon

git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon/
./make.sh
./make.sh install

確認make沒有錯誤後,執行安裝,64位系統預設會複製到/usr/lib64下。

這時候需要設定環境變數或者建立軟連結

export LD_LIBRARY_PATH=/usr/lib64/
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

 2、下載安裝FastDFS

 第一步:大家在瀏覽器位址列輸入:https://sourceforge.net/projects/fastdfs/files,我們會看到如下圖所示介面。

第二步:下載FastDFS的Server安裝包,我們點選上圖"FastDFS Server Source Code",會看到如下圖所示介面,我們選擇2014-12-02那個版本,因為這個版本是最穩定的版本。

第三步:我們會看到如下圖所示介面,我們點選"FastDFS_v5.05.tar.gz"進行下載即可。

tar xzf FastDFS_v5.08.tar.gz
cd FastDFS/
./make.sh
./make.sh install

確認make沒有錯誤後,執行安裝,預設會安裝到/usr/bin中,並在/etc/fdfs中新增三個配置檔案。

3. 修改配置檔案


首先將三個檔案的名字去掉sample,暫時只修改以下幾點,先讓fastdfs跑起來,其餘引數調優的時候再考慮。

cd /etc/fdfs
mv -f tracker.conf.sample tracker.conf
mv -f storage.conf.sample storage.conf
mv -f client.conf.sample client.conf

去掉sample字尾 

(1)然後修改 tracker.conf 檔案中的日誌存放路徑 和 tracker server HTTP埠號:


# the base path to store data and log files
base_path=/home/fastdfs/log

注意,這個路徑是根據實際情況自定義的,檔案路徑需要安裝者手動建立,否則後續步驟會報“路徑不存在”的錯誤,下同。

# HTTP port on this tracker server
http.server_port=8090

(2)修改 storage.conf 檔案:

group_name=group1
store_path0=/home/fastdfs/storage0
base_path=/home/fastdfs/log
tracker_server=192.168.1.11:22122
http.server_port=8888

注意:“/home/fastdfs/storage0”路徑要真實存在!!!!

(3)修改 client.conf 檔案:

base_path=/home/fastdfs/log
tracker_server=192.168.1.11:22122
http.tracker_server_port=8888

注意,#include http.conf 這句,原配置檔案中有2個#,刪掉一個。 

##include http.conf  修改成
#include http.conf

(4)最後,修改 http.conf 檔案。http.conf 檔案在解壓目錄的conf目錄下,裡面有個預設圖片路徑,願意改就改了吧。

http.anti_steal.token_check_fail=/home/fastdfs/anti-steal.jpg

注意:要將http.conf./FastDFS/conf  路徑下拷貝到  /etc/fdfs

4.啟動服務 

依次執行:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

 手動建立目錄即可。

啟動成功後,在 store_path0 目錄下,建立了N*N個子目錄:

/home/fastdfs/storage0/data 檢視下

執行以下命令,驗證服務:

ps -ef |grep fdfs

5.測試上傳檔案 

首先準備一張圖片檔案,例如:/mnt/hgfs/share/HBQJ042.jpg

將這張圖片上傳至FastDFS,執行:

fdfs_test /etc/fdfs/client.conf upload /mnt/hgfs/share/HBQJ042.jpg 

返回的檔案ID由group、儲存目錄、兩級子目錄、fileid、檔案字尾名(由客戶端指定,主要用於區分檔案型別)拼接而成。

 http://192.168.1.11:8888/group1/M00/00/00/wKgBC1viSHuALqyQAGW3bk2DyE8501_big.jpg

上傳成功,檢視檔案,路徑:/home/fastdfs/storage0/data/00/00

常見bug:

 報錯:瀏覽器無法訪問
檢視nginx錯誤日誌 如下
 ERROR - file: ini_file_reader.c, line: 631, include file "http.conf" not exists, line: "#include http.conf"
 ERROR - file: /home/packages/fastdfs-nginx-module-master/src/common.c, line: 163, load conf file "/etc/fdfs/mod_fastdfs.conf" fail, ret code: 2
解決:# cp /home/fastdfs-5.11/conf/http.conf /etc/fdfs/
 

三、安裝Nginx 

1.安裝nginx的依賴庫

sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev

2.配置並編譯nginx 


使用nginx的預設配置,新增nginx的rtmp模組。 

./configure
make
sudo make install

3.執行測試nginx 


進入安裝目錄/usr/local/nginx,執行命令

./sbin/nginx

注意:以後所有的命令都在/usr/local/nginx目錄執行,也nginx配置檔案的相對目錄。

開啟瀏覽器在位址列輸入:localhost。如果,如下圖顯示那樣就證明您的nginx伺服器搭建成功了。 
這裡寫圖片描述

4.開啟配置檔案nginx.conf

檔案路徑: /usr/local/nginx/conf/nginx.conf

第一處:把第一行的user root前面的#去掉,之所以這樣做是因為訪問許可權的問題,不去掉的話,會報Forbidden錯誤。

第二處:新添一個server,listen的埠還是用預設的80埠,server_name是我們的圖片伺服器的IP(192.168.1.11是我的圖片伺服器的IP,大家根據自己的圖片伺服器的IP進行更改即可),location指定了我們的圖片伺服器存放圖片的地址,大家需要把圖片上傳到/home/fastdfs/storage0目錄下面才行,上面通過FastDFS操作將圖片放到了/home/fastdfs/storage0的目錄下了。修改完配置檔案之後我們儲存就行了.

location /group1/M00 {
   alias /home/fastdfs/storage0/data;
	}

在瀏覽器訪問之前上傳的圖片、成功。

http://192.168.1.11/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

四、FastDFS 配置 Nginx 模組

1、安裝配置Nginx模組

① fastdfs-nginx-module 模組說明

  FastDFS 通過 Tracker 伺服器,將檔案放在 Storage 伺服器儲存, 但是同組儲存伺服器之間需要進行檔案複製, 有同步延遲的問題。

  假設 Tracker 伺服器將檔案上傳到了 192.168.1.128,上傳成功後文件 ID已經返回給客戶端。

  此時 FastDFS 儲存叢集機制會將這個檔案同步到同組儲存 192.168.1.129,在檔案還沒有複製完成的情況下,客戶端如果用這個檔案 ID 在 192.168.1.129 上取檔案,就會出現檔案無法訪問的錯誤。

  而 fastdfs-nginx-module 可以重定向檔案連結到源伺服器取檔案,避免客戶端由於複製延遲導致的檔案無法訪問錯誤。

② 下載 fastdfs-nginx-module、解壓

tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module

③ 配置Nginx

在nginx中新增模組

先停止nginx 
./nginx -s stop

進入解壓包目錄
cd /software/nginx-1.8.1/

# 新增模組
./configure --add-module=../fastdfs-nginx-module/src

重新編譯、安裝
make 
make install

注意:編譯時候會有錯誤:

  root/fastdfs-nginx-module/src//common.c:21:25: fatal error: fdfs_define.h: No such file or directory

 #include "fdfs_define.h"

                        ^

compilation terminated.

make[1]: *** [objs/addon/src/ngx_http_fastdfs_module.o] Error 1

修改方法:

 vim /software/fastdfs-nginx-module/src/config
錯誤:
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient"

修改後正確的:
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"

 ④複製 fastdfs-nginx-module 原始碼中的配置檔案到/etc/fdfs 目錄, 並修改

cd /software/fastdfs-nginx-module/src

cp mod_fastdfs.conf /etc/fdfs/

修改如下配置,其它預設

# 連線超時時間
connect_timeout=10

# Tracker Server
tracker_server=192.168.1.11:22122

# StorageServer 預設埠
storage_server_port=23000

# 如果檔案ID的uri中包含/group**,則要設定為true
url_have_group_name = true

# Storage 配置的store_path0路徑,必須和storage.conf中的一致
store_path0=/home/fastdfs/storage0

⑤ 複製 FastDFS 的部分配置檔案到/etc/fdfs 目錄

cd /software/FastDFS/conf/

cp anti-steal.jpg http.conf mime.types /etc/fdfs/

 ⑥ 配置nginx,修改nginx.conf

vim /usr/local/nginx/conf/nginx.conf

注意:

  listen 80 埠值是要與 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相對應。如果改成其它埠,則需要統一,同時在防火牆中開啟該埠。

  location 的配置,如果有多個group則配置location ~/group([0-9])/M00 ,沒有則不用配group。

⑦ 在/ljzsg/fastdfs/file 檔案儲存目錄下建立軟連線,將其連結到實際存放資料的目錄,這一步可以省略。

ln -s /home/fastdfs/storage0/data/ /home/fastdfs/storage0/data/M00 

 ⑧啟動nginx

/usr/local/nginx/sbin/nginx

列印處如下就算配置成功

 注意bug:

/usr/local/nginx/logs/nginx.pid 路徑下找不到nginx.pid

錯誤資訊:

nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

修改方法:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

⑩在位址列訪問。

能下載檔案就算安裝成功。注意和第三點中直接使用nginx路由訪問不同的是,這裡配置 fastdfs-nginx-module 模組,可以重定向檔案連結到源伺服器取檔案。

最終部署結構圖(盜的圖):可以按照下面的結構搭建環境。