分散式檔案管理系統FastDFS搭建教程(FastDFS+nginx+fastdfs-nginx-module)
Why FastDFS?
FastDFS是一個開源的輕量級分散式檔案系統,它對檔案進行管理,功能包括:檔案儲存、檔案同步、檔案訪問(檔案上傳、檔案下載)等,解決了大容量儲存和負載均衡的問題。特別適合以檔案為載體的線上服務,如相簿網站、視訊網站等等。
FastDFS為網際網路量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高效能等指標,使用FastDFS很容易搭建一套高效能的檔案伺服器叢集提供檔案上傳、下載等服務。
一、FastDFS架構圖
- Tracker cluster中各個tracker server相互獨立,不進行相互通訊。
- Storage cluster中各個storage組(Volume1,Volume2…)相互獨立,不進行相互通訊,也就是說各個組之間儲存的資料是不相同的。但是各個組中的storage server之間是屬於互相備份的關係,也就是說storage server之間儲存相同的資料。
- 每個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
- 首先建立工具目錄(請提前規劃好目錄)
mkdir -p /usr/local/bak/fastdfs
cd /usr/local/bak/fastdfs
- 下載並安裝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
- 從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
- 檢驗安裝後的檔案及目錄:
#服務指令碼:
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!
- 建立FastDfs資料目錄
mkdir -p /data/fastdfs/tracker
- 拷貝tracker server和client端樣例配置檔案並重命名
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
- 編輯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
- 編輯client端的配置檔案client.conf,需要修改內容如下
#
這裡配置的是儲存的目錄,包含資料和日誌檔案
base_path=/data/fastdfs/tracker
#
這裡的是上面tracker的地址和埠,如果單機則本地ip(不能127.0.0.1,最好是區域網ip),叢集則中央tracker
tracker_server=192.168.103.118:22122
- 測試啟動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)
- 拷貝storage server樣例配置檔案並重命名
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
- 編輯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
- 建立storage server資料目錄
mkdir -p /data/fastdfs/storage
mkdir -p /data/fastdfs/data
- 測試啟動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
#檢視日誌
- 最後是開啟和關閉相關的操作
#
關閉伺服器
/etc/init.d/fdfs_trackerd stop
/etc/init.d/fdfs_storaged stop
#開啟伺服器
/etc/init.d/fdfs_trackerd start
/etc/init.d/fdfs_storaged start
- 檔案上傳測試
#命令格式如下:
/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 使用教程