FastDFS集羣規劃
跟蹤服務器負載均衡節點1:192.168.1.206 dfs-nginx-proxy-1
跟蹤服務器負載均衡節點2:192.168.1.207 dfs-nginx-proxy-2
跟蹤服務器1:192.168.1.200 dfs-tracker-1
跟蹤服務器2:192.168.1.201 dfs-tracker-2
存儲服務器1:192.168.1.202 dfs-storage-group1-1
存儲服務器2:192.168.1.203 dfs-storage-group1-2
存儲服務器3:192.168.1.204 dfs-storage-group2-1
存儲服務器3:192.168.1.205 dfs-storage-group2-2
HA虛擬IP:192.168.1.208
HA軟件:Keepalived
操作系統:CentOS 7
用戶:root
數據目錄:/fastdfs
安裝包:
fastdfs-master-V5.05.zip:FastDFS源碼
libfastcommon-master.zip:(從 FastDFS 和 FastDHT 中提取出來的公共 C 函數庫)
fastdfs-nginx-module-master.zip:storage節點http服務nginx模塊
nginx-1.10.0.tar.gz:Nginx安裝包
ngx_cache_purge-2.3.tar.gz:Nginx圖片緩存清除模塊
獲取安裝包的方式:
1> 從這裏下載打包好的所有安裝包:http://download.csdn.net/detail/xyang81/9667493
2> 從作者github官網挨個下載fastdfs源碼及其依賴庫:https://github.com/happyfish100 和 Nginx緩存清除模塊:https://github.com/FRiCKLE/ngx_cache_purge
開始前,先將所有安裝包下載到各個節點的/usr/local/src目錄中。
1> 本文稱節點IP最後一段就代表某個節點,如:192.168.1.206,文中提到206節點,就代表192.168.1.206。
2> 本文稱tracker或跟蹤服務器是同一個意思
3> 本文稱storage或存儲服務器是同一個意思
FastDFS集羣架構圖
外部統一訪問192.168.1.208這個虛擬IP,來訪問集羣中各節點的文件。
一、安裝集羣節點
在所有跟蹤服務器和存儲服務器節點上執行以下操作,即:200 ~ 205節點
1> 安裝所需的依賴包
shell> yum install make cmake gcc gcc-c++
2> 安裝libfatscommon
shell> cd /usr/local/src shell> unzip libfastcommon-master.zip shell> cd libfastcommon-master ## 編譯、安裝 shell> ./make.sh shell> ./make.sh install
3> 安裝FastDFS
shell> cd /usr/local/src shell> unzip fastdfs-master-V5.05.zip shell> cd fastdfs-master ## 編譯、安裝 shell> ./make.sh shell> ./make.sh install
二、配置跟蹤節點(192.168.1.200,192.168.1.201)
說明:每個節點執行相同的操作
1> 複製tracker樣例配置文件,並重命名
shell> cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
2> 修改tracker.conf配置文件
shell> vim /etc/fdfs/tracker.conf # 修改的內容如下: disabled=false # 啓用配置文件 port=22122 # tracker服務器端口(默認22122) base_path=/fastdfs/tracker # 存儲日誌和數據的根目錄
其它參數保留默認配置, 具體配置解釋可參考官方文檔說明:http://bbs.chinaunix.net/thread-1941456-1-1.html
3> 創建base_path指定的目錄
shell> mkdir -p /fastdfs/tracker
4> 防火牆中打開tracker服務器端口( 默認爲 22122)
5> 啓動tracker服務器
shell> /etc/init.d/fdfs_trackerd start
初次啓動,會在/fastdfs/tracker目錄下生成logs、data兩個目錄:
檢查FastDFS Tracker Server是否啓動成功:ps -ef " grep fdfs_trackerd
6> 停止tracker服務器
shell> /etc/init.d/fdfs_trackerd stop
7> 設置tracker服務開機啓動
shell> chkconfig fdfs_trakcerd on
三、配置存儲節點
group1: 192.168.1.202,192.168.1.203
group2: 192.168.1.204,192.168.1.205
說明:每個節點執行相同的操作
1> 複製storage樣例配置文件,並重命名
shell> cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
2> 編輯配置文件
shell> vi /etc/fdfs/storage.conf # 修改的內容如下: disabled=false # 啓用配置文件 port=23000 # storage服務端口 group_name=group1 # 組名(第一組爲group1,第二組爲group2,依次類推...) base_path=/fastdfs/storage # 數據和日誌文件存儲根目錄 store_path0=/fastdfs/storage # 第一個存儲目錄,第二個存儲目錄起名爲:store_path1=xxx,其它存儲目錄名依次類推... store_path_count=1 # 存儲路徑個數,需要和store_path個數匹配 tracker_server=192.168.0.200:22122 # tracker服務器IP和端口 tracker_server=192.168.0.201:22122 # tracker服務器IP和端口 http.server_port=8888 # http訪問文件的端口
其它參數保留默認配置, 具體配置解釋可參考官方文檔說明:http://bbs.chinaunix.net/thread-1941456-1-1.html
3> 創建基礎數據目錄
shell> mkdir -p /fastdfs/storage
4> 防火牆中打開storage服務器端口( 默認爲 23000)
shell> vi /etc/sysconfig/iptables 添加如下端口行: -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT 重啓防火牆: shell> service iptables restart
5> 啓動storage服務器
shell> /etc/init.d/fdfs_storaged start
初次啓動,會在/fastdfs/storage目錄下生成logs、data兩個目錄。
vcmFnZcS/wry94bm5" src="/uploadfile/Collfiles/20161101/201611010924061262.png" title="\" />
檢查FastDFS Tracker Server是否啓動成功:
ps -ef " grep fdfs_storaged
各節點啓動後,使用tail -f /fastdfs/storage/logs/storaged.log命令監聽存儲節點的日誌,可以看到存儲節點鏈接到跟蹤服務器,並提示哪一個爲leader跟蹤服務器,同時也能看到同一組中其它節點加入進來的日誌信息。
所有存儲節點都啓動之後,可以在任一存儲節點上使用如下命令查看集羣的狀態信息:
shell> /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
6> 停止storage服務器
shell> /etc/init.d/fdfs_storaged stop
7> 設置storage服務開機啓動
shell> chkconfig fdfs_storaged on
四、文件上傳測試
1> 修改tracker服務器client.conf配置文件
shell> cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf shell> vi /etc/fdfs/client.conf base_path=/fastdfs/tracker tracker_server=192.168.1.200:22122 tracker_server=192.168.1.201:22122
2> 執行文件上傳命令
shell> /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/FastDFS_v5.05.tar.gz
返回以下ID號,說明文件上傳成功:
group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz
group2/M00/00/00/wKgBiVXtsDmAe3kjAAVFOL7FJU4.tar.gz
(從返回的ID號中也可以看出,同一個文件分別存儲在兩個組內group1和group2,但也有可能在同一組中,具體策略是由FastDFS根據服務器的存儲情況來分配的)
五、存儲節點安裝Nginx和fastdfs-nginx-module模塊
說明:每個節點執行相同的操作
1> fastdfs-nginx-module作用說明
FastDFS 通過 Tracker 服務器,將文件放在 Storage 服務器存儲,但是同組存儲服務器之間需要進入文件複製流程,有同步延遲的問題。假設 Tracker 服務器將文件上傳到了 192.168.1.202,上傳成功後文件 ID已經返回給客戶端。此時 FastDFS 存儲集羣機制會將這個文件同步到同組存儲 192.168.1.203,在文件還沒有複製完成的情況下,客戶端如果用這個文件 ID 在 192.168.1.203上取文件,就會出現文件無法訪問的錯誤。而 fastdfs-nginx-module 可以重定向文件連接到源服務器(192.168.1.202)上取文件,避免客戶端由於複製延遲導致的文件無法訪問錯誤。
2> 安裝nginx和fastdfs-nginx-module模塊
## 安裝nginx所需的依賴包 shell> yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel ## 編譯安裝nginx(添加fastdfs-nginx-module模塊) shell> cd /usr/local/src shell> tar -zxvf nginx-1.10.0.tar.gz shell> unzip fastdfs-nginx-module-master.zip shell> cd nginx-1.10.0 shell> ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src shell> make && make install
3> 複製 fastdfs-nginx-module 源碼中的配置文件到/etc/fdfs 目錄,並修改
shell> cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ shell> vi /etc/fdfs/mod_fastdfs.conf
第一組存儲服務器的mod_fastdfs.conf配置:
connect_timeout=10 base_path=/tmp tracker_server=192.168.1.200:22122 tracker_server=192.168.1.201:22122 storage_server_port=23000 group_name=group1 # 第一組storage的組名 url_have_group_name=true store_path0=/fastdfs/storage group_count=2 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/fastdfs/storage [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/fastdfs/storage
第二組存儲服務器的mod_fastdfs.conf配置:
第二組的mod_fastdfs.confg配置與第一組的配置只有group_name不同:
group_name=group2
4> 複製FastDFS源文件目錄中HTTP相關的配置文件到/etc/fdfs目錄
shell> cd /usr/local/src/FastDFS/conf shell> cp http.conf mime.types /etc/fdfs/
5> 創建數據存放目錄的軟鏈接
shell> ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
6> 配置fastdfs-nginx-module(Nginx簡潔版樣例)
shell> vi /opt/nginx/conf/nginx.conf user nobody; 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; # FastDFS 文件訪問配置(fastdfs-nginx-module模塊) location ~/group([0-9])/M00 { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
注意:
A、8888 端口值要與/etc/fdfs/storage.conf 中的 http.server_port=8888 相對應,因爲 http.server_port 默認爲 8888,如果想改成 80,則要對應修改過來。
B、Storage 對應有多個 group 的情況下,訪問路徑帶 group 名,如:http://xxxx/group1/M00/00/00/xxx, 對應的 Nginx 配置爲:
location ~/group[0-9]/M00 { ngx_fastdfs_module; }
C、如下載時如發現老報 404,將nginx.conf第一行user nobody;修改爲user root;後重新啓動。
7> 防火牆中打開Nginx的 8888 端口
shell> vi /etc/sysconfig/iptables ## 添加 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT ## 重啓防火牆 shell> service iptables restart
8> 啓動Nginx
shell> /opt/nginx/sbin/nginx ngx_http_fastdfs_set pid=xxx # fastdfs-nginx-module進程ID
重啓 Nginx 的命令爲:/usr/local/nginx/sbin/nginx -s reload
設置Nginx開機啓動:
shell> vi /etc/rc.local # 加入 /opt/nginx/sbin/nginx shell> chmod +x /etc/rc.local # centos7
瀏覽器訪問測試時上傳的文件">9> 通過瀏覽器訪問測試時上傳的文件
http://192.168.1.202:8888/group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz
http://192.168.1.204:8888/group2/M00/00/00/wKgBiVXtsDmAe3kjAAVFOL7FJU4.tar.gz
六、 跟蹤節點安裝Nginx和ngx_cache_purge模塊
說明:每個節點執行相同的操作
tracker節點:192.168.1.200,192.168.1.201
在 tracker 上安裝的 nginx 主要爲了提供 http 訪問的反向代理、負載均衡以及緩存服務。
1> 安裝Nginx所需的依賴包
shell> yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel
2> 安裝nginx和ngx_cache_purge模塊
shell> cd /usr/local/src shell> tar -zxvf nginx-1.10.0.tar.gz shell> tar -zxvf ngx_cache_purge-2.3.tar.gz shell> cd nginx-1.10.0 shell> ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/usr/local/src/ngx_cache_purge-2.3 shell> make && make install
3> 配置Nginx,設置tracker負載均衡以及緩存
shell> vi /opt/nginx/conf/nginx.conf user nobody; 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; #設置緩存 server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 300m; 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_temp_path /fastdfs/cache/nginx/proxy_cache/tmp; #設置 group1 的服務器 upstream fdfs_group1 { server 192.168.1.202:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.203:8888 weight=1 max_fails=2 fail_timeout=30s; } #設置 group2 的服務器 upstream fdfs_group2 { server 192.168.1.204:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.205:8888 weight=1 max_fails=2 fail_timeout=30s; } server { listen 8000; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #設置 group 的負載均衡參數 location /group1/M00 { proxy_next_upstream http_502 http_504 error timeout invalid_header; 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_502 http_504 error timeout invalid_header; 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 127.0.0.1; allow 192.168.1.0/24; deny all; proxy_cache_purge http-cache $1$is_args$args; } #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 配置文件的要求,創建對應的緩存目錄:
shell> mkdir -p /fastdfs/cache/nginx/proxy_cache shell> mkdir -p /fastdfs/cache/nginx/proxy_cache/tmp
4> 防火牆打開Nginx 8000 端口
shell> vi /etc/sysconfig/iptables ## 添加如下配置 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT shell> service iptables restart # 重新啓動防火牆
5> 啓動Nginx
shell> /opt/nginx/sbin/nginx
設置開機啓動:
shell> vi /etc/rc.local ## 加入以下配置 /opt/nginx/sbin/nginx shell> chmod +x /etc/rc.local #centos7
6> 文件訪問測試
前面直接通過訪問Storage節點中的Nginx訪問文件:
http://192.168.1.202:8888/group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz
http://192.168.1.204:8888/group2/M00/00/00/wKgBiVXtsDmAe3kjAAVFOL7FJU4.tar.gz
現在可以通過Tracker中的Nginx來進行訪問:
(1)、通過 Tracker1 中的 Nginx 來訪問
http://192.168.1.200:8000/group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz
http://192.168.1.200:8000/group2/M00/00/00/wKgBiVXtsDmAe3kjAAVFOL7FJU4.tar.gz
(2)、通過 Tracker2 中的 Nginx 來訪問
http://192.168.1.201:8000/group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz
http://192.168.1.201:8000/group2/M00/00/00/wKgBiVXtsDmAe3kjAAVFOL7FJU4.tar.gz
由上面的文件訪問效果可以看到,每一個Tracker中的Nginx都單獨對後端的Storage組做了負載均衡,但整套FastDFS集羣,如果想對外提供統一的文件訪問地址,還需要對兩個Tracker中的Nginx進行HA集羣
五、 配置Tracker服務器高可用、反向代理與負載均衡
使用Keepalived + Nginx組成的高可用負載均衡集羣,做兩個Tracker節點中Nginx的負載均衡。
1> 安裝keepalived與Nginx
分別在192.168.1.206和192.168.1.207兩個節點安裝Keepalived與Nginx。
keepalived安裝與配置:http://xiumin.blog.51cto.com/6205237/1895993
Nginx的安裝與配置:http://xiumin.blog.51cto.com/6205237/1896002
2> 配置Keeyalived + Nginx高可用
請參考《Keepalived+Nginx實現高可用(HA)》
注意:將VIP的IP地址修改爲192.168.1.208
3> 配置nginx對tracker節點的負載均衡
2個節點的Nginx配置相同,如下所示:
shell> vi /opt/nginx/conf/nginx.conf user root; worker_processes 1; events { worker_connections 1024; use epool; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; ## FastDFS Tracker Proxy upstream fastdfs_tracker { server 192.168.1.200:8000 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.201:8000 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } ## FastDFS Proxy location /dfs { 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; } } }
4> 重啓192.168.1.206 和 192.168.1.207 中的Nginx
shell> /opt/nginx/sbin/nginx -s reload
5> 通過虛擬IP訪問文件測試
現在可以通過 Keepalived+Nginx 組成的高可用負載集羣的 VIP(192.168.1.208)來訪問 FastDFS 集羣中的文件了:
http://192.168.1.208/dfs/group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz http://192.168.1.208/dfs/group2/M00/00/00/wKgBiVXtsDmAe3kjAAVFOL7FJU4.tar.gz
注意:千萬不要使用 kill -9 命令強殺 FastDFS 進程,否則可能會導致 binlog 數據丟失。