前言:
由於公司項目需要,最近開始學習一下分布式存儲相關知識,確定使用FastDFS這個開源工具。學習之初,自己利用VMware虛擬機搭建了一個5台機器的集群,摸清了安裝過程中可能出現的問題和解決方案(http://www.cnblogs.com/PurpleDream/p/4510279.html )。后來在正式環境搭建的時候,自己安裝的還是很順利的,但是因為是線上環境,所以安裝的時候就要注意集群設計等方面的問題。
如果您是第一次安裝FastDFS5.0.5,建議先仔細看下我的http://www.cnblogs.com/PurpleDream/p/4510279.html 這篇文章,雖然是在虛擬機上搭建的集群,但是涉及的問題和解決問題的方案絕對是比較全面的。
本篇文章主要是在上一篇虛擬機搭建FastDFS5.0.5的基礎上,探討線上環境搭建的注意點和不同點,請注意~
===============================================================長長的分割線====================================================================
正文:
第一步,確認資源&明確設計:
因為所屬本部門的線上服務器比較緊張,所以暫時只能提供給我三台線上服務器供我使用,另外由於當前的第一使用場景只有本部門的一些業務系統接入,沒有到公司級別,評估了初期的總數據量和並發量,初期集群用這三台是可以接受的,上線穩定后,如果存儲不足,再相應的加機器。下面為了說明問題方便,我將這三台服務器暫時命名為:線上A、線上B、線上C。
在設計集群存儲的時候,我是這樣考慮的:
1. 既然是分布式存儲,那么無論是tracker還是storage,在設計中一定要避免“單點”的情況出現。
2. 我理解的FastDFS集群中只有一個group倒是無所謂的,因為多個group只是為了負載均衡以及更重要的是獲得更大的存儲空間。
3. 每個group的storage兩台是最合適的,兩台以上完全沒有必要,因為同步那么多台機器,99.99%的情況下是浪費了服務器的存儲空間,只有0.01%可能會在其中兩台機器同時掛了的情況下,起到備份的作用。所以基於以上三個原則,我的設計方案如下:
第二步,FastDFS安裝:
此處在線上安裝的時候,基本和我在vmware虛擬機上模擬的沒有出入,可以操作參考http://www.cnblogs.com/PurpleDream/p/4510279.html 我的這篇文章,文章中提示的一些重點問題,只要在安裝過程中按照文章中的方式解決,就可以避免。
需要注意的是,有些公司的線上機器運維是做了一定的初始化的,perl和nginx等軟件的版本與我所安裝的版本的差異性造成的一些在我的文章中沒有提及的可能出現的問題。
第三步,Nginx安裝:
此處在安裝tracker和storage的nginx時,其實也與我之前的文章是一致的。但是我的線上有個設計是在之前的虛擬機搭建過程中沒有涉及的。就是在在安裝線上B這台機器時,由於這台機器上同時安裝了tracker和storage,所以我們在nginx時既要配置tracker應該提供的負載均衡的功能,還要提供storage的映射文件下載路徑的功能。
如果你對如何配置一台服務器上只有tracker或者storage沒有太深的了解,可以參考我的上一篇文章http://www.cnblogs.com/PurpleDream/p/4510279.html,這里我們直接講如何處理tracker和storage在同一台服務器nginx的配置情況。此處我們需要在nginx中配置兩個server,一個server用來做負載均衡,另外一個server做路徑映射。詳細如下:
#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;
sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
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_cache_path /fastdfs/cache/nginx/proxy_cache levels=1:2
keys_zone=http-cache:500m max_size=10g inactive=30d;
proxy_temp_path /fastdfs/cache/nginx/proxy_cache/tmp;
upstream fdfs_group1 { server 10.9.18.13:8088 weight=1 max_fails=2 fail_timeout=30s; server 10.9.18.14:8088 weight=1 max_fails=2 fail_timeout=30s; }
server { listen 8085; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; 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 ~/purge(/.*) { allow 127.0.0.1; allow 10.9.18.0/24; allow 10.58.99.0/24; deny all; proxy_cache_purge http-cache $1$is_args$args; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
server { listen 8088; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location ~/group1/M00{ root /fastdfs/fastdfs_storage_data/data; ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
}
如上面的配置所示,我一共配置了兩個server,第一個server監聽8085端口,提供tracker的負載均衡功能,最終將http請求分發到線上機器B和線上機器C的8088端口;第二個server監聽的是8088端口,當線上機器B收到tracker分發的請求后,然后利用這個server將請求映射到文件的真實存儲路徑。
第四步,安裝番外篇:
其實本文的核心或者是我在安裝過程中的最大體會就是,一定要在虛擬機環境或者線下環境盡可能的將安裝流程模擬清楚,這樣就會事半工倍。如果你做過充分的模擬的話,相信在線上環境安裝時經過上邊的這幾步,99%的情況下你已經成功了。
我在我的上一篇虛擬機安裝FastDFS文章http://www.cnblogs.com/PurpleDream/p/4510279.html中,已經提到了FastDFS維護的常用命令。但是我還要介紹一下如何在刪除線上的某個group的storage。之所以討論這個問題,是因為我在第一次安裝線上時,group1的storage多了一台線上A,后來想想完全是沒有必要的,所以就想刪掉它。
當時第一次操作的時候,是直接kill掉線上A中的storage線程。然后修改配置文件中的配置。最后重啟之后利用fdfs_monitor命令查看集群時,發現這個storage還是存在於group1這個組中,只不過storage狀態是OFFLINE,這就說明我的刪除方法是有問題的,為了不影響線上使用,我又緊急花費了一些時間將集群先恢復成原來的配置。
后來靜下心后查閱了資料,並且在虛擬機上模擬了幾遍后,刪除線上某個group中的storage的過程總結如下:
1. 停掉要刪除的storage節點。
2. 在一台依然運行的storage上執行如下命令:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf delete group1 線上A的IP
3. 將每個節點的/etc/fdfs/mod_fastdfs.conf文件中涉及刪除掉的存儲節點的配置都注釋掉,注意,這個我們可以先看看我們之前在安裝的時候都配置了哪些屬性,然后逐一查看一下即可,要細心哦。
4. 依次重啟tracker。
5. 然后再使用fdfs_monitor,查看一下情況,此時storage和處於ACTIVE狀態的數量應該都是的2。個別情況下可能剩下的兩個storage狀態不是ACTIVE,則可以將storage節點再重啟一下即可。
6. 注意將tracker的nginx配置修改一下,尤其是http請求分發的配置,要將已經刪除掉的storage節點的配置注釋掉。
7. 將開機啟動中的啟動storage節點的代碼注釋掉。
第五步,線上維護篇(截止到2015年11月25日):
這第五部分的內容是線上集群在運行的過程中,我遇到的問題和解決方式:
事故一:
事故現象: 2015年11月11日下午16:30,調用我的業務方發現調用我的存儲集群突然全部失敗了,注意是全部失敗。但是通過fdfs_monitor發現集群應該是正常的,未使用的存儲空間也還是有的。
解決過程: 由於當時本人在封閉開發更緊急的項目,所以此問題一出現,可能自己腦子太熱一開始就想的過於復雜了,直接用源碼調試了一下,發現是獲取不到storage,由於對源碼不是很熟悉,在報異常和異常信息不是很明確,一直認為是tracker獲取storage時鏈接沒有建立。所以一直在從網絡層面進行調試,額。。。於是越走越遠。
解決問題:由於運維和我一起抓包等都看不出網絡層面的問題,所以心灰意冷的回家了。洗了澡之后,仔細想了想自己當初搭建的過程,又重新看了一遍自己當初在虛擬機上搭建成功時寫的這篇博客http://www.cnblogs.com/PurpleDream/p/4510279.html。於是直接在集群上開始直接使用命令“/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/http.conf”測試一下上傳一個名字為http.conf的文件到集群,報了如下截圖中的錯誤:
額。。。。No Space,然后通過搜索錯誤“tracker_query_storage fail, error no: 28, error info: No space left on devic”,把問題定位到了tracker.conf中的一個名為reserved_storage_space的屬性上,這個屬性的默認值一般是4G(當然也支持直接寫百分比),當storage中空閑存儲空間最小的那一台的容量也小於這個大小的時候,tracker就取不到可用的storage了,所以也就不存儲了。而我當時搭建集群的時候,把這個值配置的是10%,所以雖然我的空間還夠,但是已經低於10%了。
問題總結:戒驕戒躁,冷靜下來分析問題,有些東西也許真的是你想的太多了!