一、FastDFS架構
FastDFS
包括Tracker server
和Storage server
, 客戶端請求Tracker server
進行文件上傳、下載,通過Tracker server
調度最終由Storage server
完成文件上傳和下載。 Tracker server
的角色類似於dubbo
的registry
和moniter
、並不直接提供服務、而是storage server
啟動時注冊到tracker server
, client
通過tracker server
連接storage server
, client
不知道自己連接的是哪一台storage server
, 連接完成后、上傳和下載是client
直接請求storage server
, 可類比於 dubbo consumer
通過registry
連接dubbo service
但、連接完成之后是consumer
和service
直接通信

文件上傳流程

文件下載流程

1.Tracker Server
Tracker server
作用是負載均衡和調度,通過Tracker server
在文件上傳時可以根據一些策略找到Storage server
提供文件上傳服務,可以將tracker稱為追蹤服務器或調度服務器
1.Storage Server
Storage server
作用是文件存儲,客戶端上傳的文件最終存儲在Storage
服務器上,Storage server
沒有實現自己的文件系統而是利用操作系統的文件系統來管理文件。可以將storage
稱為存儲服務器。
二、FastDFS安裝
1.安裝libfastcommon(tracker和storage兩台服務器都執行)
1. 下載: wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz 2. 修改名字:mv V1.0.7 libfastcommon-1.0.7.tar.gz 3. 解壓:tar zxvf libfastcommon-1.0.7.tar.gz 4. cd libfastcommon-1.0.7/ 5. 編譯:./make.sh 6. 安裝:./make.sh install 另外: 設置幾個軟鏈接、方便后續擴展nginx時使用: 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
2. 安裝 tracker和storage(tracker和storage兩台服務器都執行)
1. 下載: wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz 2. 修改名字:mv V5.05 FastDFS_v5.05.tar.gz 3. 解壓:tar zxvf FastDFS_v5.05.tar.gz 4. 進入解壓后目錄:cd fastdfs-5.05/ 5. 編譯:./make.sh 6. 安裝:./make.sh install
3. 修改tracker配置文件(tracker服務器執行)
2安裝完成后、在/etd/fdfs下有tracker的配置文件 復制一份:cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf mkdir -p /usr/local/fastdfs/tracker (此處可以根據自己的情況和習慣存放) base_path= /usr/local/fastdfs/tracker 啟動 tracker 服務:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf 重啟 tracker 服務:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart 查看是否有 tracker 進程:ps aux | grep tracker
4. storage(存儲節點)服務部署(storage服務器執行)
一般 storage 服務我們會單獨部署到一台服務器上,但是這里為了方便(~~我只有一台服務器~~)就安裝在同一台上了 如果單獨部署到一台服務器上、上邊tracker的部署步驟重新來一遍即可(第三步不用執行) 這里是同一台server、只修改配置~~ 復制一份配置:cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf 編輯:vim /etc/fdfs/storage.conf base_path= /usr/local/fastdfs/ 創建目錄:mkdir /usr/local/fastdfs/storage/images-data store_path0= /usr/local/fastdfs/storage/images-data 圖片實際存放路徑,如果有多個,這里可以有多行(要創建多個目錄): store_path0=/opt/fastdfs/storage/images-data0 store_path1=/opt/fastdfs/storage/images-data1 subdir_count_per_path=256 是用來配置目錄個數的、如果只是練習不做實際存儲服務、可改小一點兒 指定 tracker 服務器的 IP 和端口 tracker_server=192.168.1.114:22122 (192.168.1.114)是你的server服務器ip、本機也可以使用(0.0.0.0:22122)、記得不可使用127.0.0.1
5. 測試服務(storage服務器執行)
啟動 storage 服務:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf,首次啟動會很慢,因為它在創建預設存儲文件的目錄 重啟 storage 服務:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart 查看是否有 storage 進程:ps aux | grep storage
6. 查看tracker
是否可以正常與storage
通信(storage服務器執行)
fdfs_monitor /etc/fdfs/storage.conf ... Storage 1: id = 192.168.2.231 ip_addr = 192.168.2.231 ACTIVE --若看到ACTIVE這個字樣、代表可以正常通信 ... 查看storage和tracker是否正常啟動: ps aux | grep fdfs
7. 使用fdfs_client測試(tracker服務器執行)
復制一份配置:cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 編輯:vim /etc/fdfs/client.conf base_path= /usr/local/fastdfs/ 指定 tracker 服務器的 IP 和端口 tracker_server=192.168.1.114:22122 log_level=info echo asasasa > ~/test.txt 測試:fdfs_test /etc/fdfs/client.conf upload ~/test.txt 可以看到如下圖所示、就是上傳成功了
8. 安裝Nginx和其插件(storage服務器執行)
如果Nginx已經安裝過,則僅需要fastdfs-nginx-module_v1.16.tar.gz 下載nginx:wget http://nginx.org/download/nginx-1.11.8.tar.gz 下載Nginx插件:wget http://jaist.dl.sourceforge.NET/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz 解壓 Nginx 模塊:tar zxvf fastdfs-nginx-module_v1.16.tar.gz 進入解壓后的目錄 cd fastdfs-nginx-module vim src/config 修改:去掉local、因為實際安裝fastdfs時、是放到了/usr/include下 1. CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" -> CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/" 2. CORE_LIBS="$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient" -> CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient" 回到nginx的解壓目錄 cd ../nginx-1.11.8
./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/local/fastdfs-nginx-module/src
make && make install
9. 整合fastdfs-nginx-module和nginx(storage服務器執行)
copy fastdfs-nginx-module的配置文件到 /etc/fdfs下、方便查找 cp /home/nj/build/fastdfs-nginx-module/src/mod_fdfs.conf /etc/fdfs vi /etc/fdfs/mod_fdfs.conf base_path=/usr/local/fastdfs tracker_server=192.168.1.114:22122 url_have_group_name = true store_path0=/usr/local/fastdfs/storage
10. 然后配置Nginx,添加如下內容(storage服務器執行)
vim /usr/local/nginx/conf/nginx.conf
如下
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid /usr/local/nginx/logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name 192.xxx.xxx.xxx.xxx; #storage服務器的ip location ~/group[0-9]/ { root /usr/local/fastdfs/storage; ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
用瀏覽器訪問剛才步驟7中測試上傳的文件:
http://xxxx/group1/M00/00/00/fwAAAVu0UTSAZiNHAAAACE6c2W4921_big.txt