fastdfs分佈式文件系統部署

前言

傳統web站點部署大部分都是基於動靜分離的方式,靜態圖片存放於一臺nfs存儲。可是這種架構有一個問題就是nfs存儲是單點,並且若是圖片量過大的時候,則nfs會成爲性能短板。基於此能夠採用分佈式存儲的替代方案來替代nfs。
fastdfs不但能夠存儲圖片,還能夠存儲其餘非結構化數據,其特性是能夠存放海量的中小容量文件,並且性能和容量也不會成爲瓶頸。前端

fastdfs架構

fastdfs基於以下兩個組件組成:nginx

  • tracker節點:存儲數據的元數據節點,此節點存放的是全部數據的元數據,如數據路徑,保存時間等信息。其信息是storage節點定時上傳到tracker節點的。
  • storage節點:用於存放數據,storage節點的特色是兩個或多個節點爲一組構成一個集羣,相似於鏡像集羣,數據只存放於兩臺上任意一臺,而另外一臺則自動從另外一臺同步數據,保證數據爲雙份或多份。
    架構圖:

fastdfs訪問步驟


上傳文件步驟git

  1. 客戶端上傳文件請求,請求到到tracker節點;
  2. tracker節點基於內部算法選擇合適的storage節點發送給客戶端;
  3. 客戶端訪問指定的storage節點,而後保存到指定storage上;
    訪問文件步驟
  4. 客戶端發起請求到tracker節點;
  5. tracker節點基於請求文件路徑能夠得出文件存放在哪一個storage節點上,由於請求文件名是包含路由信息的;
  6. tracker節點返回storage節點信息給client,client訪問storage節點拿到數據;

實驗配置

此處採用4臺服務器進行配置,一臺既爲tracker節點,也爲storage節點,其他3臺都爲storage節點。
github

下載源碼包製做成rpm包
安裝的話能夠經過編譯安裝,不過此處由於要安裝4臺服務器,因此我從github克隆下來源碼製做成源碼包進行分發安裝,提升效率。web

  1. github克隆源碼包,由於fastdfs依賴於libevent,因此須要首先安裝libevent。
git clone https://github.com/happyfish100/libfastcommon.git
git clone https://github.com/happyfish100/fastdfs.git
  1. 修改下載先來的源碼包目錄名,加上版本號,版本號能夠從目錄內的spec文件內查看到,而且製做成.tar.gz格式的包
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/*
  1. 安裝development tools編譯包,而後建立rpmbuild目錄,並把相應tar.gz包和spec文件拷貝到相應目錄進行rpm包製做
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/
  1. 進入/root/rpmbuild/SPECS/目錄,進行rpm包製做
rpmbuild -bb libfastcommon.spec
rpmbuild -bb fastdfs.spec
  1. 製做完成以後會在rpmbuild目錄下生成一些目錄,以下:

    其中RPMS目錄爲製做好的源碼包
    算法

  2. 先安裝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

  1. 四臺服務器都須要配置storage節點,修改/etc/fdfs/storage.conf文件
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    #數據上傳優先級#
  1. 配置完成啓動服務,tracker服務器須要啓動兩個服務,storage服務器只須要啓動storage服務:
service fdfs_storaged start
service fdfs_trackerd start
  1. storage服務器啓動以後會在指定存儲目錄建立多級文件夾,上傳的數據就是根據文件名hash值選擇相應文件夾進行存放的,以下:

上傳文件進行測試分佈式

  1. 上傳文件須要配置一個節點爲client節點,此處配置tracker節點也爲client節點,修改/etc/fdfs/client.conf配置文件,只需修改以下兩項便可:
base_path=/data/fastdfs    #client日誌存儲路徑#
tracker_server=192.168.11.200:22122    #tracker節點ip和端口#
  1. 上傳文件,下圖表示上傳成功,並顯示上傳以後的文件名:
  2. 能夠經過fdfs_file_info命令查看文件存儲在哪裏,下圖表示存儲在ip爲203的節點上:
  3. 由於203和204服務器互爲鏡像,因此204節點此時在相同的目錄下也會存在此文件。

編譯安裝nginx,經過http發佈文件

  1. 在文件存在相應服務器編譯安裝nginx,須要給nginx打上fastdfs-nginx-module的補丁;
  2. 下載fastdfs-nginx-module,從https://github.com/happyfish100/fastdfs-nginx-module.git經過git clone便可克隆下來;
  3. 下載nginx源碼包進行編譯
./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/
  1. 在/usr/lib/systemd/system/路徑下建立nginx.service文件
[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
  1. 把fastdfs-nginx-module中的mod_fastdfs.conf拷貝到/etc/fdfs/路徑下,並修改配置
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日誌文件路徑#
  1. 編輯/etc/nginx/nginx.conf文件,添加以下內容
location /M00 {
            alias /data/storage/data;
            ngx_fastdfs_module;
}
  1. 啓動nginx,而後訪問指定文件,如group2/M00/00/00/wKgLy1ltrLCAZ4TOAA6q2wjnW8s371.jpg文件,能夠看到訪問成功。

總結

如今文件只是可以分佈式上傳到不一樣的服務器節點了,可是若是要訪問的話還須要在本地安裝nginx,不過nginx須要打fastdfs-nginx-module補丁才能使用。編譯成功以後本地配置nginx的反向代理到指定的工做目錄便可經過nginx訪問到指定資源。不過生產環境中fastdfs中文件的上傳下載都是經過前端的程序來自動寫入和請求的。

相關文章
相關標籤/搜索