天天看點

搭建FastDFS+FastDHT完成去重存儲(含Django使用)FastDFSDjango使用FastDFS

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+FastDHT完成去重存儲(含Django使用)FastDFSDjango使用FastDFS
搭建FastDFS+FastDHT完成去重存儲(含Django使用)FastDFSDjango使用FastDFS

使用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
           
  1. 編譯安裝
進入目錄: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
           
  1. 安裝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

搭建FastDFS+FastDHT完成去重存儲(含Django使用)FastDFSDjango使用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
           

配置檔案:

搭建FastDFS+FastDHT完成去重存儲(含Django使用)FastDFSDjango使用FastDFS

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