1. 程式人生 > 實用技巧 >一步步帶你用 FastDFS 搭建檔案管理系統 詳細的不得鳥

一步步帶你用 FastDFS 搭建檔案管理系統 詳細的不得鳥

目錄

FastDFS概述

  • 開源地址:https://github.com/happyfish100

  • 餘慶大佬用 c語言 編寫的一款開源的分散式檔案系統。

  • 為網際網路量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,注重高可用、高效能等指標

  • 冗餘備份: 縱向擴容

  • 線性擴容: 橫向擴容, 增加容量

  • 可以很容易搭建一套高效能的檔案伺服器叢集提供檔案上傳、下載等服務。

  • 應用場景:

    • 檔案上傳 -> 儲存
    • 檔案下載
  • 冗餘備份(通過檔案內容生成key值,在上傳同一個檔案時,不會重複儲存,這就省了很大的空間)

  • 負載均衡:
    瀏覽器訪問伺服器(192.168.110.11:8080),如果全校都訪問這個網站的時候,就會很卡,怎麼辦? 多開幾個埠(一個埠的負載能力有限),再訪問的時候,指向不忙的埠(8081、8082)和叢集有點像,
    負載就是請求的數量;均衡就是給你平均的分配,結合就是負載均衡。

  • 線性擴容:直接加配置檔案,就可以多一個伺服器的存在,早期如果想加伺服器,就需要重複寫相關程式碼,擴容非常方便。

FastDFS 中的三個角色

  • 追蹤器 ( tracker ) -> 守護程序
    • 管理者
    • 第一個啟動
  • 儲存節點 ( storage ) -> 守護程序
    • 可以理解為網路環境中可以儲存檔案的主機
    • 儲存檔案
    • 第二個啟動
  • 客戶端 - client
    • 程式猿寫的
    • 發起上傳請求, 完成上傳操作
    • 發起下載請求, 將伺服器檔案下載到本地
    • 最後啟動, 是一個普通的應用程式

FastDFS 三個角色的關係

  • 先啟動追蹤器
  • 啟動儲存節點
    • 主動連線追蹤器, 彙報當前儲存節點的狀態資訊
    • 後邊定時彙報狀態
  • 客戶端程式啟動, 連線追蹤器, 發給上傳請求
    • 客戶端詢問追蹤, 看那個儲存節點有足夠的容量
    • 追蹤查詢儲存節點資訊
    • 將查到的節點資訊傳送給客戶端
  • 客戶端通過得到的儲存節點地址, 連線儲存節點
  • 將檔案上傳到儲存節點上, 儲存節點得到一個file_id, 並將其傳送給客戶端
  • 客戶端需要儲存這個fileID, 下載的時候要用

  • 先啟動追蹤器
  • 啟動儲存節點
    • 主動連線追蹤器, 彙報當前儲存節點的狀態資訊
    • 後邊定時彙報狀態
  • 客戶端程式啟動, 連線追蹤器, 傳送下載請求
    • 客戶端詢問追蹤, 看那個儲存節點上有要下載的檔案
    • 追蹤查詢儲存節點資訊
    • 將查到的節點地址傳送給客戶端
  • 客戶端通過得到的儲存節點地址, 連線儲存節點
  • 將儲存節點發送給客戶端的檔案, 儲存到本地

FastDFS叢集

  • tracker叢集
    • 為了避免單點故障
    • 工作方式: 輪詢
    • 叢集方式: 修改配置檔案
  • 儲存節點的叢集
    • 儲存節點的管理:
      • 是以組的方式來管理的
    • 橫向擴容 -> 新增新的分組, fastDFS容量增加了
      • 不同組的主機之間不通訊
      • 各組的容量相加就是整體容量
    • 縱向擴容 -> 在現有的組中新增新的主機, 和同組主機之間互為備份關係
      • 同組主機中儲存的內容相同
      • 同組主機之間是通訊的
      • 當前組的容量按照最小的主機來算

FastDFS 架構說明

舉個例子:

小老闆(客戶端)想要存他的貨,存貨肯定是要把貨存到倉庫裡面,但是不能讓小老闆自己去找倉庫,因為那麼多倉庫,小老闆不知道哪個可以用以及哪個有空閒可以存我的貨。

所以,自己去找就很費時費力。況且,倉庫是面向很多個小老闆,這麼多小老闆如果每次都是自己去找倉庫,就會很費時間。所以,安排一個倉庫管理員,這個是幹什麼的呢? 小老闆想存東西,找這個管理員,讓管理員告訴小老闆,哪個倉庫可以用,然後小老闆就去指定倉庫存東西去了。

這個倉庫管理員沒事就去巡邏,挨個倉庫走一遍看哪個倉庫有空閒可以用,工作:定時的遍歷去查詢倉庫,看這個倉庫能用不能用(收集倉庫的狀態)。倉庫才是真正存資料的地方。

小老闆存完資料之後,倉庫就會給他一個憑證,告訴他你的東西存在了哪個倉庫,以後可以直接過來取。

線性擴容就是加倉庫。

憑證:組名 虛擬磁碟路徑(設定才有,不設定沒有) 資料兩級目錄(檔案路徑) 檔名(通過加密防止檔名重複)

FastDFS 安裝

安裝 FastDFS 依賴包

1)下載 libfastcommon.zip

下載地址:https://github.com/happyfish100/libfastcommon/releases

2)解壓縮 libfastcommon.zip

3)進入到 libfastcommon 的目錄中

4)執行 ./make.sh

5)執行 sudo ./make.sh install

安裝 FastDFS

1)下載 fastdfs.zip

下載地址:https://github.com/happyfish100/fastdfs/releases

2)解壓縮 fastdfs.zip

3)進入到 fastdfs 的目錄中

4)執行 ./make.sh

5)執行 sudo ./make.sh install

驗證

ls -al /usr/bin/fdfs*

配置跟蹤伺服器 tracker

1)拷貝檔案

sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

2)在 /home/conan/ 目錄中建立目錄 fastdfs/tracker

mkdir –p /home/conan/fastdfs/tracker

3)編輯 /etc/fdfs/tracker.conf 配置檔案

sudo vim /etc/fdfs/tracker.conf

修改內容:

base_path=/home/conan/fastdfs/tracker

配置儲存伺服器storage

1)拷貝檔案

sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

2)在 /home/conan/fastdfs/ 目錄中建立目錄 storage

mkdir –p /home/conan/fastdfs/storage

3)編輯 /etc/fdfs/storage.conf 配置檔案

sudo vim /etc/fdfs/storage.conf

修改內容:

base_path=/home/conan/fastdfs/storage
store_path0=/home/conan/fastdfs/storage
tracker_server=自己ubuntu虛擬機器的ip地址:22122

啟動tracker和storage

執行以下兩條指令

sudo fdfs_trackerd /etc/fdfs/tracker.conf
sudo fdfs_storaged /etc/fdfs/storage.conf

測試是否安裝成功

1)

sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

2)編輯 /etc/fdfs/client.conf 配置檔案

sudo vim /etc/fdfs/client.conf

修改內容:

base_path=/home/conan/fastdfs/tracker
tracker_server=自己ubuntu虛擬機器的ip地址:22122

3)上傳檔案測試

sudo fdfs_upload_file /etc/fdfs/client.conf 要上傳的圖片檔案路徑 

例如:

sudo fdfs_upload_file /etc/fdfs/client.conf /home/conan/1.jpg

如果返回類似 group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg 的檔案 id 則說明檔案上傳成功。

安裝 fastdfs-nginx-module

1)下載 nginx.tar.gz:http://nginx.org/en/download.html

2)解壓縮 nginx.tar.gz

3)下載 fastdfs-nginx-module.zip:https://github.com/happyfish100/fastdfs-nginx-module/releases

4)解壓縮 fastdfs-nginx-module.zip

5)下載庫(更換阿里源)

首先你需要去更換阿里源,因為ubuntu自帶的源沒有這個庫

怎麼更換?我在 安裝ubuntu系統 這一文章中有講到,沒有更換的可以去這裡看一下:

更換完成之後,執行以下命令

sudo apt update
sudo apt install libpcre3 libpcre3-dev

如果沒有下載這個的話,執行下面的命令會報錯:

6)進入解壓的 nginx 目錄中

執行

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module解壓後的目錄的絕對路徑/src

我這裡是:

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=/home/conan/fastdfs/fastdfs-nginx-module-1.22/src

這時如果還報以下錯誤:

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

解決方案

1)找一個臨時目錄,下載命令:wget http://www.zlib.net/zlib-1.2.11.tar.gz

2)解壓:zlib-1.2.11.tar.gz

3)進入 zlib-1.2.11 資料夾

cd zlib-1.2.11

4)安裝

./configure
make
make install

安裝完成,回到 nginx 目錄中,再次執行

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=/home/conan/fastdfs/fastdfs-nginx-module-1.22/src

安裝完成:

如果安裝過程中報以下錯誤:(錯誤原因是因為nginx編譯的時候把警告當錯誤處理,事實上這個警告並不影響)

解決方案

找到 nginx 目錄下的 objs 目錄下的 Makefile

sudo vim Makefile

刪掉裡面的 -Werror

然後回到 nginx 目錄中,再次執行:

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=/home/conan/fastdfs/fastdfs-nginx-module-1.22/src

執行完上述命令之後,

執行:

sudo make

然後執行:

sudo make install

5)拷貝

sudo cp fastdfs-nginx-module解壓後的目錄中src下mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf

6)修改內容

sudo vim /etc/fdfs/mod_fastdfs.conf

修改對應內容為:

connect_timeout=10
base_path=/home/conan/fastdfs/tracker
tracker_server=自己ubuntu虛擬機器的ip地址:22122
url_have_group_name=true
store_path0=/home/conan/fastdfs/storage

7)拷貝檔案

sudo cp 解壓縮的fastdfs目錄中的conf中的 http.conf  /etc/fdfs/http.conf

也可以先進入到解壓縮的 fastdfs 目錄中的 conf

sudo cp http.conf /etc/fdfs/http.conf

8)拷貝檔案

sudo cp 解壓縮的fastdfs目錄中的conf中的 mime.types /etc/fdfs/mime.types

也可以先進入到解壓縮的 fastdfs 目錄中的 conf

sudo cp mime.types /etc/fdfs/mime.types

nginx 配置

1)新增配置資訊

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

在 http 部分中新增配置資訊如下:

server {
    listen       8888;  # nginx伺服器埠     
    server_name  localhost;  # ip地址     
    location ~/group[0-9]/ {  # 組名     
        ngx_fastdfs_module;
        }
    error_page   500 502 503 504  /50x.html;  # 錯誤頁面     
    location = /50x.html {
        root   html;
        }
    }

啟動 nginx

sudo  /usr/local/nginx/sbin/nginx

我們之前上傳過檔案得到的一個憑證,複製那個憑證

如果沒有儲存,重新上傳一個即可(重啟系統需要重新啟動tracker和storage

在瀏覽器中輸入:

ip地址:8888/憑證

比如:

192.168.180.130:8888/group1/M00/00/00/wKi1gl7F7jmAJC73AAB66dOYt_o243.jpg

就可以看到圖片啦

李培冠部落格

歡迎訪問我的個人網站:

李培冠部落格:lpgit.com