FastDFS 是用 c 語言編寫的一款開源的分佈式文件系統。FastDFS 爲互聯網量身定製, 充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用 FastDFS 很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。python
FastDFS 架構包括 Tracker server 和 Storage server。客戶端請求 Tracker server 進行文 件上傳、下載,經過 Tracker server 調度最終由 Storage server 完成文件上傳和下載。git
Tracker server 做用是負載均衡和調度,經過 Tracker server 在文件上傳時能夠根據一些 策略找到 Storage server 提供文件上傳服務。能夠將 tracker 稱爲追蹤服務器或調度服務器。github
Storage server 做用是文件存儲,客戶端上傳的文件最終存儲在 Storage 服務器上, Storageserver 沒有實現本身的文件系統而是利用操做系統 的文件系統來管理文件。能夠將 storage 稱爲存儲服務器。docker
利用docker安裝fastDFS數據庫
docker image pull delron/fastdfs
執行以下命令開啓tracker 服務
ocker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
執行以下命令查看tracker是否運行起來django
docker container ls
若是想中止tracker服務,能夠執行以下命令服務器
docker container stop tracker
中止後,從新運行tracker,能夠執行以下命令架構
docker container start tracker
執行以下命令開啓storage服務
docker run -dti --network=host --name storage -e TRACKER_SERVER=10.211.55.5:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
執行以下命令查看storage是否運行起來負載均衡
docker container ls
若是想中止storage服務,能夠執行以下命令分佈式
docker container stop storage
中止後,從新運行storage,能夠執行以下命令
docker container start storage、
python版本的FastDFS客戶端使用說明參考https://github.com/jefforeill...
使用FastDFS客戶端,須要有配置文件。
base_path=FastDFS客戶端存放日誌文件的目錄
tracker_server=運行tracker服務的機器ip:22122
上傳文件須要先建立fdfs_client.client.Fdfs_client的對象,並指明配置文件,如
from fdfs_client.client import Fdfs_client
client = Fdfs_client('fastdfs/client.conf')
經過建立的客戶端對象執行上傳文件的方法
client.upload_by_filename(文件名)
或
client.upload_by_buffer(文件bytes數據)
自定義Django文件存儲系統
Django自帶文件存儲系統,可是默認文件存儲在本地,咱們須要將文件保存到FastDFS服務器上。
自定義文件存儲系統的方法以下:
1)須要繼承自django.core.files.storage.Storage,如
from django.core.files.storage import Storage
class FastDFSStorage(Storage):
...
2)支持Django不帶任何參數來實例化存儲類,也就是說任何設置都應該從django.conf.settings中獲取
from django.conf import settings
from django.core.files.storage import Storage
class FastDFSStorage(Storage):
def __init__(self, base_url=None, client_conf=None): if base_url is None: base_url = settings.FDFS_URL self.base_url = base_url if client_conf is None: client_conf = settings.FDFS_CLIENT_CONF self.client_conf = client_conf
3)存儲類中必須實現_open()和_save()方法,以及任何後續使用中可能用到的其餘方法。
_open(name, mode='rb')
被Storage.open()調用,在打開文件時被使用。
_save(name, content)
被Storage.save()調用,name是傳入的文件名,content是Django接收到的文件內容,該方法須要將content文件內容保存。
Django會將該方法的返回值保存到數據庫中對應的文件字段,也就是說該方法應該返回要保存在數據庫中的文件名稱信息。
exists(name)
若是名爲name的文件在文件系統中存在,則返回True,不然返回False。
url(name)
返回文件的完整訪問URL
delete(name)
刪除name的文件
listdir(path)
列出指定路徑的內容
size(name)
返回name文件的總大小
注意,並非這些方法所有都要實現,能夠省略用不到的方法。
4)須要爲存儲類添加django.utils.deconstruct.deconstructible裝飾器
咱們在fastdfs目錄中建立fdfs_storage.py文件,實現可使用FastDFS存儲文件的存儲類以下
from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client
@deconstructible
class FastDFSStorage(Storage):
def __init__(self, base_url=None, client_conf=None): """ 初始化 :param base_url: 用於構造圖片完整路徑使用,圖片服務器的域名 :param client_conf: FastDFS客戶端配置文件的路徑 """ if base_url is None: base_url = settings.FDFS_URL self.base_url = base_url if client_conf is None: client_conf = settings.FDFS_CLIENT_CONF self.client_conf = client_conf def _save(self, name, content): """ 在FastDFS中保存文件 :param name: 傳入的文件名 :param content: 文件內容 :return: 保存到數據庫中的FastDFS的文件名 """ client = Fdfs_client(self.client_conf) ret = client.upload_by_buffer(content.read()) if ret.get("Status") != "Upload successed.": raise Exception("upload file failed") file_name = ret.get("Remote file_id") return file_name def url(self, name): """ 返回文件的完整URL路徑 :param name: 數據庫中保存的文件名 :return: 完整的URL """ return self.base_url + name def exists(self, name): """ 判斷文件是否存在,FastDFS能夠自行解決文件的重名問題 因此此處返回False,告訴Django上傳的都是新文件 :param name: 文件名 :return: False """ return False
在settings/dev.py文件中添加設置
DEFAULT_FILE_STORAGE = 'fastdfs.fdfs_storage.FastDFSStorage'
FDFS_URL = 'http://xxx:8888/'
FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'fastdfs/client.conf')
在/etc/hosts中添加訪問FastDFS storage服務器的域名
127.0.0.1 xxx