1.簡介
- FastDFS文件服務器單節點安裝:FastDFS教程Ⅰ-文件服務器安裝與Nginx配置
- FastDFS文件服務器擴容:FastDFS教程Ⅲ-文件服務器擴容
- nginx和keepalived實現nginx高可用:nginx和keepalived實現虛擬ip配置
2.搭建環境
- 服務器1:ip 10.63.0.154,在上面安裝FastDFS,nginx,keepalived
- 服務器2:ip 10.63.0.155,在上面安裝FastDFS,nginx,keepalived
本次采用兩台服務器,都分別安裝完整的單節點文件服務器。安裝完成后,設置服務器1和服務器2上面的storage分別屬於group1和group2。兩個storage的tracker地址設置為兩個,具體關系如下:
簡要說明:
- 把服務器1和服務器2利用keepalived做一個虛擬ip:10.63.0.158
- 為了便於展示特意把tracker和storage抽象成了兩塊,其實是在一台服務器上面。10.63.0.155的tracker指向的存儲地址為10.63.0.155的storage和10.63.0.154的storage。10.63.0.154上面的tracker指向存儲地址同理。
- 在服務器上面配置了nginx負載均衡,在服務器1上面的文件可通過服務器1和服務器2的ip訪問。在服務器2上面的文件同理可以訪問。
- 通過虛擬的ip可上傳文件到服務器1和服務器2,並可訪問。
一個tracker跟蹤器配置多個storage的方法參考FastDFS文件服務器擴容文檔。分別在服務器1和服務器2上面配置好文件后,啟動服務,在兩台服務器中輸入指令:/usr/bin/fdfs_monitor /etc/fdfs/storage.conf。截圖如下:
文件服務器配置好后,利用keepalived做虛擬ip,具體操作請參考nginx和keepalived實現nginx高可用文檔,虛擬ip設置成功后訪問截圖如下:
3.結果展示
配置好文件服務器后,程序調用虛擬ip地址10.63.0.158可上傳文件,在服務器上面測試時,直接調用文件上傳命令如:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/1.png 上傳文件,在服務器1和服務器2中上傳的文件均可通過虛擬ip10.63.0.158訪問。演示界面如下:
4.分析說明
仔細梳理整個文件上傳,存儲流程。在兩台服務器上面搭建的這一套文件服務器並不能算一個完整的文件服務器集群。在tracker指向storage的設計模式時,是采用了nginx代理分發的模式。目前一個是自身,一個是另外一台服務器,以后再次擴展存儲服務器時,可繼續沿用。但是在keepalived做nginx高可用時,並沒有做基於tracker的負載分發,筆者也嘗試在現有服務器上面做nginx.conf文件配置,但由於本身又設置了tracker到storage的分發,keepalived到tracker的分發並未生效。所以,目前兩台文件服務器一個虛擬ip的模式,算是主備的關系。
由於設置在服務器10.63.0.154上面的keepalived的優先值高於在10.63.0.155服務器上面的優先值,故當服務器10.63.0.154正常運作時,文件上傳只會走服務器10.63.0.154上面的tracker服務,tracker根據配置規則存儲文件到group1下面的存儲器或group2下面的存儲器。當服務器10.63.0.154出現異常時,keepalived已經不可用,文件上傳會走備用的服務器10.63.0.155上面的tracker服務存儲文件。
文件服務器集群搭建目前需要四台服務器,在上面主備模式基礎上,在加上兩台服務器可做集群處理。集群關系圖如下:
額外增加兩台服務器,專門做keepalived與nginx的負載高可用,通過nginx管理后面兩台服務器的tracker服務,做代理轉發。可完成文件服務器集群搭建。其中,在兩台新服務器的nginx.conf配置文件如下:

#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream fastdfs_tracker {
server 10.63.0.154:8888 weight=1 max_fails=2 fail_timeout=30s;
server 10.63.0.155:8888 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 8888;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /fastdfs {
root html;
index index.html index.htm;
proxy_pass http://fastdfs_tracker/;
proxy_set_header Host $http_host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 300m;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
在實際使用中,通常是把tracker服務和storage服務安裝在不同的服務器上,參考CSDN一位大牛的明細設計方案如下:
設計介紹文檔地址:手把手教你搭建FastDFS集群(下) ,該博主一共發布了上中下三篇文章,明確詳細的介紹了文件服務器的搭建過程,經過測試可用,可謂是業界良心。在整個方案中,沒有涉及到文件服務器遷移模塊的知識,沒有采用storage_ids.conf的id配置模式,不便遷移。