为什么要用fastdfs
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务
服务端两个角色:
Tracker:管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
Storage:实际保存文件 Storage 分为多个组,每个组之间保存的文件是不同的。每 个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有 主从的概念。
简易FastDFS架构
服务端配合nginx百度上一大堆
nginx配置
./configure --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module-master解压后的目录的绝对路径/src
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;
}
}
客户端安装
进入fdfs_client-py-master.zip所在目录
pip install fdfs_client-py-master.zip
pip install安装request和mutagen
记住client.conf的绝对路径
测试
>>> from fdfs_client.client import Fdfs_client
>>> client = Fdfs_client('client.conf的绝对路径')
>>> ret = client.upload_by_filename('你要上传的文件')
>>> 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'}
django配置fastdfs
新建py文件 可直接cp拿去用 然后改配置文件settings
#设置fdfs使用的client.conf
FDFS_CLIENT_CONF='/etc/fdfs/client.conf' #client.conf的绝对路径
#是指fdfs的nginx的url
FDFS_URL='http://192.168.4.3:8888/' #你的nginx端口url
下面代码直接cp就可以用
---------------------------------------------------------------------------------------------------------
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings
class FDFSSorge(Storage):
"""文件存储类"""
#设置初始化方法,利用django配置文件将方法写活
def __init__(self,client_config=None,base_url=None):
if client_config is None:
client_config=settings.FDFS_CLIENT_CONF
self.client_config=client_config
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:上传文件名字
#content:包含文件上传
client=Fdfs_client(self.client_config)
#上传文件返回一个字典
# 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
# }
res=client.upload_by_buffer(content.read())
if res.get('Status') != 'Upload successed.':
raise Exception('上传文件失败')
file_id=res.get('Remote file_id')
return file_id
def exists(self, name):
return False
def url(self, name):
"""返回访问文件url访问路径"""
return self.base_url+name
------------------------------------------------------------------------------------------------------------------------------------