這篇文章介紹如何搭建FastDFS 集群
FastDFS是一個開源的輕量級分布式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、視頻網站等等。
FastDFS為互聯網量身定制,充分考慮了冗余備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。
環境准備
系統系統 centos6.5
六台服務器:192.168.53.85/86/90
192.168.54.73/74/75
安裝包:
fastdfs-5.05.tar.gz
libfastcommon-1.0.36.zip
nginx-1.7.9.tar.gz
服務器規划
tracker服務器:192.168.53.85/86
storage服務器:192.168.53.90
192.168.54.73/74/75
安裝Fastdfs(全部)
安裝依賴包
注意:FastDFS 5.x 取消了對 libevent 的依賴,添加了對 libfastcommon 的依賴。
- 在安裝FastDFS和Nginx之前,需確保gcc、gcc-c++、 libstdc++-devel、make等依賴庫和工具已經安裝
#安裝依賴軟件
yum -y install gcc gcc-c++ libstdc++-devel pcre-devel zlib-devel wget make
yum -y groupinstall 'Development Tools'
安裝libfastcommon類庫
安裝FastDFS必須先安裝libfastcommon類庫,否則會導致報錯,安裝直接根據如下幾個步驟即可~
unzip libfastcommon-1.0.36.zip -d /usr/local
cd /usr/local/libfastcommon-1.0.36
./make.sh
./make.sh install
安裝FastDFS
tar -xvzf fastdfs-5.05.tar.gz -C /usr/local
cd /usr/local/fastdfs-5.05
./make.sh
./make.sh install
安裝好之后,在/usr/bin目錄下,可以看fdfs開頭的命令工具
FastDFS安裝完成之后,所有配置文件在/etc/fdfs目錄下,tracker需要tracker.conf配置文件,storage需要storage.conf配置文件。
## 安裝tracker(85/86)
將tracker.conf.sample文件重命名為tracker.conf,然后修改配置文件/etc/fdfs/tracker.conf
# 存儲日志和數據的根目錄
mkdir /root/fastdfs
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
只需要修改 base_pash路徑(文件存儲路徑)
vi tracker.conf
base_path=/root/fastdfs
配置文件中有這幾個參數需要注意:
#啟用配置文件
disabled=false
#設置tracker的端口號
port=22122
#設置tracker的數據文件和日志目錄(需手動創建)
base_path=/root/fastdfs
#設置http端口號
http.server_port=9090
使用/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
嘗試啟動tracker
[root@localhost ~]# fdfs_trackerd /etc/fdfs/tracker.conf restart
[root@localhost ~]#
沒有報錯,查看端口22122是否開始監聽,確認啟動是否成功。
[root@localhost ~]# ps -ef|grep fdfs
root 6078 1 0 11:59 ? 00:00:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
root 6101 6054 0 12:01 pts/2 00:00:00 grep fdfs
[root@localhost ~]# netstat -unltp | grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 6078/fdfs_trackerd
也可以查看tracker的日志是否啟動成功
[root@localhost ~]# cat /root/fastdfs/logs/trackerd.log
[2017-10-09 11:59:12] INFO - FastDFS v5.05, base_path=/root/fastdfs, run_by ...
至此,一個簡單的的tracker配置就完成了,Tracker也成功啟動~, 接下來要做的就是完成Storage的配置~
## 安裝storage(90/73/74/75)
將存儲節點分為兩個組,其中group1 (72、73)、group2 (74、75)。
創建存儲目錄和配置文件
mkdir /root/fastdfs
cd /etc/fdfs
cp storage.conf.sample storage.conf
修改配置
storage主要完成base_path,store_path以及tracker的連接地址以及storage的http服務端口配置等。
主要有如下幾個參數:
vi /etc/fdfs/storage.conf
# 內容
group_name=group1 # 組名(第一組為group1,第二組為group2,依次類推...)
base_path=/root/fastdfs # 數據和日志文件存儲根目錄
store_path0=/root/fastdfs #第一個存儲目錄,第二個存儲目錄起名為:store_path1=xxx,其它存儲目錄名依次類推...
store_path_count=1 # 存儲路徑個數,需要和store_path個數匹配
tracker_server=192.168.53.85:22122 # tracker服務器IP和端口
tracker_server=192.168.53.86:22122 # tracker服務器IP和端口
啟動Storage
啟動storage,會根據配置文件的設置自動創建多級存儲目錄,查看端口23000是否開始監聽,確認啟動是否成功。
[root@localhost fdfs]# fdfs_storaged /etc/fdfs/storage.conf restart
[root@localhost fdfs]# netstat -unltp | grep fdfs
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 5551/fdfs_storaged
也可以查看storage的日志是否啟動成功。
[root@localhost logs]# cat /root/fastdfs/logs/storaged.log
[2017-10-09 15:39:12] INFO - FastDFS v5.05, base_path=/root/fastdfs, store_path_count=1 ...
驗證storage是否登記到tracker服務器
使用fdfs_monitor /etc/fdfs/storage.conf
,運行fdfs_monitor查看storage服務器是否已經登記到tracker服務器。
可以在任一存儲節點上使用如下命令查看集群的狀態信息
fdfs_monitor /etc/fdfs/storage.conf
如果出現ip_addr =
Storage 1:
id = 192.168.53.90
ip_addr = 192.168.53.90 (localhost) ACTIVE
至此,tracker、storage等配置都完成並成功啟動
接下來,繼續完成Nginx和fastdfs-nginx-module的安裝和配置
在storage上安裝nginx
注意:fastdfs-nginx-module模塊只需要安裝到storage上。
### 安裝
解壓安裝包
tar -xvzf fastdfs-nginx-module_v1.16.tar.gz -C /usr/local
tar -zvxf nginx-1.7.9.tar.gz -C /usr/local
需要先配置軟鏈接:
ln -sv /usr/include/fastcommon /usr/local/include/fastcommon
ln -sv /usr/include/fastdfs /usr/local/include/fastdfs
ln -sv /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
安裝nginx的時候,添加 fastdfs-nginx-module-master模塊,如:
./configure --add-module=../fastdfs-nginx-module/src/
cd /usr/local/nginx-1.7.9
./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs-nginx-module/src
configure 成功輸出結果:
checking for OS
+ Linux 2.6.32-431.el6.x86_64 x86_64
checking for C compiler ... found
+ using GNU C compiler
+ gcc version: 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
checking for gcc -pipe switch ... found
......
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
configure成功了
接下來執行make和make install
make
確定編譯沒有出錯,再進行install
make install
安裝成功,查看版本信息
/usr/local/nginx/sbin/nginx -V
### 配置
配置fastdfs-nginx-module
進入fastdfs-nginx-module的src目錄,將md_fastdfs.conf配置文件拷貝到/etc/fdfs/目錄中
cd /usr/local/fastdfs-nginx-module/src
cp mod_fastdfs.conf /etc/fdfs/
配置 mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf
一般只需改動以下幾個參數即可:
base_path=/root/fastdfs #保存日志目錄
tracker_server=192.168.53.85:22122
tracker_server=192.168.53.86:22122
storage_server_port=23000 #storage服務器的端口號
group_name=group1 #當前服務器的group名
url_have_group_name = true #文件url中是否有group名
store_path_count=1 #存儲路徑個數,需要和store_path個數匹配
store_path0=/root/fastdfs #存儲路徑
group_count = 2 #設置組的個數
在末尾增加3個組的具體信息:
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/root/fastdfs
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/root/fastdfs
建立M00至存儲目錄的符號連接。
ln -s /root/fastdfs/data /root/fastdfs/data/M00
ll /root/fastdfs/data/M00
**配置nginx**
編輯/usr/local/nginx/conf
配置文件目錄下的nginx.conf,設置添加storage信息並保存。
vim /usr/local/nginx/conf/nginx.conf
將server段中的listen端口號改為8080,啟動用戶使用root。
user root
listen 8080;
在server段中添加:
location ~/group[1-2]/M00 {
root /root/fastdfs/data;
ngx_fastdfs_module;
}
復制fastdfs中的http.conf、mime.types文件到/etc/fdfs
cp /usr/local/fastdfs-5.05/conf/http.conf /usr/local/fastdfs-5.05/conf/mime.types /etc/fdfs
至此,nginx以及FastDFS插件模塊設置完成。
運行
運行nginx之前,先要把防火牆中對應的端口打開(本例中為8080)。
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
/etc/init.d/iptables save
啟動nginx,確認啟動是否成功。(查看是否對應端口8080是否開始監聽)
[root@localhost ~]# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=12768
[root@localhost ~]# netstat -unltp | grep nginx
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12769/nginx
也可查看nginx的日志是否啟動成功或是否有錯誤。
cat /usr/local/nginx/logs/error.log
在error.log中沒有錯誤,既啟動成功。可以打開瀏覽器,直接訪問http://192.168.53.90:8080,查看是否彈出nginx歡迎頁面。
查看到歡迎頁則說明,nginx運行成功。之后依次在其它storage上全部安裝上nginx並確認運行正常。
將nginx設置為開機啟動:
vim /etc/rc.d/rc.local
將運行命令行添加進文件:/usr/local/nginx/sbin/nginx
在tracker上安裝nginx
在tracker上安裝的nginx主要為了提供http訪問的反向代理、負載均衡以及緩存服務。
安裝
解壓
tar -zvxf nginx-1.7.9.tar.gz -C /usr/local
運行./configure進行安裝前的設置,主要設置安裝路徑
cd /usr/local/nginx-1.7.9
./configure --prefix=/usr/local/nginx
運行make進行編譯,確保編譯成功。
make
運行make install進行安裝。
make install
### 配置
編輯/usr/local/nginx/conf配置文件目錄下的nginx.conf,設置負載均衡
vim /usr/local/nginx/conf/nginx.conf
配置信息
worker_processes 4; #根據CPU核心數而定
events {
worker_connections 65535; #最大鏈接數
use epoll; #新版本的Linux可使用epoll加快處理性能
}
http {
#設置group1的服務器
upstream fdfs_group1 {
server 192.168.53.90:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.54.229:8080 weight=1 max_fails=2 fail_timeout=30s;
}
#設置group2的服務器
upstream fdfs_group2 {
server 192.168.54.233:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.54.234:8080 weight=1 max_fails=2 fail_timeout=30s;
}
server {
#設置服務器端口
listen 8080;
#設置group1的負載均衡參數
location /group1/M00 {
proxy_pass http://fdfs_group1;
}
#設置group2的負載均衡參數
location /group2/M00 {
proxy_pass http://fdfs_group2;
}
}
}
至此,nginx設置完成。
運行
運行nginx之前,先要把防火牆中對應的端口打開(本例中為8080)
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
/etc/init.d/iptables save
啟動nginx,確認啟動是否成功。(查看是否對應端口8080是否開始監聽)
[root@localhost ~]# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=12768
[root@localhost ~]# netstat -unltp | grep nginx
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12769/nginx
也可查看nginx的日志是否啟動成功或是否有錯誤。
cat /usr/local/nginx/logs/error.log
嘗試上傳一個文件到FastDFS,然后訪問試試。先配置client.conf文件。
cp client.conf.sample client.conf
vim /etc/fdfs/client.conf
修改以下參數:
base_path=/root/fastdfs #日志存放路徑
tracker_server=192.168.53.85:22122
tracker_server=192.168.53.86:22122
http.tracker_server_port=8080
使用/usr/local/bin/fdfs_upload_file上傳一個文件,程序會自動返回文件的URL。
[root@localhost fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/test.jpg
group2/M00/00/00/wKg26VncfamAEqZ0AAu-4Kcs3QI677.jpg
然后使用瀏覽器訪問:
http://192.168.53.85:8080/group2/M00/00/00/wKg26VncfamAEqZ0AAu-4Kcs3QI677.jpg
看有查看到圖片,說明集群搭建成功!
生產中可以將:
/root/fastdfs
替換為:/fdfs/storage
報錯
編譯nginx的時候報錯
在nginx目錄下,執行configure之后,進行make編譯報錯,報錯內容如下:
s -I src/mail \
-o objs/addon/src/ngx_http_fastdfs_module.o \
/usr/local/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c
In file included from /usr/local/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:6:
/usr/local/fastdfs-nginx-module/src/common.c:21:25: error: fdfs_define.h: No such file or directory
......
/usr/local/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:933: error: ‘true’ undeclared (first use in this function)
make[1]: *** [objs/addon/src/ngx_http_fastdfs_module.o] Error 1
make[1]: Leaving directory `/usr/local/nginx-1.7.9'
make: *** [build] Error 2
做以下修改
vim /usr/local/fastdfs-nginx-module/src/config
將、
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
修改為:
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/local/include/fastcommon/"
其實就是改動了fastdfs的路徑,沒改之前直接訪問cd /usr/local/include/fastdfs
為空目錄。
或者設置對應的軟連接也可以。
ln -sv /usr/include/fastcommon /usr/local/include/fastcommon
ln -sv /usr/include/fastdfs /usr/local/include/fastdfs
ln -sv /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
修改完成之后在nginx目錄,重新configure和make就好了。
./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs-nginx-module/src
make
### 啟動nginx報錯
在在storage上配置nginx相關信息后啟動nginx,查看日志發現報錯:
cat /usr/local/nginx/logs/error.log
ngx_http_fastdfs_process_init pid=12770
[2017-10-10 13:41:44] ERROR - file: ini_file_reader.c, line: 631, include file "http.conf" not exists, line: "#include http.conf"
[2017-10-10 13:41:44] ERROR - file: /usr/local/fastdfs-nginx-module/src/common.c, line: 155, load conf file "/etc/fdfs/mod_fastdfs.conf" fail, ret code: 2
2017/10/10 13:41:44 [alert] 12769#0: worker process 12770 exited with fatal code 2 and cannot be respawned
解決方案:
復制fastdfs中的http.conf、mime.types文件到/etc/fdfs
cp /usr/local/fastdfs-5.05/conf/http.conf /usr/local/fastdfs-5.05/conf/mime.types /etc/fdfs
然后重啟nginx
killall nginx
/usr/local/nginx/sbin/nginx
查看日志,還報錯:
[root@localhost logs]# cat /usr/local/nginx/logs/error.log
ngx_http_fastdfs_process_init pid=12813
[2017-10-10 14:05:33] ERROR - file: /usr/local/fastdfs-nginx-module/src/common.c, line: 180, config file: /etc/fdfs/mod_fastdfs.conf, you must set url_have_group_name to true to support multi-group!
2017/10/10 14:05:33 [alert] 12812#0: worker process 12813 exited with fatal code 2 and cannot be respawned
解決方案:
vim /etc/fdfs/mod_fastdfs.conf
將
url_have_group_name=false
改為
url_have_group_name=true
重啟正常
測試圖片無法訪問
搭建完成之后,訪問http://192.168.53.85:8080/group2/M00/00/00/wKg26VncfamAEqZ0AAu-4Kcs3QI677.jpg
地址圖片總是報404無法找到,跟蹤到storage服務器,查看nginx的error日志發現如下;
ERROR - file: /usr/local/fastdfs-nginx-module/src/common.c, line: 877, stat file: /root/fastdfs/data/00/00/wKg1Wlnchn2AOo0kAAu-4Kcs3QI239.jpg fail, errno: 13, error info: Permission denied
原因是nginx啟動的時候默認會以nobody用戶來啟動,這樣的話就權限訪問/root/fastdfs/data
的權限
修改這個問題有兩個版本,第一個方案設置nginx以root身份啟動,或者設置nobody用戶權限可以訪問/root/fastdfs/data
地址。這里只展示第一種方案的修改
vim /usr/local/nginx/conf/nginx.conf
# 修改nobody為root
user root
重啟nginx后問題解決
這里有一個網友整理的word版本的安裝配置文檔,包括緩存各方面的內容比較全面,需要的朋友在公眾號回復:“fastdfs”
參考: