前言
接着上篇博客:詳細的最新版fastdfs單機版搭建,今天來講講fastdfs的集群搭建,限於篇幅,今天先搭建stoarge集群,並實現統一的http訪問方式;
沒看我上篇博客的小伙伴,最好先去瞅一眼,這篇博客很多都是基於上篇博客的;
不懂fastfds原理的,可以先去看看:分布式文件系統FastDFS設計原理,了解了原理之后,再來看這篇博客會輕松很多;
環境准備
1、機器准備
VIP:192.168.1.200
centos211(192.168.1.211):nginx + keepalived master
centos212(192.168.1.212:nginx + keepalived backup
centos210(192.168.1.210):tracker
fastdfs4(192.168.1.209):tracker
fastdfs3(192.168.1.208):storage(group2) + fastdfs-nginx-module + nginx
fastdfs2(192.168.1.207):storage(group2) + fastdfs-nginx-module + nginx
fastdfs1(192.168.1.206):storage(group1) + fastdfs-nginx-module + nginx
fastdfs (192.168.1.205):storage(group1) + fastdfs-nginx-module + nginx
2、最終各組件之間的關系圖如下
fastdfs安裝
無論是tracker還是storage的搭建,都是在fastdfs的基礎上進行的,安裝好了fastdfs之后,配置tracker或者storage就可以啟動tracker服務或者storage服務了;fastdfs安裝可參考詳細的最新版fastdfs單機版搭建
tracker配置
本文只是簡單利用了tracker集群上傳了圖片,更多的tracker集群 + nginx配置我放在下篇博客講解
兩台tracker機器配置可以完全一致,只需要在trackerd.conf修改如下配置項
base_path=/data/fastdfs/tracker
創建數據目錄並啟動tracker服務,注意是兩台
[root@centos210 fdfs]# mkdir -p /data/fastdfs/tracker
[root@fastdfs4 ~]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
storage配置
group1
兩台機器配置可以完全一樣,修改storage.conf如下配置項
base_path=/data/fastdfs/storage
store_path0=/data/fastdfs/storage
tracker_server=192.168.1.209:22122
tracker_server=192.168.1.210:22122
group_name=group1
啟動group1的兩台,並查看日志
[root@fastdfs data]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
[root@fastdfs logs]# tailf /data/fastdfs/storage/logs/storaged.log
fastdfs(205)
fastdfs1(206)
group2
兩台機器配置可以完全一樣,修改storage.conf如下配置項
base_path=/data/fastdfs/storage
store_path0=/data/fastdfs/storage
tracker_server=192.168.1.209:22122
tracker_server=192.168.1.210:22122
group_name=group2
啟動group2的兩台,並查看日志
[root@fastdfs data]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
[root@fastdfs logs]# tailf /data/fastdfs/storage/logs/storaged.log
fastdfs2(207)
fastdfs3(208)
可以看到storage都已全部連上tracker,其中tracker 209作為tracker leader
tracker高可用性
從上圖中我們可以看到192.168.1.209這台設備是作為tracker的leader的,我們現在人為關掉192.168.1.209的tracker
[root@fastdfs4 data]# /usr/bin/stop.sh /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
storage上日志
[root@fastdfs3 ~]# tailf /data/fastdfs/storage/logs/storaged.log
fastdfs3(208)
fastdfs2(207)
fastdfs1(206)
fastdfs(205)
210已經作為tracker leader了,而tracker 209已經連不上了,因為209的tracker服務停了;再啟動209的tracker服務
[root@fastdfs4 ~]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
storage上日志
fastdfs3(208)
fastdfs2(207)
fastdfs1(206)
fastdfs(205)
可以看到4台storage機器都已經重新連接上209的tracker了,只是tracker leader仍是110
java-client圖片上傳
上傳實現可參考上篇博客中實現,只是這次tracker是集群,包括兩台機器;我示例是一張圖片上傳了兩次,輸出信息如下:
2 組名:group2 路徑: M00/00/00/wKgBz1shMB2Abls1AABHO7x65CM887.jpg 2 組名:group2 路徑: M00/00/00/wKgB0FshMB2AIBQXAABHO7x65CM071.jpg
根據輸出信息可知:group2的兩台機器上有圖片,而group1的機器上沒有,我看具體到機器上看下
group2/M00/00/00/wKgB0FshMB2AIBQXAABHO7x65CM071.jpg,其中group1表示這張圖片被保存在了哪個組當中,M00代表磁盤目錄,如果電腦只有一個磁盤那就只有M00, 如果有多個磁盤,那就M01、M02...等等
fastdfs-nginx-module配置
到目前為止,我們只是實現了通過java-client上傳圖片,還是不能通過http來訪問圖片,通過配置fastdfs-nginx-module和nginx來實現http的圖片訪問
FastDFS 通過 Tracker 服務器,將文件放在 Storage 服務器存儲,但是同組存儲服務器之間需要進入文件復制流程,有同步延遲的問題。假設 Tracker 服務器將文件上傳到了 192.168.1.207,上傳成功后文件 ID已經返回給客戶端,此時 FastDFS 存儲集群機制會將這個文件同步到同組存儲 192.168.1.208,在文件還沒有復制完成的情況下,客戶端如果用這個文件 ID 在 192.168.1.208上取文件,就會出現文件無法訪問的錯誤。而 fastdfs-nginx-module 可以重定向文件連接到源服務器(192.168.1.207)上取文件,避免客戶端由於復制延遲導致的文件無法訪問錯誤。
在storage服務所在的機器配置fastdfs-nginx-module,4台機器的配置基本一樣,示例中則只展示一台機器(fastdfs3)的配置
解壓圖中fastdfs-nginx-module-master.zip
[root@fastdfs2 00]# cd /opt
[root@fastdfs2 opt]# unzip -o fastdfs-nginx-module-master.zip -d /usr/local
拷貝配置文件
[root@fastdfs2 opt]# cd /usr/local/fastdfs-nginx-module-master/src
[root@fastdfs2 src]# cp mod_fastdfs.conf /etc/fdfs/
編輯配置文件
[root@fastdfs2 src]# cd /etc/fdfs/
[root@fastdfs2 fdfs]# vi mod_fastdfs.conf
修改的地方如下:

base_path=/data/fastdfs/storage connect_timeout=10 #保留默認值也可以 tracker_server=192.168.1.209:22122 tracker_server=192.168.1.210:22122 url_have_group_name = true #url中是否加上group名 store_path0=/data/fastdfs/storage group_name=group2 #當前storage所屬的組名 group_count = 2 #組的數量,示例中共兩組:group1、group2 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage
同組的storage上的mod_fastdfs.conf想通,異組的mod_fastdfs.conf也只是group_name不同,各個storage上的mod_fastdfs.conf具體修改項如下:
fastdfs2(207),與fastdfs3同組,mod_fastdfs.conf修改項一樣

base_path=/data/fastdfs/storage connect_timeout=10 #保留默認值也可以 tracker_server=192.168.1.209:22122 tracker_server=192.168.1.210:22122 url_have_group_name = true #url中是否加上group名 store_path0=/data/fastdfs/storage group_name=group2 #當前storage所屬的組名 group_count = 2 #組的數量,示例中共兩組:group1、group2 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage
fastdfs1(206)與fastdfs(205)同組,mod_fastdfs.conf修改項一樣

base_path=/data/fastdfs/storage connect_timeout=10 #保留默認值也可以 tracker_server=192.168.1.209:22122 tracker_server=192.168.1.210:22122 url_have_group_name = true #url中是否加上group名 store_path0=/data/fastdfs/storage group_name=group1 #當前storage所屬的組名 group_count = 2 #組的數量,示例中共兩組:group1、group2 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage
nginx安裝與配置
storage方的nginx
fastdfs-nginx-module配置好了之后,還是不能通過http請求訪問storage中的圖片,因為沒有http服務;部署nginx提供http服務,集成fastdfs-nginx-module;具體可參考我的博客:詳細的最新版fastdfs單機版搭建,里面有講到集成過程。所有的storage服務器都需要配置
集成好了,配置nginx配置文件:nginx-fdfs.conf
fastdfs(205)

user root; worker_processes 1; events { use epoll; worker_connections 1024; } http { server { listen 8888; server_name 192.168.1.205; location ~/group[1]/M00/{ #root /home/FastDFS/fdfs_storage/data; ngx_fastdfs_module; } } server { listen 8080; server_name 192.168.1.205; location / { root html; index index.html index.htm; } } }
fastdfs(206)

user root; worker_processes 1; events { use epoll; worker_connections 1024; } http { server { listen 8888; server_name 192.168.1.206; location ~/group[1]/M00/{ #root /home/FastDFS/fdfs_storage/data; ngx_fastdfs_module; } } server { listen 8080; server_name 192.168.1.206; location / { root html; index index.html index.htm; } } }
fastdfs(207)

user root; worker_processes 1; events { use epoll; worker_connections 1024; } http { server { listen 8888; server_name 192.168.1.207; location ~/group[2]/M00/{ #root /home/FastDFS/fdfs_storage/data; ngx_fastdfs_module; } } server { listen 8080; server_name 192.168.1.207; location / { root html; index index.html index.htm; } } }
fastdfs(208)

user root; worker_processes 1; events { use epoll; worker_connections 1024; } http { server { listen 8888; server_name 192.168.1.208; location ~/group[2]/M00/{ #root /home/FastDFS/fdfs_storage/data; ngx_fastdfs_module; } } server { listen 8080; server_name 192.168.1.208; location / { root html; index index.html index.htm; } } }
以nginx-fdfs.conf為配置文件來啟動storage上的nginx:
[root@fastdfs3 sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx-fdfs.conf
自此storage方的nginx就配置好了
對外提供服務的nginx
VIP:192.168.1.200
centos211:nginx + keepalived master
centos212:nginx + keepalived backup
兩台nginx實現對外服務的高可用,具體搭建過程可參考:nginx實現請求的負載均衡 + keepalived實現nginx的高可用
nginx的配置文件一樣:

user root; worker_processes 1; events { worker_connections 1024; use epoll; } 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 65; #gzip on; #設置 group1 的服務器 upstream fdfs_group1 { server 192.168.1.205:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.206:8888 weight=1 max_fails=2 fail_timeout=30s; } #設置 group2 的服務器 upstream fdfs_group2 { server 192.168.1.207:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.208:8888 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #設置 group 的負載均衡參數 location /group1/M00 { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://fdfs_group1; } location /group2/M00 { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://fdfs_group2; } #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; } } }
nginx、keepalived都配置好了后,先啟動nginx,再啟動keepalived
最終效果
訪問http://192.168.1.200/group2/M00/00/00/wKgB0FshMB2AIBQXAABHO7x65CM071.jpg,出現如下美女
總結
1、了解fastdfs的原理很重要,只有理解了搭建起來才順暢;
2、fastdfs-nginx-module的作用要了解清楚,不是充當nginx的角色哦;
3、對於內存太小的機器,我覺得還是沒必要搭建這個集群了;我8G內存,啟8個虛擬機中途直接死機了一次......