-
內(nèi)容簡介
在跟隨項目實踐過程中,代碼中需要使用上傳圖片的功能,其中使用了FastDFS作為圖片服務(wù)器,在此記錄一下搭建FastDFS服務(wù)器的過程
-
框架介紹
1.什么是FastDFS
FastDFS是用c語言編寫的一款開源的分布式文件系統(tǒng)。FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo),使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)。
2.FastDFS架構(gòu)
FastDFS架構(gòu)包括 Tracker server和Storage server。客戶端請求Tracker server進(jìn)行文件上傳、下載,通過Tracker server調(diào)度最終由Storage server完成文件上傳和下載。
Tracker server作用是負(fù)載均衡和調(diào)度,通過Tracker server在文件上傳時可以根據(jù)一些策略找到Storage server提供文件上傳服務(wù)。可以將tracker稱為追蹤服務(wù)器或調(diào)度服務(wù)器。
Storage server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務(wù)器上,Storage server沒有實現(xiàn)自己的文件系統(tǒng)而是利用操作系統(tǒng) 的文件系統(tǒng)來管理文件。可以將storage稱為存儲服務(wù)器,如下圖:fastdfs-show3.Tracker 集群
FastDFS集群中的Tracker server可以有多臺,Tracker server之間是相互平等關(guān)系同時提供服務(wù),Tracker server不存在單點故障。客戶端請求Tracker server采用輪詢方式,如果請求的tracker無法提供服務(wù)則換另一個tracker。
4.Storage集群
Storage集群采用了分組存儲方式。storage集群由一個或多個組構(gòu)成,集群存儲總?cè)萘繛榧褐兴薪M的存儲容量之和。一個組由一臺或多臺存儲服務(wù)器組成,組內(nèi)的Storage server之間是平等關(guān)系,不同組的Storage server之間不會相互通信,同組內(nèi)的Storage server之間會相互連接進(jìn)行文件同步,從而保證同組內(nèi)每個storage上的文件完全一致的。一個組的存儲容量為該組內(nèi)存儲服務(wù)器容量最小的那個,由此可見組內(nèi)存儲服務(wù)器的軟硬件配置最好是一致的。
采用分組存儲方式的好處是靈活、可控性較強(qiáng)。比如上傳文件時,可以由客戶端直接指定上傳到的組也可以由tracker進(jìn)行調(diào)度選擇。一個分組的存儲服務(wù)器訪問壓力較大時,可 -
準(zhǔn)備工作
1.前提條件
安裝好了VM+CentOs6.4(網(wǎng)絡(luò)等配置都可正常使用)
已安裝nginx(非必須)
JDK1.72.安裝所需
fastdfs-nginx-module_v1.16.tar.gz - 集成nginx所需模塊
FastDFS_v5.05.tar.gz - FastDFS源碼,C語言編寫,需要手動編譯
jdk-7u67-linux-x64.tar.gz
nginx-1.8.0.tar.gz - nginx源碼,C語言編寫,需要手動編譯
libfastcommonV1.0.7.tar.gz - FastDFS官方提供的基礎(chǔ)庫
perl-5.20.2.tar.gz - 編譯基礎(chǔ)庫所需要的語言環(huán)境
-
服務(wù)搭建
1.環(huán)境介紹
VM + CentOs6.4 + Jdk1.7 + nginx1.8.0
此處記錄的是在同一臺服務(wù)器上同時搭建tracker和storage,并且都是一個,組成的是一個最簡便的集群環(huán)境。
2.安裝libfastcommon基礎(chǔ)庫
將壓縮包上傳至虛擬機(jī)/usr/local下,解壓縮
進(jìn)入文件夾,看到有make.sh文件,執(zhí)行 ./make.sh ,初次安裝會報錯,因為缺少必要的語言運行環(huán)境,執(zhí)行下列命令
# FastDFS依賴libevent庫,需要安裝: yum -y install libevent # 安裝gcc庫,若之前安裝過nginx,則不需要重復(fù)安裝 yum -y install gcc yum -y install gcc -c++
- 安裝Perl語言環(huán)境,需要下載源碼perl-5.20.2.tar.gz,上傳至/usr/local下,解壓縮,進(jìn)入目錄,依次執(zhí)行:
$ tar -xzf perl-5.x.y.tar.gz //解壓縮 $ cd perl-5.x.y $ ./Configure -de $ make $ make test $ make install $ perl -v //檢測是否安裝成功
- 環(huán)境準(zhǔn)備完成后再進(jìn)入libfastcommon目錄,執(zhí)行 ./make.sh ,庫會安裝在/usr/lib64目錄下,但是FastDFS設(shè)置的lib目錄是/usr/local/lib ,所以此時可以有兩種方式
# 第一種方式,復(fù)制一份 cp /usr/lib64/libfastcommon.so /usr/local/lib # 第二種方式,建立軟連接(推薦) ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
- 到此基礎(chǔ)庫安裝完成
3.安裝FastDFS
- 將FastDFS_v5.05.tar.gz拷貝至/usr/local/下,依次執(zhí)行
tar -zxvf FastDFS_v5.05.tar.gz cd FastDFS ./make.sh ./make.sh install
- 如果安裝過程中沒有報錯,并且在/etc/fdfs目錄中包含配置文件,說明安裝成功,隨后將FastDFS目錄下的conf下的文件拷貝到/etc/fdfs/下
4.配置tracker
前面所執(zhí)行的步驟無論是tracker還是storage都是必須的,之后若要在不同的虛擬機(jī)上分別配置,主要就是對FastDFS安裝完成之后的配置過程的不同,此處演示的是在同一臺虛擬機(jī)上安裝配置
初始化文件目錄
# 配置tracker所需要的base_path mkdir /home/fastdfs_tracker
進(jìn)入/etc/fdfs目錄,復(fù)制tracker.conf.simple并改名為tracker.conf
編輯tracker.conf,對以下幾個配置進(jìn)行修改
# 是否啟用此配置文件 disabled = true # 端口號,一般使用這個默認(rèn)端口 port = 22122 # tracker的數(shù)據(jù)和日志文件目錄(預(yù)先創(chuàng)建) base_path = /home/fastdfs_tracker
- 啟動tracker,執(zhí)行命令
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
- 查看日志觀察啟動過程中是否報錯
tail -100f /home/fastdfs_tracker/logs/tracker.log (base_path路徑)
- 啟動沒有問題,則設(shè)置tracker為開機(jī)自動啟動,編輯:vi /etc/rc.d/rc.local , 將此命令加入末行。至此,tracker安裝完畢
5.配置storage
若更換虛擬機(jī)則需要執(zhí)行以上的步驟,此處繼續(xù)在原虛擬機(jī)上執(zhí)行
初始化文件目錄
# 配置storage所需要的base_path,保存日志信息 mkdir /home/fastdfs_storage_info # 配置storage所需要的base_path,保存數(shù)據(jù)文件 mkdir /home/fastdfs_storage_data
進(jìn)入/etc/fdfs目錄,復(fù)制storage.conf.simple并改名為storage.conf
編輯storage.conf,對以下幾個配置進(jìn)行修改
# 是否啟用此配置文件 disabled = true # 組名 group_name = group1 # 端口,同一組必須保證端口統(tǒng)一 port = 23001 # 日志目錄 base_path = /home/fastdfs_storage_info # 存儲路徑個數(shù),與組成員個數(shù)保持一致 store_path_count = 1 # 數(shù)據(jù)文件存儲路徑,果有多個掛載磁盤則定義多個store_path,后綴遞增即可 store_path0 = /home/fastdfs_storage_data # tracker服務(wù)器IP和端口,如果有多個則配置多個tracker tracker_server = 192.168.XX.XXX:22122
- 啟動storage,執(zhí)行命令
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
- 觀察啟動過程中是否報錯
# 通過日志觀察 tail -100f /home/fastdfs_storage_info/logs/storaged.log # 通過監(jiān)控觀察是否成功注冊到tracker /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
- 啟動沒有問題,則設(shè)置storage為開機(jī)自動啟動,編輯:vi /etc/rc.d/rc.local , 將此命令加入末行。至此,storage安裝完畢
6.測試服務(wù)
FastDFS安裝成功可通過/usr/bin/fdfs_test測試上傳、下載等操作。
編輯/etc/fdfs/client.conf,修改以下配置
base_path=/home/fastdfs_tracker tracker_server=192.168.XX.XXX:22122
- 使用格式:/usr/bin/fdfs_test 客戶端配置文件地址 upload 上傳文件,例如:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload test.jpg
-
上傳后會打印返回信息,可以觀察是否上傳成功
http://192.168.XX.XXX/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png 就是文件的下載路徑。
對應(yīng)storage服務(wù)器上的:/home/fastdfs/fdfs_storage_data/data/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png文件。
由于現(xiàn)在還沒有和nginx整合無法使用http下載
-
整合nginx
1.此處討論的是在之前nginx上重新安裝nginx(添加了新模塊)的情況,如何安裝nginx可以參考之前的博文:學(xué)習(xí)筆記-nginx
2.不管是在tracker上安裝還是storage安裝nginx,都需要先上傳FastDFS-nginx-module模塊,并且修改相應(yīng)配置
3.tracker上安裝nginx
在每個tracker上安裝nginx,的主要目的是做負(fù)載均衡及實現(xiàn)高可用。此處只有一個tracker.為配置nginx
4.在storage上安裝nginx
庫環(huán)境在此處不再贅述,由于之前已經(jīng)安裝了nginx,此處需要添加新模塊FastDFS-nginx-module,添加之前,先下載該模塊并且修改相應(yīng)的配置文件
上傳FastDFS-nginx-module至/usr/java目錄,解壓縮,進(jìn)入/FastDFS-nginx-module/src目錄下,編輯config文件,將/usr/local改為/usr (將/local去掉)
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/" CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
- 將FastDFS-nginx-module/src下的mod_FastDFS.conf拷貝至/etc/fdfs/下,并且修改配置(類比按照自己實際情況修改):
base_path = /home/fastdfs_storage_info tracker_server = XX storage_server_port = XX group_name = XX url_have_group_name = true #是否在url中使用組名 store_path_count = 1 store_path0 = /home/fastdfs_storage_data group_count = 1 #最后根據(jù)自己實際情況,為每一個組添加如下配置 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/home/fastdfs_storage_data
- 進(jìn)入nginx源碼的目錄(不是編譯后生產(chǎn)的目錄):/usr/java/nginx-1.8.0執(zhí)行命令:
./configure \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/temp/nginx/client \ --http-proxy-temp-path=/var/temp/nginx/proxy \ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --http-scgi-temp-path=/var/temp/nginx/scgi --add-module=/usr/java/fastdfs-nginx-module/src //XXX為模塊存在路徑
成功后執(zhí)行make,重新編譯,會生成新的nginx執(zhí)行文件,不要執(zhí)行make install,在obj目錄下,將obj/nginx復(fù)制到舊版本的nginx安裝目錄下,將舊版本的改為nginx.bak
測試新的nginx程序是否正確,執(zhí)行/usr/local/nginx/sbin/nginx -t , 若顯示以下信息則測試通過
nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful
- FastDFS設(shè)置的lib目錄是/usr/local/lib ,所以此時可以有兩種方式
# 第一種方式,復(fù)制一份 cp /usr/lib64/libfdfsclient.so /usr/local/lib # 第二種方式,建立軟連接(推薦) ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
- 最后需要配置nginx反向代理,進(jìn)入nginx安裝目錄,編輯nginx.conf文件,添加server節(jié)點:
server { listen 80; server_name localhost; location /group1/M00 { root /home/fastdfs_storage_data/data; ngx_fastdfs_module; } # location / { # root html; # index index.html index.htm; # } error_page 500 502 503 504 /50x.html; location = /50x.html { root html81; } }
- 配置好節(jié)點后,依次重啟tracker,重啟storage,重啟nginx,利用上述測試上傳圖片返回的url,在瀏覽器中訪問,檢測是否可以成功訪問
5.坑和排坑
我在操作過程中,卡在重新安裝nginx這一個步驟很久,啟動nginx的時候一直不成功,此時可以通過查看nginx的日志文件來查看錯誤,這個很重要
編輯nginx.conf文件,添加server節(jié)點時,注意監(jiān)聽的端口,80端口只能配置一個
若正常啟動了nginx還是不能成功訪問圖片(圖片已經(jīng)成功上傳的情況下),也可以通過查看日志來解決,比如我訪問的時候路徑里面會帶上/html/group1/...等路徑,就是因為下面那個默認(rèn)的location沒有注釋掉導(dǎo)致的
看日志,很重要 tail -100f /var/log/nginx/error.log
-
結(jié)語
搭這個服務(wù)器花了差不多一天的時間。。。過程中難免遇到很多坑,多查資料多百度,文中記錄的信息有限,中途說不定也有遺漏的信息,歡迎指正,僅供參考!
本文作者: little-dragon
個人博客: http://littledragon.cn
版權(quán)聲明: 原創(chuàng)文章,有問題請評論中留言。非商業(yè)轉(zhuǎn)載請注明作者及出處。