FastDFS
文章目錄
- FastDFS
-
-
- 什麼是FastDFS
- 使用FastDFS的好處
- 安裝
-
- 安裝fastdfs依賴包libfastcommon
- 安裝FastDFS
- 配置Tracker
- 配置Storage
- 配置client
- 啟動tracker 和 storage
- 測試是否安裝成功
- Nginx配合FastDFS
-
- 安裝fastdfs-nginx-module
- 安裝nginx
- 配置fastdfs-nginx-module子產品
- 配置Nginx
- Nginx啟動
- 測試是否安裝成功
-
- Django使用FastDFS
-
-
-
- 項目fdfs最終檔案目錄樹展示
- 1.建立utils包下,再建立storage.py檔案,這個檔案用來重寫Django的檔案存儲類
-
- FastDFS實作上傳資源排重
-
-
- 安裝
- 1.安裝hash資料庫FastDHT的依賴庫
- 2.安裝libevent
- 3.FastDHT安裝
- 4.配置FastDHT
- 5.啟動FastDHT
-
- 擴充:
-
-
什麼是FastDFS
簡單說下,FastDFS就是由tracker和storager組成的
tracker:用戶端先通路tracker,傳回可用的storager的IP和port,然後把檔案上傳到對應的storager,簡單來說就是起到配置設定,追蹤的作用,同時還會接收storager的狀态
storager:就是存儲檔案的地方,檔案上傳後就會傳回一個file_id,file_id可以代表檔案的位置,(是通過對檔案内容進行hash算法決定的,是以對于相同内容可以不用重複存儲,不過要配合FastDHT實作檔案去重存儲,最下面有講)

使用FastDFS的好處
- 海量存儲,存儲容量擴充友善(隻需直接添加Storage)
- 可結合nginx提高網站通路圖檔的效率
- 相同的檔案隻會出現一份
安裝
提示:安裝前要有gcc環境(一般都自帶)
安裝fastdfs依賴包libfastcommon
1.擷取,解壓安裝包
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz
解壓安裝包:tar -zxvf V1.0.38.tar.gz
- 編譯安裝
進入目錄:cd libfastcommon-1.0.38
執行編譯:./make.sh
安裝:sudo ./make.sh install
如果有問題,可能要安裝 gcc
安裝FastDFS
1.擷取,解壓安裝包
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
解壓安裝包:tar -zxvf V5.11.tar.gz
2.編譯安裝
進入目錄:cd fastdfs-5.11
執行編譯:./make.sh
安裝:./make.sh install
配置Tracker
1.配置檔案
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
2.在/home/python/目錄中建立存放tracker的目錄
mkdir –p /home/python/fastdfs/tracker
3.編輯/etc/fdfs/tracker.conf配置檔案
sudo vim /etc/fdfs/tracker.conf
修改:
# tracker存儲data和log的跟路徑,必須提前建立好
base_path=/home/python/fastdfs/tracker
# http端口,需要和nginx相同
http.server_port=8888
配置Storage
1.配置檔案
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/storage.conf
2.在/home/python/目錄中建立存放tracker的目錄
mkdir –p /home/python/fastdfs/storage
3.編輯/etc/fdfs/storage.conf配置檔案
sudo vim /etc/fdfs/storage.conf
修改:
# tracker存儲data和log的跟路徑,必須提前建立好
base_path=/home/python/fastdfs/storage
# 存儲路徑個數,需要和store_path個數比對
store_path_count=1
#如果為空,則使用base_path
store_path0=/home/python/fastdfs/storage
#配置該storage監聽的tracker的ip和port
tracker_server=自己的IP:22122
# http端口,需要和nginx相同
http.server_port=8888
配置client
1.client配置檔案
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
2.編輯/etc/fdfs/client.conf配置檔案
sudo vim /etc/fdfs/client.conf
修改内容:
base_path=/home/python/fastdfs/tracker
tracker_server=自己ubuntu虛拟機的ip位址:22122
啟動tracker 和 storage
# tracker啟動
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
# storage啟動
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
# 監控程序 (選)
/usr/bin/fdfs_monitor /etc/fdfs/client.conf
測試是否安裝成功
1.上傳檔案測試:
fdfs_upload_file /etc/fdfs/client.conf 要上傳的圖檔檔案
傳回類似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的檔案id則說明檔案上傳成功
Nginx配合FastDFS
安裝fastdfs-nginx-module
# 下載下傳fastdfs-nginx-module安裝包
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
解壓fastdfs-nginx-module:
tar -xvf V1.20.tar.gz
安裝nginx
1.安裝PCRE(2選1)
檢視是否安裝
rpm -qa pcre
直接指令安裝
apt-get update
apt-get install libpcre3 libpcre3-dev openssl libssl-dev libperl-dev
下載下傳安裝包安裝
cd /usr/local/src/
# 擷取安裝包
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
# 解壓
tar zxvf pcre-8.35.tar.gz
# 進入目錄
cd pcre-8.35
# 編譯安裝
./configure
make && make install
- 安裝nginx
# 擷取安裝包
wget http://nginx.org/download/nginx-1.6.2.tar.gz
# 安裝前配置,加載fastdfs-nginx-module子產品
sudo ./configure --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module-master解壓後的目錄的絕對路徑/src
# 編譯
make
# 安裝
make install
如果已經安裝了nginx,直接安裝fastdfs-nginx-module子產品
mv fastdfs-nginx-module /usr/local/webserver/nginx/
# nginx安裝包目錄下執行
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=fastdfs-nginx-module的絕對路徑/src
# 編譯
make
# 如果make錯誤
# 修改 fastdfs-nginx-module/src/config
ngx_addon_name=ngx_http_fastdfs_module
if test -n "${ngx_module_link}"; then
ngx_module_type=HTTP
ngx_module_name=$ngx_addon_name
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
ngx_module_libs="-lfastcommon -lfdfsclient"
ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
ngx_module_deps=
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
. auto/module
else
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
fi
配置fastdfs-nginx-module子產品
1.配置mod-fastdfs.conf,并拷貝到/etc/fdfs檔案目錄下
cd fastdfs-nginx-module-1.20/src/
cp mod_fastdfs.conf /etc/fdfs
2.進入/etc/fdfs修改mod-fastdfs.conf:
vim /etc/fdfs/mod_fastdfs.conf
修改:
connect_timeout=10
base_path=/home/python/fastdfs
tracker_server=10.122.149.211:22122 #tracker的ip位址
url_have_group_name=true #url是否包含group名稱
storage_server_port=23000 #需要和storage配置的相同
store_path_count=1 #存儲路徑個數,需要和store_path個數比對
store_path0=/home/python/fastdfs/storage #storage的位置
配置Nginx
vim /usr/local/nginx/conf/nginx.conf
在http部分中添加配置資訊如下:
server {
listen 8888;
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
意思是當通路IP:8888/group[0-9]/…,nginx就會調用ngx_fastdfs_module子產品,通過file_id,即:group…/…/ ,找到檔案并傳回
最後需要拷貝之前安裝FastDFS解壓目錄中的http.conf和mime.types:
cd /usr/local/src/fastdfs-5.11/conf
cp mime.types http.conf /etc/fdfs/
Nginx啟動
sudo /usr/local/nginx/sbin/nginx
如果nginx的報錯ERROR - file: …/storage/trunk_mgr/trunk_shared.c, line: 177, “Permission denied” can’t be accessed
在nginx.conf前面加上user root
![]()
搭建FastDFS+FastDHT完成去重存儲(含Django使用)FastDFSDjango使用FastDFS
測試是否安裝成功
1.啟動tracker、storage、nginx服務
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
sudo /usr/local/nginx/sbin/nginx
也可以用systemctl啟動
systemctl start fdfs_trackerd.service
systemctl start fdfs_storaged.service
systemctl start nginx.service
2.上傳檔案
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf <local_filename>檔案路徑
傳回:
類似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg
3.在浏覽器中通路
格式:nginx配置的IP:8888/傳回的檔案id
127.0.0.1:8888/group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg
4.删除檔案
/usr/bin/fdfs_delete_file /etc/fdfs/client.conf <file_id>
/usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg
再次通路就沒有了,傳回404頁面
Django使用FastDFS
項目fdfs最終檔案目錄樹展示
utils
└── fdfs
----- ├── client.conf
----- ├── init.py
----- └── storage.py
1.建立utils包下,再建立storage.py檔案,這個檔案用來重寫Django的檔案存儲類
storage.py下,FDFSStorage類繼承django自帶的檔案存儲類,重寫_open,_save, exists,url方法。
- open:打開檔案方法
- save :admin中儲存檔案時調用的方法,儲存檔案時,加上上傳檔案到FastDFS操作。
- exists:判斷這個檔案名是否存在,原來是防止覆寫的,用了fastFDS不會存在這個問題
- url:在調用url方法,傳回資料表中檔案的file_id,這裡加上nginx的ip,就等于直接通路圖檔了
from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client,get_tracker_conf
# 重寫Django内置的檔案存儲類
class FDFSStorage(Storage):
'''fast dfs檔案存儲類'''
def __init__(self, client_conf=None, base_url=None):
'''初始化'''
if client_conf is None:
# client_conf = settings.FDFS_CLIENT_CONF
client_conf = get_tracker_conf(settings.FDFS_CLIENT_CONF)
self.client_conf = client_conf
if base_url is None:
base_url = settings.FDFS_URL
self.base_url = base_url
def _open(self, name, mode='rb'):
'''打開檔案時使用'''
pass
def _save(self, name, content):
'''儲存檔案時使用'''
# name:你選擇上傳檔案的名字 test.jpg
# content:包含你上傳檔案内容的File對象
# 建立一個Fdfs_client對象
client = Fdfs_client(self.client_conf)
# 取字尾
str = name.split(".")
file_ext_name = str[-1]
# 上傳檔案到fast dfs系統中
res = client.upload_by_buffer(content.read(), file_ext_name)
# 傳回一個字典
# dict
# {
# 'Group name': group_name,
# 'Remote file_id': remote_file_id,
# 'Status': 'Upload successed.',
# 'Local file name': '',
# 'Uploaded size': upload_size,
# 'Storage IP': storage_ip
# }
if res.get('Status') != 'Upload successed.':
# 上傳失敗
raise Exception('上傳檔案到fast dfs失敗')
# 擷取傳回的檔案ID
filename = res.get('Remote file_id')
print(filename)
return filename.decode()
# 1.jpg
def exists(self, name):
'''Django判斷檔案名是否可用'''
return False
def url(self, name):
'''傳回通路檔案的url路徑'''
return self.base_url + name
2.把的之前下載下傳FastDFS檔案夾下配置的client.py檔案複制到fdfs目錄下
修改:
- tracker_server = trackerip:22122
- base_path = /home/python/fastdfs/ 這個放到fastdfs檔案夾下
cp /etc/fdfs/client.conf 項目檔案夾/utils/
3.配置項目檔案夾setting.py
# 設定Django的檔案存儲類
DEFAULT_FILE_STORAGE='utils.fdfs.storage.FDFSStorage'
# 設定fdfs使用的client.conf檔案路徑
FDFS_CLIENT_CONF='./utils/fdfs/client.conf'
# 設定fdfs存儲伺服器上nginx的IP和端口号
FDFS_URL='http://192.168.40.131:8888/'
FastDFS實作上傳資源排重
FastDFS本身支援檔案的排重處理機制,就是同樣的檔案隻存儲一份。但需要FastDHT作為檔案hash的索引存儲。
排重原理上面已經講了,這裡再細緻一下:
FastDFS的storager每次均計算上傳檔案的hash值,然後從FastDHT伺服器上進行查找比對,如果沒有傳回,說明不存在相同内容的檔案,則寫入hash,并将檔案内容儲存,傳回file_id。
如果有傳回,則建立一個新的檔案連結,對已有檔案進行軟連結,不儲存檔案,傳回該file_id。
安裝
注意:
我安裝環境是Ubuntu 16.04 ,可能有些目錄或者指令的改變,下面也會有說
1.安裝hash資料庫FastDHT的依賴庫
官網:http://www.oracle.com/technology/software/products/berkeley-db/index.html
github官網下載下傳: https://github.com/berkeleydb/libdb/
# berkeleydb 4.7.25以上
tar zxf libdb-master
cd libdb-master/build-unix
# 選擇安裝目錄
sudo mkdir /usr/local/berkeleydb5.3.21
../dist/configure --prefix=/usr/local/berkeleydb5.3.21
# 編譯安裝
make && make install
2.安裝libevent
sudo apt-get update
apt-get install libevent libvent-devel
3.FastDHT安裝
github官網下載下傳: https://github.com/happyfish100/fastdht/
tar xzf fastdht-master.zip
cd fastdht-master
# 關聯剛剛下載下傳的依賴庫(如果是pip下載下傳的不需要)
# ubuntu16.04 中沒有chkconfig指令,systemctl代替chkconfig
# 沒有這個目錄/etc/rc.d/init.d,改為 /etc/init.d/
vim make.sh
修改:
27 CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/local/berkeleydb5.3.21/include/ -L/usr/local/berkeleydb5.3.21/lib/'
....
137 cp -f init.d/fdhtd /etc/init.d/
138 /bin/systemctl load fdhtd
# 編譯安裝
./make.sh && ./make.sh install
可能會出現一個錯誤,docs安裝不成功,如果是這個可以不管,應該是些文檔
4.配置FastDHT
注意:第三步安裝完後/etc/fdht/檔案夾下有3個conf檔案,如果沒有就到上面安裝包的conf檔案中複制到/etc/fdht/目錄下
fdhtd.conf
fdht_servers.conf
fdht_client.conf
1. 建立檔案夾/fastdht
mkdir home/python/fastdfs/fastdht
2. 修改fdhtd.conf檔案
vim /etc/fdht/fdhtd.conf
base_path=home/python/fastdfs/fastdht(第一步建立的檔案夾)
3. 修改fdht_servers.conf檔案
# 一般配置2台,防止單點
group_count = 1
group0 = fastdht所在主機ip1:11411
group0 = fastdht所在主機ip2:11411
4. 修改fdht_client.conf檔案
vim /etc/fdht/fdht_client.conf
keep_alive=1
base_path= home/python/fastdfs/fastdht(第一步建立的檔案夾)
5.複制一份/etc/fdht/fdht_servers.conf到/etc/fdfs/
cp /etc/fdht/fdht_servers.conf /etc/fdfs/
6.修改之前的etc/fdfs/storage.conf檔案
# 檢測檔案是否重複
check_file_duplicate=1
# 命名空間FastDFS
key_namespace=FastDFS
# 長連接配接配置
keep_alive=1
# 導入之前/etc/fdht/fdht_servers.conf
#include /etc/fdfs/fdht_servers.conf
配置檔案:
5.啟動FastDHT
1、啟動指令:
sudo fdhtd /etc/fdht/fdhtd.conf
2、重新開機storager
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
或者:
systemctl start fdfs_storaged.service
3、測試是否成功
# 用下面指令上傳同一個檔案2次
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf <file>
# 進入storager目錄下
cd fastdfs/storage/data/00/00
# 使用ls -al指令
wKgog16Jt22AJj8PAAAgnQSk244394.jpg -> /home/liang/work/Django/fastdfs/storage/data/00/00/wKgog16Jt26AfQG2AAAgnaeGwNQ726.jpg
有個箭頭指向一個檔案,代表軟連結成功
如果還有問題,也可以自己看看安裝包裡的INSTALL檔案
可以設定開機自啟:
# 把啟動指令加到這個配置檔案下
vim /etc/rc.local
....
/usr/local/bin/fdhtd /etc/fdht/fdhtd.conf
#加上執行權限
chmod +x /etc/rc.local
擴充:
FastDFS合并存儲原理分析: 就是幾個小檔案存儲成一個大檔案
https://blog.csdn.net/hfty290/article/details/42026215