FastDFS集群部署
部署環境
IP地址 | 計算機名 | 部署的服務 |
172.16.10.10 | node1.fastdfs | StorageGroup1 |
172.16.10.11 | node2.fastdfs | StorageGroup1 |
172.16.10.12 | node3.fastdfs | StorageGroup2 |
172.16.10.13 | node4.fastdfs | StorageGroup2 |
172.16.10.17 | node5.fastdfs | Tracker1 |
172.16.10.18 | node6.fastdfs | Tracker2 |
172.16.10.14 | node1.nginx | nginx keepalived |
172.16.10.15 | node2.nginx | nginx keepalived |
172.16.10.16(VIP) |
服務器操作系統:CentOS Linux release 7.3.1611 (Core)
SELinux:關閉
Iptables:清空
時間:保持同步
FastDFS版本:v5.08(2016-02-14最新版本)
Hosts文件解析:
172.16.10.10 node1.fastdfs 172.16.10.11 node2.fastdfs 172.16.10.12 node3.fastdfs 172.16.10.13 node4.fastdfs 172.16.10.17 node5.fastdfs 172.16.10.18 node6.fastdfs 172.16.10.14 node1.nginx 172.16.10.15 node2.nginx
使用的軟件包:
FastDFS_v5.08.tar.gz
fastdfs-nginx-module_v1.16.tar.gz
libfastcommon-master.zip
nginx-1.6.2.tar.gz
ngx_cache_purge-2.3.tar.gz
架構圖如下所示
環境部署
在tracker節點和storage節點安裝FastDFS
在tarcker節點和storage節點執行以下操作(172.16.10.10,172.16.10.11,172.16.10.12,172.16.10.13,172.16.10.17,172.16.10.18)
安裝基礎開發包
yum -y install gcc gcc-c++
首先需要安裝
下載地址:https://github.com/happyfish100/libfastcommon,在源碼包的INSTALL文件有說明
下載完成後解壓進入到解壓後目錄執行以下命令
./make.sh ./make.sh install
安裝成功後會生成一個文件:/usr/lib64/libfastcommon.so
我們需要創建軟鏈接,因為FastDFS程序設置的目錄不是這裏
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
安裝FastDFS
下載完成後進入安裝目錄執行以下命令
./make.sh ./make.sh install
安裝完成後會配置文件在:/etc/fdfs
配置tracker節點
在tarcker節點執行下面命令(172.16.10.17,172.16.10.18)
創建的數據存儲和日誌存儲目錄
mkdir -pv /data/fastdfs-tracker
重命名tarcker配置文件
cd /etc/fdfs && mv tracker.conf.sample tracker.conf
修改tracker.conf配置文件
修改base_path的值為剛創建的目錄
修改store_lookup的值為0
說明:store_lookup的值默認為2,2代表負載均衡模式,0代表輪詢模式,1代表指定節點,為方便一會測試,我們選改為0。另外store_group這人選項只有當store_lookup值為1的時候才會生效
啟動fdfs_trackerd服務
service fdfs_trackerd start
啟動成功後在剛創建的目錄下面會生成data和logs兩個目錄
/data/fastdfs-tracker ├── data │ ├── fdfs_trackerd.pid │ └── storage_changelog.dat └── logs └── trackerd.log
日誌輸出內容大概如下圖所示
查看是否監聽22122端口
配置開機自啟動
chkconfig fdfs_trackerd on
配置storage節點
在storage節點執行以下操作(172.16.10.10,172.16.10.11,172.16.10.12,172.16.10.13)
創建數據存儲目錄和日誌存儲目錄
mkdir -p /data/fastdfs-storage
重命名tarcker配置文件
cd /etc/fdfs/ && mv storage.conf.sample storage.conf
修改配置文件
修改base_path路徑為剛創建的路徑
修改store_path0路徑為剛創建的路徑
修改tracker_server後面的IP的端口為tarcker服務器的IP和監聽的端口,就算在同一臺機器也不可以使用127.0.0.1,另外我們還需要再增加一個tarcker_server的選項,指定不同的tarcker,如下所示
base_path=/data/fastdfs-storage store_path0=/data/fastdfs-storage tracker_server=172.16.10.17:22122 tracker_server=172.16.10.18:22122
註意:配置文件裏面有一項為group_name,用於指定group名,我們有兩個分組,這裏需要註意不同的storage節點,這裏的名稱都不一樣,其它都一樣,默認為group1,如果在是在172.16.10.12節點和172.16.10.13節點安裝這裏需要改成group2
啟動服務
service fdfs_storaged start
啟動成功後在剛創建的目錄下面會生成data和logs兩個目錄,並且data目錄裏面會有很多子目錄,最的會監聽23000端口
日誌說明:下面日誌說明了客戶端啟動連接兩臺tracker server成功,選舉172.16.10.13為leader,最後說明連接同一個group的storage server成功
加入開機自啟動
chkconfig fdfs_storaged on
第一次測試
主要測試tracker server的高可用,我們可以試圖關掉storage server選擇出來的leader,這樣正常情況下會觸發重新選舉出新的leader,並且會報錯連接不上被關掉的tracker server,如果再把關掉的tracker server啟動的話會提示連接成功的信息,這些都能在日誌裏面體現
在集群內任何的storage server節點執行以下命令
fdfs_monitor /etc/fdfs/storage.conf
會輸出同樣的信息,信息中包含有兩個group,並且會輸出每個group內的storage信息
客戶端上傳圖片測試
在任何一臺tracker節點測試
重命名客戶端配置文件
cd /etc/fdfs/ && mv client.conf.sample client.conf
修改配置文件
修改base_path的值為tracker配置文件裏面的base_path一樣的路徑
修改tracker_server為tracker監控的IP和端口,如果都在本機也不可以使127.0.0.1
如下所示
base_path=/data/fastdfs-tracker tracker_server=172.16.10.17:22122 tracker_server=172.16.10.18:22122
上傳圖片測試,執行下面命令
fdfs_upload_file client.conf test.png
fdfs_upload_file 命令
client.conf 指定的客戶端配置文件
test.png 指定圖片路徑
上傳成功後會返回一個類似下面的路徑
group1/M00/00/00/rBAKCloXyT2AFH_AAAD4kx1mwCw538.png
group1 代表上傳到了group1的內的storage節點
M00 代表磁盤目錄,如果只有一個磁盤那麽只有M00,多個就是M01……
00/00 代表磁盤目錄,每個目錄下又有00到FF共256個目錄,兩級目錄就有256*256個目錄
rBAKCloXyT2AFH_AAAD4kx1mwCw538.png 這是最終上傳上去的文件
最終我們知道我們的圖片被上傳到了哪幾臺服務器的哪個目錄,我們可以直接在服務器上找到我們上傳的圖片,同一個group內的圖片一樣的因為我們前面在配置tracker節點的時候我們配置的為0模式(輪詢)因此我們上傳的時候一次為group1一次為group2,如果有一個group宕機,那麽就始終在另外的group如下圖所示
這時候我們的group1裏面所有storage的M00號磁盤上面的00/00目錄下面將有rBAKClobtG6AS0JKAANxJpb_3dc838.png和rBAKC1obtHCAEMpMAANxJpb_3dc032.png而group2裏面所有storage的M00號磁盤上面的00/00目錄下面將有rBAKDFobtG-AIj2EAANxJpb_3dc974.png和rBAKDVobtHGAJgzTAANxJpb_3dc166.png
如下圖所示
說明:如果同一組的其中一臺storage發生故障,那麽上傳的文件只能存放到同一組的其它設備上面,等故障恢復後會自動將數據同步到該故障設備上面,不需要人工幹預
加入開機自啟動
chkconfig fdfs_storaged on
與Nginx結合
前面我們測試只是用客戶端測試,我們需要使用http的方式來上傳和下載,因此我們還需要搭建Nginx或apache,這裏我們就使用,使用最多的Nginx
在所有的storage節點部署Nginx
將所有源碼包復制到/usr/local/src目錄下面,然後解壓
進入到/usr/local/src/fastdfs-nginx-module/src/
cd /usr/local/src/fastdfs-nginx-module/src
修改config文件裏面的/usr/local/include/fastdfs為/usr/include/fastdfs
修改config文件裏面的/usr/local/include/fastcommon/為/usr/include/fastcommon/
進入到Nginx解壓後的目錄執行下面命令
yum -y install zlib-devel openssl-devel ./configure --prefix=/usr/local/nginx --with-pcre --add-module=/usr/local/src/fastdfs-nginx-module/src make make install
添加nginx可執行文件到環境變量
cat >> /etc/profile.d/nginx.sh << EOF #!/bin/sh PATH=$PATH:/usr/local/nginx/sbin export PATH EOF
刷新環境變量
source /etc/profile.d/nginx.sh
復制配置文件
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ cp /usr/local/src/FastDFS/conf/{http.conf,mime.types} /etc/fdfs/
創建Nginx配置文件
nginx.conf(/usr/local/nginx/conf/nginx.conf)
worker_processes 2; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; gzip on; server_tokens off; include vhost/*.conf; }
FastDFS.conf(/usr/local/nginx/conf/vhost/FastDFS.conf)
server { listen 9000; location ~/group[1-3]/M00 { ngx_fastdfs_module; } }
更改Linux最大可打開文件數量
編輯/etc/security/limits.conf在文件最後加入以下內容
* soft nofile 65536 * hard nofile 65536
註銷,重新登錄即可
編輯/etc/fdfs/mod_fastdfs.conf配置文件
修改connect_timeout為10
修改tracker_server為taacker監聽的服務器IP和地址,不可以使用127.0.0.1
修改url_have_group_name為true
修改store_path0的路徑為storage配置文件配置的路徑
修改group_count為2(因為我們就只有兩個組)
在最後增加以下配置
[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
如下所示
connect_timeout=10 tracker_server=172.16.10.17:22122 tracker_server=172.16.10.18:22122 group_name=group1 url_have_group_name = true store_path0=/data/fastdfs-storage group_count = 2 [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啟動,停止,重啟,Reload,配置檢查腳本,腳本名(/etc/init.d/nginx)
#!/bin/bash # chkconfig: - 30 21 # description: http service. # Source Function Library . /etc/init.d/functions # Nginx Settings NGINX_SBIN="/usr/local/nginx/sbin/nginx" NGINX_CONF="/usr/local/nginx/conf/nginx.conf" NGINX_PID="/usr/local/nginx/logs/nginx.pid" RETVAL=0 prog="Nginx" start() { echo -n $"Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL } reload(){ echo -n $"Reloading $prog: " killproc -p $NGINX_PID $NGINX_SBIN -HUP RETVAL=$? echo return $RETVAL } restart(){ stop start } configtest(){ $NGINX_SBIN -c $NGINX_CONF -t return 0 } case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; configtest) configtest ;; *) echo $"Usage: $0 {start|stop|reload|restart|configtest}" RETVAL=1 esac exit $RETVAL
將nginx添加以系統服務,並設置開機自啟動,最後再啟動
chkconfig --add nginx chkconfig nginx on service nginx start
測試:通過任何一個存儲節點的Nginx都可以訪問到我們上傳的所有圖片
在所有tracker節點部署Nginx
在/usr/local/src目錄下解壓nginx-1.6.2.tar.gz和ngx_cache_purge-2.3.tar.gz
安裝依賴包
yum -y install zlib-devel openssl-devel
進入到/usr/local/src/nginx-1.6.2這個目錄執行下面命令進行安裝
./configure --prefix=/usr/local/nginx --with-pcre --add-module=/usr/local/src/ngx_cache_purge-2.3 make make install
添加nginx可執行文件到環境變量:參考在storage節點部署Nginx
編輯Nginx配置文件(nginx.conf)
worker_processes 2; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; gzip on; server_tokens off; proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_cache_path /data/cache/nginx/proxy_cache levels=1:2 keys_zone=http-cache:200m max_size=1g inactive=30d; proxy_temp_path /data/cache/nginx/proxy_cache/tmp; include vhost/*.conf; }
創建緩存目錄和子配置文件目錄
mkdir -p /data/cache/nginx/proxy_cache/tmp mkdir /usr/local/nginx/conf/vhost
修改子配置文件(/usr/local/nginx/conf/vhost/FastDFS.conf)
upstream fdfs_group1 { server 172.16.10.10:8888 weight=1 max_fails=2 fail_timeout=30s; server 172.16.10.11:8888 weight=1 max_fails=2 fail_timeout=30s; } upstream fdfs_group2 { server 172.16.10.12:8888 weight=1 max_fails=2 fail_timeout=30s; server 172.16.10.13:8888 weight=1 max_fails=2 fail_timeout=30s; } server { listen 8000; location /group1/M00 { proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_cache http-cache; proxy_cache_valid 200 304 12h; proxy_cache_key $uri$is_args$args; proxy_pass http://fdfs_group1; expires 30d; } location /group2/M00 { proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_cache http-cache; proxy_cache_valid 200 304 12h; proxy_cache_key $uri$is_args$args; proxy_pass http://fdfs_group2; expires 30d; } location ~/purge(/.*) { allow all; proxy_cache_purge http-cache $1$is_args$args; } }
Nginx啟動,停止,重啟,Reload,配置檢查腳本,腳本名(/etc/init.d/nginx):參考在storage節點部署Nginx
將nginx添加以系統服務,並設置開機自啟動,最後再啟動:參考在storage節點部署Nginx
測試:通過兩中中的任意一臺trackr節點的8000端口去訪問後端任何group裏面的圖片都沒有問題
在nginx節點部署Nginx+keepalived高可用
在172.16.10.17和172.16.10.18上面執行下面操作
安裝軟件
yum -y install nginx keepalived
node1的Keepalived配置
! Configuration File for keepalived global_defs { router_id NodeA } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight 20 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1314 } track_script { chk_nginx } virtual_ipaddress { 172.16.10.16/24 } }
node2的Keepalived配置
! Configuration File for keepalived global_defs { router_id NodeB } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight 20 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1314 } track_script { chk_nginx } virtual_ipaddress { 172.16.10.16/24 } }
nginx_check.sh腳本內容(/etc/keepalived/nginx_check.sh)
#!/bin/bash A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ];then nginx sleep 2 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then pkill keepalived fi fi
nginx.conf的配置
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 51200; use epoll; } http { 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 /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; } FastDFS.conf的配置(/etc/nginx/conf.d/FastDFS.conf) upstream tracker_server { server 172.16.10.17:8000; server 172.16.10.18:8000; } server { listen 80; location /fastdfs { proxy_pass http://tracker_server/; 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; } }
啟動Keepalived
systemctl start keepalived
配置開機自啟動
systemctl enable nginx systemctl enable keepalived
檢查VIP
ip addr
集群測試
關閉集群中一半相同功能的服務器,集群可以照常運行
如:
組1:172.16.10.11,172.16.10.13,172.16.10.15,172.16.10.18
組2:172.16.10.10,172.16.10.12,172.16.10.14,172.16.10.17
集群啟動順序
1. 首先啟動所有節點的Nginx
2. 再啟動Tracker節點
3. 最後啟動Storage節點
FastDFS集群部署