1. 程式人生 > >分散式檔案管理系統FastDFS搭建教程(FastDFS+nginx+fastdfs-nginx-module)

分散式檔案管理系統FastDFS搭建教程(FastDFS+nginx+fastdfs-nginx-module)

Why FastDFS?

FastDFS是一個開源的輕量級分散式檔案系統,它對檔案進行管理,功能包括:檔案儲存、檔案同步、檔案訪問(檔案上傳、檔案下載)等,解決了大容量儲存和負載均衡的問題。特別適合以檔案為載體的線上服務,如相簿網站、視訊網站等等。

FastDFS為網際網路量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高效能等指標,使用FastDFS很容易搭建一套高效能的檔案伺服器叢集提供檔案上傳、下載等服務。

一、FastDFS架構圖
在這裡插入圖片描述

  1. Tracker cluster中各個tracker server相互獨立,不進行相互通訊。
  2. Storage cluster中各個storage組(Volume1,Volume2…)相互獨立,不進行相互通訊,也就是說各個組之間儲存的資料是不相同的。但是各個組中的storage server之間是屬於互相備份的關係,也就是說storage server之間儲存相同的資料。
  3. 每個storage server會啟動一個單獨的執行緒主動向Tracker cluster中每個tracker server報告其狀態資訊,包括磁碟使用情況,檔案同步情況及檔案上傳下載次數統計等資訊。

二、檔案上傳時序圖
在這裡插入圖片描述
4. Client通過Tracker server將檔案上傳到Storage server。
5. Tracker server向Client返回一臺可用的Storage server的IP地址和埠號。
6. Client直接通過Tracker server返回的IP地址和埠與其中一臺Storage server建立連線並進行檔案上傳。
7. 上傳完成,Storage server返回Client一個檔案ID(例如group1/M00/00/00/wKhnd1wkvtOAPgd5AADmHHh3iFk538.jpg),檔案上傳結束。

三、檔案下載時序圖
在這裡插入圖片描述
9. Client通過Tracker server下載指定Storage組中某個Storage server上的某個檔案(檔名包括Storage組名稱)。
10. Tracker server向Client返回一臺可用的Storage server的IP地址和埠號。
11. Client直接通過Tracker server返回的IP地址和埠與其中一臺Storage server建立連線並進行檔案下載。

安裝FastDFS

一、相關軟體清單

  • fastdfs-5.11
  • nginx-1.15.8
  • fastdfs-nginx-module-V1.20
  • libfastcommon

二、伺服器規劃

伺服器名稱 IP地址和埠 備註
fastdfs-tracker 192.168.103.118:22122 跟蹤伺服器/排程伺服器
fastdfs-storage 192.168.103.118:23000 儲存伺服器

FastDFS配置總預覽

所有的配置都再這裡了,基本只需要再修改一下本機的ip就行。這裡給出下載連結,有需要的請自取並修改,然後在下面的操作中,無需copy demo,直接copy這些配置也是可以的,省一點時間。。

提取碼: hjj2 連結: https://pan.baidu.com/s/14RJJWKwc-vvudHldew93fQ
Moshow鄭鍇 blog.csdn.net/moshowgame
配置檔案 配置路徑
mod_fastdfs.conf /etc/fdfs/
storage.conf /etc/fdfs/
tracker.conf /etc/fdfs/
client.conf /etc/fdfs/
nginx.conf /application/nginx/conf/
config fastdfs-nginx-module-1.20/src/

在這裡插入圖片描述
在這裡插入圖片描述

安裝FastDFS

  1. 首先建立工具目錄(請提前規劃好目錄)

mkdir -p /usr/local/bak/fastdfs
cd /usr/local/bak/fastdfs

  1. 下載並安裝FastDFS依賴包libfastcommon

wget https://codeload.github.com/happyfish100/libfastcommon/zip/master
unzip master
cd libfastcommon-master/
ls
顯示:HISTORY INSTALL libfastcommon.spec make.sh php-fastcommon README src
./make.sh
./make.sh install

  1. 從GitHub的Release下載並安裝FastDFS

https://github.com/happyfish100/fastdfs/releases
cd /usr/local/bak/fastdfs
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
#下載後會先顯示儲存的名稱,發現有時候儲存為V5.11,字尾都沒了,請根據螢幕提示操作具體下載到的檔案
tar xf V5.11.tar.gz
cd fastdfs-5.11
./make.sh && ./make.sh install
在這裡插入圖片描述

  1. 檢驗安裝後的檔案及目錄:

#服務指令碼:
ll /etc/init.d/ |grep fdfs
#樣例配置檔案
ll /etc/fdfs/
#命令列工具
ll /usr/bin|grep fdfs

注意:雖然FastDFS區分tracker和storage伺服器,但是安裝的軟體及步驟均相同,只是不同的配置檔案而已,因此以上安裝適用tracker server和storage server。也就是說單機的話,只要裝一份就可以用了,無需裝兩份

配置跟蹤伺服器(tracker server)

*注意。tracker_server不可配置為127.0.0.1,否則會有報錯

[2018-12-27 19:47:43] ERROR - file: storage_func.c, line: 1194, conf file “/etc/fdfs/storage.conf”, tracker: “127.0.0.1:22122” is invalid, tracker server ip can’t be 127.0.0.1
[2018-12-27 19:47:43] CRIT - exit abnormally!

  1. 建立FastDfs資料目錄

mkdir -p /data/fastdfs/tracker

  1. 拷貝tracker server和client端樣例配置檔案並重命名

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

  1. 編輯tracker server配置檔案tracker.conf,需要修改內容如下:

#the tracker server port 這裡配置的是tracker埠
port=22122
#the base path to store data and log files這裡配置的是儲存的目錄,包含資料和日誌檔案
base_path=/data/fastdfs/tracker

  1. 編輯client端的配置檔案client.conf,需要修改內容如下

#這裡配置的是儲存的目錄,包含資料和日誌檔案
base_path=/data/fastdfs/tracker

#這裡的是上面tracker的地址和埠,如果單機則本地ip(不能127.0.0.1,最好是區域網ip),叢集則中央tracker
tracker_server=192.168.103.118:22122

  1. 測試啟動tracker server,啟動成功會自動在/data/fastdfs/tracker目錄新建data和logs目錄

cd /data/fastdfs/tracker
/etc/init.d/fdfs_trackerd start
看到控制檯輸出以下資訊證明基本是成功的
Reloading systemd: [ OK ]
Starting fdfs_trackerd (via systemctl): [ OK ]
ss -lntup|grep 22122
看到控制檯輸出tcp LISTEN 0 128 *:22122 *:* users:(("fdfs_trackerd",pid=15703,fd=5))
ls
看到控制檯輸出data logs

配置儲存伺服器(storage server)

  1. 拷貝storage server樣例配置檔案並重命名

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

  1. 編輯storage server配置檔案storage.conf,需要修改內容如下:

#服務埠
port=23000
#日誌和檔案儲存路徑
base_path=/data/fastdfs/storage
#儲存路徑,如果有多個就store_path0~store_pathN排列即可
store_path0=/data/fastdfs/data
#tracker伺服器地址,填寫tracker_server=127.0.0.1:22122是錯誤的,不能為127.0.0.1,請填寫區域網ip
tracker_server=192.168.103.119:22122
#重點,這裡預設為8888,後面我們需要在nginx中配置的監聽埠號,就是這裡定義
http.server_port=8888

  1. 建立storage server資料目錄

mkdir -p /data/fastdfs/storage
mkdir -p /data/fastdfs/data

  1. 測試啟動storage server,啟動成功會自動在/data/fastdfs/tracker目錄新建data和logs目錄(啟動storage server的前提是tracker server必須事先已啟動)

cd /data/fastdfs/data
ls
/etc/init.d/fdfs_storaged start
#這裡要等很久,日誌大概滾到9Kb的時候
ss -lntup|grep 23000
#看到控制檯輸出tcp LISTEN 0 128 *:23000 *:* users:(("fdfs_storaged",pid=16542,fd=5))就對了
ls
#檢視日誌

  1. 最後是開啟和關閉相關的操作

#關閉伺服器
/etc/init.d/fdfs_trackerd stop
/etc/init.d/fdfs_storaged stop
#開啟伺服器
/etc/init.d/fdfs_trackerd start
/etc/init.d/fdfs_storaged start
在這裡插入圖片描述

  1. 檔案上傳測試

#命令格式如下:
/usr/bin/fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
#執行如下上傳命令:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /data/fastdfs/class1.jpg
#看到控制檯輸出groupN/Mxx/00/00/xxxxxx.xxxx代表上傳成功
在這裡插入圖片描述
group1/M00/00/00/wKhndlwm7HWAQQIKAAA4xhJCkoc594.jpg
返回檔案ID即說明檔案已經上傳成功

安裝fastdfs-nginx-module模組

FastDFS通過Tracker伺服器,將檔案放在Storage伺服器儲存,但是同組儲存伺服器之間需要進入檔案複製,有同步延遲的問題。假設Tracker伺服器將檔案上傳到了192.168.104.118,上傳成功後文件ID已經返回給客戶端。此時FastDFS儲存叢集機制會將這個檔案同步到同組儲存192.168.104.119,在檔案還沒有複製完成的情況下,客戶端如果用這個檔案ID在192.168.104.119上取檔案,就會出現檔案無法訪問的錯誤。而fastdfs-nginx-module可以重定向檔案連線到源伺服器取檔案,避免客戶端由於複製延遲導致的檔案無法訪問錯誤。

#新建nginx下載目錄
mkdir -p /usr/local/bak/nginx
#新建日誌儲存目錄
mkdir -p /data/fastdfs/nginx
cd /usr/local/bak/nginx
#下載並解壓
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz fastdfs-nginx-module-V1.20.tar.gz
tar xf V1.20
cd fastdfs-nginx-module-1.20/src/

編輯fastdfs-nginx-module-1.20/src/目錄下的config檔案(沒字首,沒後綴,就叫config),主要修改以下兩處地方,否則會有報錯,而且報錯是不可預料的,不要問為什麼,反正就是幹

ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

拷貝fastdfs-nginx-module模組的配置檔案mod_fastdfs.conf/etc/fdfs目錄中並編輯

cp /usr/local/bak/nginx/fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
cd /etc/fdfs/

修改內容如下,圈紅為重點修改部分:

base_path=/data/fastdfs/nginx
store_path0=/data/fastdfs/storage
tracker_server=192.168.103.118:22122
storage_server_port=23000(預設配置為23000)
url_have_group_name = true
store_path0=/data/fastdfs/storage
group_name=group1(預設配置為group1)

安裝nginx

先安裝依賴庫

yum install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel -y

安裝nginx

cd /usr/local/bak/nginx
wget https://nginx.org/download/nginx-1.15.8.tar.gz --no-check-certificate
tar xf nginx-1.15.8.tar.gz
cd nginx-1.15.8
#簡單的安裝法(我是用這種)
./configure --prefix=/application/nginx/ --add-module=/usr/local/bak/nginx/fastdfs-nginx-module-1.20/src
#比較複雜的安裝法僅供參考,如果第一個不成功就試下這個
./configure --prefix=/application/nginx --sbin-path=/application/nginx/sbin/nginx --conf-path=/application/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-stream --with-pcre --add-module=/home/software/fastdfs-nginx-module-master/src --with-stream
make && make install
在這裡插入圖片描述
在這裡插入圖片描述

拷貝FastDFS中的部分配置檔案到/etc/fdfs目錄中

cp /usr/local/bak/fastdfs/fastdfs-5.11/conf/http.conf /etc/fdfs/
cp /usr/local/bak/fastdfs/fastdfs-5.11/conf/mime.types /etc/fdfs/

配置nginx的配置檔案,路徑是/application/nginx/conf/nginx.conf

    user  root;    
    worker_processes  1;
    events {
       worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       8888;
            server_name  localhost;
            location ~/group[0-9]/ {
                ngx_fastdfs_module;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
            root   html;
            }
        }
    }

這裡有幾點要說明一下:

  • "user root"是解決下載操作時報404的問題
  • 8888埠號與/etc/fdfs/storage.conf中的http.server_port=8888相對應
  • storage對應有多個group的情況下,訪問路徑帶group名稱(已經啟用該配置),例如:/group1/M00/00/00/**,對應nginx配置 location ~/group[0-9]/ { ngx_fastdfs_module;}

拷貝nginx服務到/etc/init.d/目錄下並啟動

cp /application/nginx/sbin/nginx /etc/init.d/
/etc/init.d/nginx
ss -lntup|grep 8888
看到控制檯輸出tcp LISTEN 0 128 *:8888 *:* users:(("nginx",7308,6),("nginx",7309,6))

檢視和終止nginx狀態

ps -ef | grep nginx
kill -s 9 pid

驗收戰績

配置了大半天,究竟行不行,初次玩的時候,發現我用的fastdfs+nginx+nginx-fastdfs-module的版本太新了,有些配置需要琢磨,所以卡了一天,配置也貼了出來了,可以參考參考,有什麼需要注意的文章也說了也圈紅了。

好了,我們拼接上伺服器字首ip和埠號進行請求,這個時候由nginx-fastdfs-module進行轉發到FastDFS上。表示配置已經完成,接下來就是一些API開發和運維的工作了。

http://192.168.103.118:8888/group1/M00/00/00/wKhndlwm7HWAQQIKAAA4xhJCkoc594.jpg
在這裡插入圖片描述

後續

呼叫部分請看FastDFS Java Api 使用教程