简介
FastDFS是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用C语言开发,由阿里巴巴开发,并应用的淘宝等APP。
FastDFS对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载、文件删除)等,解决了大容量文件存储的问题,特别适合以文件为载体的在线服务,如相册网站、文档网站、图片网站、视频网站等等。
FastDFS充分考虑了冗余备份、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
结构
FastDFS文件系统由两大部分构成,一个是客户端,一个是服务端。
客户端通常指我们的程序,比如我们的Java程序去连接FastDFS、操作FastDFS,那我们的Java程序就是一个客户端,FastDFS提供专有API访问,目前提供了C、Java和PHP几种编程语言的API,用来访问FastDFS文件系统。
服务端由两个部分构成:一个是跟踪器(tracker),一个是存储节点(storage)。
跟踪器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽。因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。
存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等。
如何部署Fastdfs
- 常规部署
常规部署需要将Fastdfs安装在服务器上进行配置,如果是集群则比较麻烦
- Docker部署
Docker只需要几条命令就可以实现部署,本文主要使用这种方式
Docker部署Fastdfs
请确保你的服务器安装了Docker
- 下载镜像
docker pull delron/fastdfs
- 构建tracker容器(跟踪服务器)
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs youkou1/fastdfs tracker
- 构建storage容器(存储服务)
docker run -dti --network=host --name storage -e TRACKER_SERVER=IP地址:22122 -v /var/fdfs/storage:/var/fdfs youkou1/fastdfs storage
- 修改storage容器的端口,非必要
docker exec -it 容器id /bin/bash
cd /etc/fdfs/
vi storage.conf
- 修改完以后退出容器
# 查看已经启动的容器
docker container ls
# 启动或者停止tracker
docker container start/stop tracker
# 启动或者停止storage
docker container start/stop storage
- 请一定要开放8888和22122端口
如何在Django中使用Fastdfs
- 这里说一下,为什么网上有很多教程我还要总结?
网上很多成功使用的案例并不适合所有人,有很多是因为环境不同的原因导致出错。
- 我的环境
python 3.9
django 4.0.6
Centos 7.6
docker 20.10.17
py3Fdfs 2.2.0
- 安装py3Fdfs
pip install py3Fdfs
- 在django项目的settings文件中写入配置信息
fastDFS_conf = {
'host_tuple': ['192.168.1.1'],
'connect_timeout': 30,
'network_timeout': 60,
'timeout': 30,
'tracker_server': '192.168.1.1:22122',
'name': 'Tracker Pool',
'port': 22122,
}
- 在需要上传文件的地方加入如下代码
from xxx.settings import fastDFS_conf
from fdfs_client.client import Fdfs_client
# 加载配置文件
client = Fdfs_client(fastDFS_conf)
# 上传文件
rets = client.upload_by_filename(files_path)
'''
上传成功后的返回值
{
'Group name': b'group1',
'Remote file_id': b'group1/M00/00/00/rBEp7mLM01eAM3j5AAyom-DZDaM495.jpg',
'Status': 'Upload successed.',
'Local file name': 'C:\\下载\\aaa.jpg',
'Uploaded size': '810.15KB',
'Storage IP': b'192.168.1.1'
}
'''
# 拿到文件的url地址
if 'successed' in rets['Status']:
img_url = config['img_url'] + rets['Remote file_id'].decode()
print(img_url)