傳統web站點部署大部分都是基於動靜分離的方式,靜態圖片存放於一臺nfs存儲。可是這種架構有一個問題就是nfs存儲是單點,並且若是圖片量過大的時候,則nfs會成爲性能短板。基於此能夠採用分佈式存儲的替代方案來替代nfs。
fastdfs不但能夠存儲圖片,還能夠存儲其餘非結構化數據,其特性是能夠存放海量的中小容量文件,並且性能和容量也不會成爲瓶頸。前端
fastdfs基於以下兩個組件組成:nginx
上傳文件步驟git
此處採用4臺服務器進行配置,一臺既爲tracker節點,也爲storage節點,其他3臺都爲storage節點。
github
下載源碼包製做成rpm包
安裝的話能夠經過編譯安裝,不過此處由於要安裝4臺服務器,因此我從github克隆下來源碼製做成源碼包進行分發安裝,提升效率。web
git clone https://github.com/happyfish100/libfastcommon.git git clone https://github.com/happyfish100/fastdfs.git
mv libfastcommon libfastcommon-1.0.36 tar zcf libfastcommon libfastcommon-1.0.36.tar.gz libfastcommon libfastcommon-1.0.36/* mv fastdfs fastdfs fastdfs fastdfs-5.0.11 tar zcf fastdfs-5.0.11.tar.gz fastdfs-5.0.11/*
mkdir /root/rpmbuild/{SOURCES,SPECS} mv libfastcommon libfastcommon-1.0.36.tar.gz /root/rpmbuild/SOURCES/ mv /root/libfastcommon-1.0.36/libfastcommon.spec /root/rpmbuild/SPECS/ mv fastdfs-5.0.11.tar.gz /root/rpmbuild/SOURCES/ mv /root/fastdfs-5.0.11/fastdfs.spec /rpm/rpmbuild/SPECS/
rpmbuild -bb libfastcommon.spec rpmbuild -bb fastdfs.spec
製做完成以後會在rpmbuild目錄下生成一些目錄,以下:
其中RPMS目錄爲製做好的源碼包
算法
先安裝libfastcommon,由於fastdfs依賴它,而後再安裝fastdfs便可,而後拷貝到其餘服務器進行安裝。服務器
配置tracker節點
安裝完成以後會在/etc目錄下生成fdfs目錄,其中文件以下,其中爲各類配置文件:
配置tracker.conf架構
base_path=/data/fastdfs #修改工做路徑爲本身建立路徑 port=22122 #監聽端口爲221222端口# # the method of selecting group to upload files #指定文件上傳方式時上傳到哪一個組# # 0: round robin #輪詢選擇# # 1: specify group #指定組# # 2: load balance, select the max free space group to upload file #根據負載,哪一個組剩餘空間最大上傳到哪一個組# store_lookup=2 # which group to upload file #若是指定組,此處指定上傳到哪一個組# # when store_lookup set to 1, must set store_group to the group name store_group=group2 # which storage server to upload file #上傳到組內哪一個服務器# # 0: round robin (default) #輪詢# # 1: the first server order by ip address #ip小的服務器# # 2: the first server order by priority (the minimal) #根據服務器優先級# # Note: if use_trunk_file set to true, must set store_server to 1 or 2 store_server=0 # which path(means disk or mount point) of the storage server to upload file #上傳到服務器哪一個硬盤# # 0: round robin #輪詢# # 2: load balance, select the max free space path to upload file #根據剩餘空間# store_path=0 # which storage server to download file #從組內哪一個服務器請求數據# # 0: round robin (default) #輪詢# # 1: the source storage server which the current file uploaded to #最開始上傳到哪一個服務器# download_server=0
其餘參數無需過多修改。
配置storage節點app
group_name=group1 #指定組名,此處四臺服務器,兩臺爲group1,兩臺爲group2,組成鏡像組# port=23000 #指定工做端口# store_path_count=1 #指定數據存儲路徑,若是有多個則按照實際數量寫,此處只有一個,則寫1# store_path0=/data/storage #數據存儲路徑# tracker_server=192.168.11.200:22122 #tracker節點ip和端口# upload_priority=10 #數據上傳優先級#
service fdfs_storaged start service fdfs_trackerd start
上傳文件進行測試分佈式
base_path=/data/fastdfs #client日誌存儲路徑# tracker_server=192.168.11.200:22122 #tracker節點ip和端口#
./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --with-debug --add-module=../fastdfs-nginx-module/src/
[Unit] Description=nginx server after=network.target remote-fs.target nss-lookup.target [service] type=forking pidfile=/run/nginx.pid execstartpre=/usr/bin/rm -rf /run/nginx.pid execstartpre=/usr/sbin/nginx -t execstart=/usr/bin/nginx execreload=/bin/kill -s HUP $MAINPID killsignal=SIGQUIT timeoutstopsec=5 killmode=process privatetmp=true [install] wantedby=multi-user.target
base_path=/data/fastdfs #指定工做目錄# tracker_server=192.168.11.200:22122 #指定tracker的ip地址# group_name=group2 #指定當前服務器所屬組# url_have_group_name = false #此項若是爲true,則訪問文件須要在前面添加group信息,不然直接寫M00便可# store_path0=/data/storage #指定存儲路徑# log_filename=/data/fastdfs/logs/mod_fastdfs.log #指定log日誌文件路徑#
location /M00 { alias /data/storage/data; ngx_fastdfs_module; }
如今文件只是可以分佈式上傳到不一樣的服務器節點了,可是若是要訪問的話還須要在本地安裝nginx,不過nginx須要打fastdfs-nginx-module補丁才能使用。編譯成功以後本地配置nginx的反向代理到指定的工做目錄便可經過nginx訪問到指定資源。不過生產環境中fastdfs中文件的上傳下載都是經過前端的程序來自動寫入和請求的。