前言:html
因爲公司項目須要,最近開始學習一下分佈式存儲相關知識,肯定使用FastDFS這個開源工具。學習之初,本身利用VMware虛擬機搭建了一個5臺機器的集羣,摸清了安裝過程當中可能出現的問題和解決方案(http://www.cnblogs.com/PurpleDream/p/4510279.html )。後來在正式環境搭建的時候,本身安裝的仍是很順利的,可是由於是線上環境,因此安裝的時候就要注意集羣設計等方面的問題。
nginx
若是您是第一次安裝FastDFS5.0.5,建議先仔細看下個人http://www.cnblogs.com/PurpleDream/p/4510279.html 這篇文章,雖然是在虛擬機上搭建的集羣,可是涉及的問題和解決問題的方案絕對是比較全面的。服務器
本篇文章主要是在上一篇虛擬機搭建FastDFS5.0.5的基礎上,探討線上環境搭建的注意點和不一樣點,請注意~網絡
===============================================================長長的分割線====================================================================併發
正文:app
第一步,確認資源&明確設計:負載均衡
由於所屬本部門的線上服務器比較緊張,因此暫時只能提供給我三臺線上服務器供我使用,另外因爲當前的第一使用場景只有本部門的一些業務系統接入,沒有到公司級別,評估了初期的總數據量和併發量,初期集羣用這三臺是能夠接受的,上線穩定後,若是存儲不足,再相應的加機器。下面爲了說明問題方便,我將這三臺服務器暫時命名爲:線上A、線上B、線上C。 運維
在設計集羣存儲的時候,我是這樣考慮的:tcp
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%了。
問題總結:戒驕戒躁,冷靜下來分析問題,有些東西也許真的是你想的太多了!