分布式存儲(chǔ) FastDFS-5.0.5線上搭建
前言:
由于公司項(xiàng)目需要,最近開(kāi)始學(xué)習(xí)一下分布式存儲(chǔ)相關(guān)知識(shí),確定使用FastDFS這個(gè)開(kāi)源工具。學(xué)習(xí)之初,自己利用VMware虛擬機(jī)搭建了一個(gè)5臺(tái)機(jī)器的集群,摸清了安裝過(guò)程中可能出現(xiàn)的問(wèn)題和解決方案(http://www.rzrgm.cn/PurpleDream/p/4510279.html )。后來(lái)在正式環(huán)境搭建的時(shí)候,自己安裝的還是很順利的,但是因?yàn)槭蔷€上環(huán)境,所以安裝的時(shí)候就要注意集群設(shè)計(jì)等方面的問(wèn)題。
如果您是第一次安裝FastDFS5.0.5,建議先仔細(xì)看下我的http://www.rzrgm.cn/PurpleDream/p/4510279.html 這篇文章,雖然是在虛擬機(jī)上搭建的集群,但是涉及的問(wèn)題和解決問(wèn)題的方案絕對(duì)是比較全面的。
本篇文章主要是在上一篇虛擬機(jī)搭建FastDFS5.0.5的基礎(chǔ)上,探討線上環(huán)境搭建的注意點(diǎn)和不同點(diǎn),請(qǐng)注意~
===============================================================長(zhǎng)長(zhǎng)的分割線====================================================================
正文:
第一步,確認(rèn)資源&明確設(shè)計(jì):
因?yàn)樗鶎俦静块T的線上服務(wù)器比較緊張,所以暫時(shí)只能提供給我三臺(tái)線上服務(wù)器供我使用,另外由于當(dāng)前的第一使用場(chǎng)景只有本部門的一些業(yè)務(wù)系統(tǒng)接入,沒(méi)有到公司級(jí)別,評(píng)估了初期的總數(shù)據(jù)量和并發(fā)量,初期集群用這三臺(tái)是可以接受的,上線穩(wěn)定后,如果存儲(chǔ)不足,再相應(yīng)的加機(jī)器。下面為了說(shuō)明問(wèn)題方便,我將這三臺(tái)服務(wù)器暫時(shí)命名為:線上A、線上B、線上C。
在設(shè)計(jì)集群存儲(chǔ)的時(shí)候,我是這樣考慮的:
1. 既然是分布式存儲(chǔ),那么無(wú)論是tracker還是storage,在設(shè)計(jì)中一定要避免“單點(diǎn)”的情況出現(xiàn)。
2. 我理解的FastDFS集群中只有一個(gè)group倒是無(wú)所謂的,因?yàn)槎鄠€(gè)group只是為了負(fù)載均衡以及更重要的是獲得更大的存儲(chǔ)空間。
3. 每個(gè)group的storage兩臺(tái)是最合適的,兩臺(tái)以上完全沒(méi)有必要,因?yàn)橥侥敲炊嗯_(tái)機(jī)器,99.99%的情況下是浪費(fèi)了服務(wù)器的存儲(chǔ)空間,只有0.01%可能會(huì)在其中兩臺(tái)機(jī)器同時(shí)掛了的情況下,起到備份的作用。所以基于以上三個(gè)原則,我的設(shè)計(jì)方案如下:

第二步,F(xiàn)astDFS安裝:
此處在線上安裝的時(shí)候,基本和我在vmware虛擬機(jī)上模擬的沒(méi)有出入,可以操作參考http://www.rzrgm.cn/PurpleDream/p/4510279.html 我的這篇文章,文章中提示的一些重點(diǎn)問(wèn)題,只要在安裝過(guò)程中按照文章中的方式解決,就可以避免。
需要注意的是,有些公司的線上機(jī)器運(yùn)維是做了一定的初始化的,perl和nginx等軟件的版本與我所安裝的版本的差異性造成的一些在我的文章中沒(méi)有提及的可能出現(xiàn)的問(wèn)題。
第三步,Nginx安裝:
此處在安裝tracker和storage的nginx時(shí),其實(shí)也與我之前的文章是一致的。但是我的線上有個(gè)設(shè)計(jì)是在之前的虛擬機(jī)搭建過(guò)程中沒(méi)有涉及的。就是在在安裝線上B這臺(tái)機(jī)器時(shí),由于這臺(tái)機(jī)器上同時(shí)安裝了tracker和storage,所以我們?cè)趎ginx時(shí)既要配置tracker應(yīng)該提供的負(fù)載均衡的功能,還要提供storage的映射文件下載路徑的功能。
如果你對(duì)如何配置一臺(tái)服務(wù)器上只有tracker或者storage沒(méi)有太深的了解,可以參考我的上一篇文章http://www.rzrgm.cn/PurpleDream/p/4510279.html,這里我們直接講如何處理tracker和storage在同一臺(tái)服務(wù)器nginx的配置情況。此處我們需要在nginx中配置兩個(gè)server,一個(gè)server用來(lái)做負(fù)載均衡,另外一個(gè)server做路徑映射。詳細(xì)如下:
#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;
}
}
}
如上面的配置所示,我一共配置了兩個(gè)server,第一個(gè)server監(jiān)聽(tīng)8085端口,提供tracker的負(fù)載均衡功能,最終將http請(qǐng)求分發(fā)到線上機(jī)器B和線上機(jī)器C的8088端口;第二個(gè)server監(jiān)聽(tīng)的是8088端口,當(dāng)線上機(jī)器B收到tracker分發(fā)的請(qǐng)求后,然后利用這個(gè)server將請(qǐng)求映射到文件的真實(shí)存儲(chǔ)路徑。
第四步,安裝番外篇:
其實(shí)本文的核心或者是我在安裝過(guò)程中的最大體會(huì)就是,一定要在虛擬機(jī)環(huán)境或者線下環(huán)境盡可能的將安裝流程模擬清楚,這樣就會(huì)事半工倍。如果你做過(guò)充分的模擬的話,相信在線上環(huán)境安裝時(shí)經(jīng)過(guò)上邊的這幾步,99%的情況下你已經(jīng)成功了。
我在我的上一篇虛擬機(jī)安裝FastDFS文章http://www.rzrgm.cn/PurpleDream/p/4510279.html中,已經(jīng)提到了FastDFS維護(hù)的常用命令。但是我還要介紹一下如何在刪除線上的某個(gè)group的storage。之所以討論這個(gè)問(wèn)題,是因?yàn)槲以诘谝淮伟惭b線上時(shí),group1的storage多了一臺(tái)線上A,后來(lái)想想完全是沒(méi)有必要的,所以就想刪掉它。
當(dāng)時(shí)第一次操作的時(shí)候,是直接kill掉線上A中的storage線程。然后修改配置文件中的配置。最后重啟之后利用fdfs_monitor命令查看集群時(shí),發(fā)現(xiàn)這個(gè)storage還是存在于group1這個(gè)組中,只不過(guò)storage狀態(tài)是OFFLINE,這就說(shuō)明我的刪除方法是有問(wèn)題的,為了不影響線上使用,我又緊急花費(fèi)了一些時(shí)間將集群先恢復(fù)成原來(lái)的配置。
后來(lái)靜下心后查閱了資料,并且在虛擬機(jī)上模擬了幾遍后,刪除線上某個(gè)group中的storage的過(guò)程總結(jié)如下:
1. 停掉要?jiǎng)h除的storage節(jié)點(diǎn)。
2. 在一臺(tái)依然運(yùn)行的storage上執(zhí)行如下命令:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf delete group1 線上A的IP
3. 將每個(gè)節(jié)點(diǎn)的/etc/fdfs/mod_fastdfs.conf文件中涉及刪除掉的存儲(chǔ)節(jié)點(diǎn)的配置都注釋掉,注意,這個(gè)我們可以先看看我們之前在安裝的時(shí)候都配置了哪些屬性,然后逐一查看一下即可,要細(xì)心哦。
4. 依次重啟tracker。
5. 然后再使用fdfs_monitor,查看一下情況,此時(shí)storage和處于ACTIVE狀態(tài)的數(shù)量應(yīng)該都是的2。個(gè)別情況下可能剩下的兩個(gè)storage狀態(tài)不是ACTIVE,則可以將storage節(jié)點(diǎn)再重啟一下即可。
6. 注意將tracker的nginx配置修改一下,尤其是http請(qǐng)求分發(fā)的配置,要將已經(jīng)刪除掉的storage節(jié)點(diǎn)的配置注釋掉。
7. 將開(kāi)機(jī)啟動(dòng)中的啟動(dòng)storage節(jié)點(diǎn)的代碼注釋掉。
第五步,線上維護(hù)篇(截止到2015年11月25日):
這第五部分的內(nèi)容是線上集群在運(yùn)行的過(guò)程中,我遇到的問(wèn)題和解決方式:
事故一:
事故現(xiàn)象: 2015年11月11日下午16:30,調(diào)用我的業(yè)務(wù)方發(fā)現(xiàn)調(diào)用我的存儲(chǔ)集群突然全部失敗了,注意是全部失敗。但是通過(guò)fdfs_monitor發(fā)現(xiàn)集群應(yīng)該是正常的,未使用的存儲(chǔ)空間也還是有的。
解決過(guò)程: 由于當(dāng)時(shí)本人在封閉開(kāi)發(fā)更緊急的項(xiàng)目,所以此問(wèn)題一出現(xiàn),可能自己腦子太熱一開(kāi)始就想的過(guò)于復(fù)雜了,直接用源碼調(diào)試了一下,發(fā)現(xiàn)是獲取不到storage,由于對(duì)源碼不是很熟悉,在報(bào)異常和異常信息不是很明確,一直認(rèn)為是tracker獲取storage時(shí)鏈接沒(méi)有建立。所以一直在從網(wǎng)絡(luò)層面進(jìn)行調(diào)試,額。。。于是越走越遠(yuǎn)。
解決問(wèn)題:由于運(yùn)維和我一起抓包等都看不出網(wǎng)絡(luò)層面的問(wèn)題,所以心灰意冷的回家了。洗了澡之后,仔細(xì)想了想自己當(dāng)初搭建的過(guò)程,又重新看了一遍自己當(dāng)初在虛擬機(jī)上搭建成功時(shí)寫的這篇博客http://www.rzrgm.cn/PurpleDream/p/4510279.html。于是直接在集群上開(kāi)始直接使用命令“/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/http.conf”測(cè)試一下上傳一個(gè)名字為http.conf的文件到集群,報(bào)了如下截圖中的錯(cuò)誤:

額。。。。No Space,然后通過(guò)搜索錯(cuò)誤“tracker_query_storage fail, error no: 28, error info: No space left on devic”,把問(wèn)題定位到了tracker.conf中的一個(gè)名為reserved_storage_space的屬性上,這個(gè)屬性的默認(rèn)值一般是4G(當(dāng)然也支持直接寫百分比),當(dāng)storage中空閑存儲(chǔ)空間最小的那一臺(tái)的容量也小于這個(gè)大小的時(shí)候,tracker就取不到可用的storage了,所以也就不存儲(chǔ)了。而我當(dāng)時(shí)搭建集群的時(shí)候,把這個(gè)值配置的是10%,所以雖然我的空間還夠,但是已經(jīng)低于10%了。
問(wèn)題總結(jié):戒驕戒躁,冷靜下來(lái)分析問(wèn)題,有些東西也許真的是你想的太多了!
浙公網(wǎng)安備 33010602011771號(hào)