有很多小夥伴在實際工做中,對於如何存儲文件(圖片、視頻、音頻等)沒有一個很好的解決思路。都明白不能將文件存儲在單臺服務器的磁盤上,也知道須要將文件進行副本備份。若是本身手動寫文件的副本機制,那就太麻煩了,這會涉及冗餘副本機制、服務器的調度、副本檢測、服務器節點檢測、文件副本存放策略、網絡環境檢測等等一系列的難題。瞭解Hadoop的小夥伴,會天然而然的想到HDFS,沒錯,HDFS能夠存儲文件,也可以將大文件切分紅一個個文件塊進行存儲,還可以根據配置自動提供冗餘副本機制,不用咱們本身去處理複雜的冗餘副本機制,也不用處理服務器的調度、副本檢測、服務器節點檢測、文件副本存放策略、網絡環境檢測等等一系列的難題。不過,HDFS適合存儲大文件,緣由是文件的元數據信息所有存儲在NameNode節點中,若是使用HDFS大量的存儲小文件,則會使NameNode的內存佔用率迅速上升,NameNode節點會成爲整個集羣環境的瓶頸。html
基於種種緣由的考慮,今天,我爲你們推薦一款高性能的分佈式文件系統——FastDFS,FastDFS一樣可以提供冗餘副本機制,也可以處理上述所說的種種問題。很少說了,咱們進入主題吧。java
跟蹤服務器: 192.168.50.131 (liuyazhuang131)
存儲服務器: 192.168.50.132 (liuyazhuang132)
環境: CentOS 6.5
用戶: root
數據目錄: /fastdfs (注: 數據目錄按你的數據盤掛載路徑而定)nginx
安裝包:c++
源碼地址: https://github.com/happyfish100/
下載地址: http://sourceforge.net/projects/fastdfs/files/
官方論壇: http://bbs.chinaunix.net/forum-240-1.htmlgit
# yum install make cmake gcc gcc-c++
(1)上傳或下載 libfastcommon-master.zip 到/usr/local/src 目錄github
(2)解壓vim
# cd /usr/local/src/ # unzip libfastcommon-master.zip # cd libfastcommon-master
(3) 編譯、安裝瀏覽器
# ./make.sh # ./make.sh install
libfastcommon 默認安裝到了以下位置。bash
/usr/lib64/libfastcommon.so /usr/lib64/libfdfsclient.so
(4)由於 FastDFS 主程序設置的 lib 目錄是/usr/local/lib, 因此須要建立軟連接服務器
# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so # ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so # ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so # ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
(1)上傳或下載 FastDFS 源碼包(FastDFS_v5.05.tar.gz) 到 /usr/local/src 目錄
(2)解壓
# cd /usr/local/src/ # tar -zxvf FastDFS_v5.05.tar.gz # cd FastDFS
(3)編譯、 安裝(編譯前要確保已經成功安裝了 libfastcommon)
# ./make.sh # ./make.sh install
採用默認安裝的方式安裝,安裝後的相應文件與目錄:
A、 服務腳本在:
/etc/init.d/fdfs_storaged /etc/init.d/fdfs_tracker
B、 配置文件在(樣例配置文件)
/etc/fdfs/client.conf.sample /etc/fdfs/storage.conf.sample /etc/fdfs/tracker.conf.sample
C、 命令工具在/usr/bin/目錄下的
fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_crc32 fdfs_delete_file fdfs_download_file fdfs_file_info fdfs_monitor fdfs_storaged fdfs_test fdfs_test1 fdfs_trackerd fdfs_upload_appender fdfs_upload_file stop.sh restart.sh
(4)由於 FastDFS 服務腳本設置的 bin 目錄是/usr/local/bin, 但實際命令安裝在/usr/bin, 能夠進入/user/bin 目錄使用如下命令查看 fdfs 的相關命令:
# cd /usr/bin/ # ls | grep fdfs
所以須要修改 FastDFS 服務腳本中相應的命令路徑,也就是把/etc/init.d/fdfs_storaged和/etc/init.d/fdfs_trackerd 兩個腳本中的/usr/local/bin 修改爲/usr/bin:
# vi fdfs_trackerd
使用查找替換命令進統一修改:%s+/usr/local/bin+/usr/bin
# vi fdfs_storaged
使用查找替換命令進統一修改:%s+/usr/local/bin+/usr/bin
注:使用查找替換命令爲進入vi / vim編輯器,按下esc鍵,輸入冒號(:),再輸入%s+/usr/local/bin+/usr/bin便可把全部的/usr/local/bin修改成/usr/bin
複製 FastDFS 跟蹤器樣例配置文件,並重命名:
# cd /etc/fdfs/
# cp tracker.conf.sample tracker.conf
# vi /etc/fdfs/tracker.conf
修改的內容以下:
disabled=false port=22122 base_path=/fastdfs/tracker
(其它參數保留默認配置, 具體配置解釋請參考官方文檔說明:http://bbs.chinaunix.net/thread-1941456-1-1.html )
# mkdir -p /fastdfs/tracker
# vi /etc/sysconfig/iptables
添加以下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
重啓防火牆
# service iptables restart
# /etc/init.d/fdfs_trackerd start
(初次成功啓動,會在/fastdfs/tracker 目錄下建立 data、 logs 兩個目錄)
查看 FastDFS Tracker 是否已成功啓動。
# ps -ef | grep fdfs
# /etc/init.d/fdfs_trackerd stop
# vi /etc/rc.d/rc.local
添加如下內容
## FastDFS Tracker /etc/init.d/fdfs_trackerd start
複製 FastDFS 存儲器樣例配置文件,並重命名
# cd /etc/fdfs/
# cp storage.conf.sample storage.conf
# vi /etc/fdfs/storage.conf
修改的內容以下:
disabled=false port=23000 base_path=/fastdfs/storage store_path0=/fastdfs/storage tracker_server=192.168.50.131:22122 http.server_port=8888
(其它參數保留默認配置, 具體配置解釋請參考官方文檔說明:http://bbs.chinaunix.net/thread-1941456-1-1.html )
# mkdir -p /fastdfs/storage
# vi /etc/sysconfig/iptables
添加以下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
重啓防火牆:
# service iptables restart
# /etc/init.d/fdfs_storaged start
(初次成功啓動,會在/fastdfs/storage 目錄下建立 data、 logs 兩個目錄)
查看 FastDFS Storage 是否已成功啓動
# ps -ef | grep fdfs
# /etc/init.d/fdfs_storaged stop
# vi /etc/rc.d/rc.local
添加:
## FastDFS Storage /etc/init.d/fdfs_storaged start
# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf # vi /etc/fdfs/client.conf base_path=/fastdfs/tracker tracker_server=192.168.50.131:22122
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/FastDFS_v5.05.tar.gz
返回 ID 號: group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz(能返回以上文件 ID, 說明文件上傳成功)
FastDFS 經過 Tracker 服務器,將文件放在 Storage 服務器存儲, 可是同組存儲服務器之間須要進入文件複製, 有同步延遲的問題。假設 Tracker 服務器將文件上傳到了 192.168.50.132,上傳成功後文件 ID已經返回給客戶端。此時 FastDFS 存儲集羣機制會將這個文件同步到同組存儲 192.168.50.133,在文件尚未複製完成的狀況下,客戶端若是用這個文件 ID 在 192.168.50.133 上取文件,就會出現文件沒法訪問的錯誤。而 fastdfs-nginx-module 能夠重定向文件鏈接到源服務器取文件,避免客戶端因爲複製延遲致使的文件沒法訪問錯誤。(解壓後的 fastdfs-nginx-module 在 nginx 安裝時使用)
# cd /usr/local/src/ # tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
# cd fastdfs-nginx-module/src # vi config CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" 修改成: CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
(注意: 這個路徑修改是很重要的,否則在 nginx 編譯的時候會報錯的)
# yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
# cd /usr/local/src/ # tar -zxvf nginx-1.13.0.tar.gz # cd nginx-1.13.0 # ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src # make && make install
複製 fastdfs-nginx-module 源碼中的配置文件到/etc/fdfs 目錄, 並修改
# cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ # vi /etc/fdfs/mod_fastdfs.conf
修改如下配置:
connect_timeout=10 base_path=/tmp tracker_server=192.168.50.131:22122 storage_server_port=23000 group_name=group1 url_have_group_name = true store_path0=/fastdfs/storage
# cd /usr/local/src/FastDFS/conf # cp http.conf mime.types /etc/fdfs/
# ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
簡潔版 nginx 配置樣例:
user root; 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; location ~/group([0-9])/M00 { #alias /fastdfs/storage/data; 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 名,如/group1/M00/00/00/xxx,對應的 Nginx 配置爲:
location ~/group([0-9])/M00 { ngx_fastdfs_module; }
C、 如查下載時如發現老報 404, 將 nginx.conf 第一行 user nobody 修改成 user root 後從新啓動。
# vi /etc/sysconfig/iptables
添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
重啓防火牆
# service iptables restart
# /usr/local/nginx/sbin/nginx
啓動成功後會輸入:
ngx_http_fastdfs_set pid=xxx
(重啓 Nginx 的命令爲: /usr/local/nginx/sbin/nginx -s reload)
http://192.168.50.132:8888/group1/M00/00/00/wKgyhFkWubGAcwrWAAVFOL7FJU4.tar.gz
注意: 千萬不要使用 kill -9 命令強殺 FastDFS 進程,不然可能會致使 binlog 數據丟失。另外,你們能夠到連接http://download.csdn.net/detail/l1028386804/9841444下載FastDFS_v5.05_安裝包、工具包
好了,我們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一塊兒學習一塊兒進步!!
若是以爲文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習分佈式存儲技術。