什么是FastDFS
FastDFS 是用 c 語言編寫的一款開源的分布式文件系統(tǒng)组底。FastDFS 為互聯(lián)網(wǎng)量身定制, 充分考慮了冗余備份筐骇、負(fù)載均衡债鸡、線性擴(kuò)容等機(jī)制,并注重高可用铛纬、高性能等指標(biāo)厌均,使用 FastDFS 很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)告唆。
FastDFS 架構(gòu)包括 Tracker server 和 Storage server棺弊。客戶端請(qǐng)求 Tracker server 進(jìn)行文 件上傳擒悬、下載模她,通過 Tracker server 調(diào)度最終由 Storage server 完成文件上傳和下載。
Tracker server 作用是負(fù)載均衡和調(diào)度懂牧,通過 Tracker server 在文件上傳時(shí)可以根據(jù)一些 策略找到 Storage server 提供文件上傳服務(wù)侈净。可以將 tracker 稱為追蹤服務(wù)器或調(diào)度服務(wù) 器归苍。
Storage server 作用是文件存儲(chǔ)球昨,客戶端上傳的文件最終存儲(chǔ)在 Storage 服務(wù)器上滤钱, Storageserver 沒有實(shí)現(xiàn)自己的文件系統(tǒng)而是利用操作系統(tǒng) 的文件系統(tǒng)來管理文件∧ɑΓ可以將 storage 稱為存儲(chǔ)服務(wù)器摇展。
服務(wù)端兩個(gè)角色:
Tracker:管理集群吻氧,tracker 也可以實(shí)現(xiàn)集群。每個(gè) tracker 節(jié)點(diǎn)地位平等咏连。收集 Storage 集群的狀態(tài)盯孙。
Storage:實(shí)際保存文件 Storage 分為多個(gè)組,每個(gè)組之間保存的文件是不同的祟滴。每 個(gè)組內(nèi)部可以有多個(gè)成員振惰,組成員內(nèi)部保存的內(nèi)容是一樣的,組成員的地位是一致的垄懂,沒有 主從的概念骑晶。
文件上傳流程
客戶端上傳文件后存儲(chǔ)服務(wù)器將文件 ID 返回給客戶端痛垛,此文件 ID 用于以后訪問該文 件的索引信息。文件索引信息包括:組名桶蛔,虛擬磁盤路徑匙头,數(shù)據(jù)兩級(jí)目錄,文件名仔雷。
組名:文件上傳后所在的 storage 組名稱蹂析,在文件上傳成功后有 storage 服務(wù)器返回, 需要客戶端自行保存碟婆。
虛擬磁盤路徑:storage 配置的虛擬路徑电抚,與磁盤選項(xiàng) store_path*對(duì)應(yīng)。如果配置了 store_path0 則是 M00竖共,如果配置了 store_path1 則是 M01喻频,以此類推。
數(shù)據(jù)兩級(jí)目錄:storage 服務(wù)器在每個(gè)虛擬磁盤路徑下創(chuàng)建的兩級(jí)目錄肘迎,用于存儲(chǔ)數(shù)據(jù) 文件甥温。
文件名:與文件上傳時(shí)不同。是由存儲(chǔ)服務(wù)器根據(jù)特定信息生成妓布,文件名包含:源存儲(chǔ) 服務(wù)器 IP 地址姻蚓、文件創(chuàng)建時(shí)間戳、文件大小匣沼、隨機(jī)數(shù)和文件拓展名等信息狰挡。
文件下載流程
簡(jiǎn)易FastDFS架構(gòu)
FastDFS安裝
所需安裝包
fastdfs-master
fastdfs-nginx-module-master
fdfs_client-py-master
libfastcommon-master
nginx-1.14.2
下載地址https://gitee.com/sbigtree/package.git
安裝fastdfs依賴包
- 解壓縮libfastcommon-master.zip
- 進(jìn)入到libfastcommon-master的目錄中
- 執(zhí)行 ./make.sh
- 執(zhí)行 sudo ./make.sh install
安裝fastdfs
- 解壓縮fastdfs-master.zip
- 進(jìn)入到 fastdfs-master目錄中
- 執(zhí)行 ./make.sh
- 執(zhí)行 sudo ./make.sh install
配置跟蹤服務(wù)器tracker
/home/python/路徑中的python是你的家目錄
#1.
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
#2. 在/home/python/目錄中創(chuàng)建目錄 fastdfs/tracker
mkdir –p /home/python/fastdfs/tracker
#3. 編輯/etc/fdfs/tracker.conf配置文件
sudo vim /etc/fdfs/tracker.conf
#修改
base_path=/home/python/fastdfs/tracker
配置存儲(chǔ)服務(wù)器storage
#1.
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
#2. 在/home/python/fastdfs/ 目錄中創(chuàng)建目錄 storage
mkdir –p /home/python/fastdfs/storage
#3. 編輯/etc/fdfs/storage.conf配置文件
sudo vim /etc/fdfs/storage.conf
#修改內(nèi)容:
base_path=/home/python/fastdfs/storage
store_path0=/home/python/fastdfs/storage
tracker_server=8888
# ps: 這個(gè)8888端口, 是nginx幀聽的端口, 就是自己項(xiàng)目的那個(gè)端口
啟動(dòng)tracker 和 storage
sudo service fdfs_trackerd start
sudo service fdfs_storaged start
#沒有service這個(gè)命令的直接去bin里執(zhí)行
#查找fdfs_trackerd命令在哪
whereis fdfs_trackerd
輸出
fdfs_trackerd: /usr/bin/fdfs_trackerd /usr/local/bin/fdfs_trackerd
啟動(dòng)方法
Usage: /usr/local/bin/fdfs_trackerd <config_file> [start | stop | restart]
/usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
# fdfs_storaged 啟動(dòng)也是一樣
測(cè)試是否安裝成功
- sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
- 編輯/etc/fdfs/client.conf配置文件 sudo vim /etc/fdfs/client.conf
修改內(nèi)容:
base_path=/home/python/fastdfs/tracker
#ip必須是內(nèi)網(wǎng)的那個(gè)ip, 不是127.0.0.1, 類似192.x.x.x這種,
#我這個(gè)是公網(wǎng)服務(wù)器, 所以是172開頭的, 端口就用默認(rèn)的22122
tracker_server=172.16.0.122:22122
- 上傳文件測(cè)試
fdfs_upload_file /etc/fdfs/client.conf 要上傳的圖片文件
fdfs_upload_file /etc/fdfs/client.conf ~/xxx.jpg
如果返回類似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的文件id則說明文件上傳
安裝nginx及fastdfs-nginx-module
- 解壓縮 nginx-1.8.1.tar.gz
- 解壓縮 fastdfs-nginx-module-master.zip
- 進(jìn)入nginx-1.8.1目錄中
- 執(zhí)行
--with-http_ssl_module添加ssl模塊, 可以代理https
sudo ./configure --prefix=/usr/local/nginx/ --with-http_ssl_module --add-module=fastdfs-nginx-module-master解壓后的目錄的絕對(duì)路徑/src
sudo make
sudo make install
可能會(huì)報(bào)錯(cuò)
解決辦法
找到對(duì)應(yīng)的Maakefile文件,將gcc參數(shù)中的-Werror去掉释涛。
我上面顯示的是objs/Makefile文件加叁,我打開看了下,將第三行的-Werror去掉就可以
sudo cp fastdfs-nginx-module-master解壓后的目錄中src下的mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
sudo vim /etc/fdfs/mod_fastdfs.conf
#修改內(nèi)容:
connect_timeout=10 #超時(shí)10秒
tracker_server=公網(wǎng)ip:22122
url_have_group_name=true
store_path0=/home/python/fastdfs/storage
- sudo cp 解壓縮的fastdfs-master目錄中的http.conf /etc/fdfs/http.conf
- sudo cp 解壓縮的fastdfs-master目錄中的mime.types /etc/fdfs/mime.types
- sudo vim /usr/local/nginx/conf/nginx.conf
在http部分中添加配置信息如下:
server {
listen 8888;
server_name localhost;
location / {
root /www/ice_iyucc_com/;
index index.html index.htm;
}
# 經(jīng)測(cè)試, 這樣子不生效
#location ~/group[0-9]/ {
# ngx_fastdfs_module;
#}
#只能這樣使用
location /group1/M00 { # /group1/M00是文件存儲(chǔ)的路徑
# ngx_fastdfs_module;
alias /home/ubuntu/fastdfs/storage/data;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
啟動(dòng)nginx
sudo /usr/local/nginx/sbin/nginx
使用python客戶端上傳測(cè)試
進(jìn)入fdfs_client-py-master.zip所在目錄
pip install fdfs_client-py-master.zip
如果 安裝有其他fdfs包, 要先卸載完再安裝py3Fdfs
pip install py3Fdfs
from fdfs_client.client import *
client_conf_obj = get_tracker_conf('/etc/fdfs/client.conf')
client = Fdfs_client(client_conf_obj)
ret = client.upload_by_filename('test')
ret
{'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/
wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'
, 'Storage IP':'192.168.243.133'}
關(guān)于storege.conf配置文件
tracker_server = 填寫所在服務(wù)器的外網(wǎng)ip
安全組開放 配置文件里的23000端口