什么是FastDFS
FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括两个部分:
Tracker server:作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些 策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。
Storage server:作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,客户端上传的文件最终存储在 Storage 服务器上, Storageserver 没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将 storage 称为存储服务器。
文件上传流程
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文 件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
文件ID就像这样:group1/M00/00/00/wKjKh1uGr16AWpRfAAC20R6ytQc507.jpg
- 组名:文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返回, 需要客户端自行保存。
- 虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项 store_path*对应。如果配置了 store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。
- 数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据 文件。
- 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储 服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
使用Docker安装FastDFS
1.安装
可以直接下载这个FDFS的镜像备份文件
FDFS的镜像链接: https://pan.baidu.com/s/1N3GWvujrYo0Yqhi4xhw5TQ 密码: 1yjg
下载好了之后,使用 docker 来加载,前提是你的系统里装了docker
1 | docker load -i 文件路径/fastdfs_docker.tar |
或者直接拉国外的镜像
1 | docker image pull delron/fastdfs |
2.运行tracker
执行如下命令开启tracker 服务
1 | 这里是将fastDFS tracker运行目录映射到本机的 /var/fdfs/tracker目录中。 |
3.运行storage
执行如下命令开启storage服务
1 | docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.202.135:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage |
- TRACKER_SERVER=本机的ip地址:22122 ,需要更改为你的ip地址。本机ip地址不要使用127.0.0.1
注意:如果无法重新运行,可以删除/var/fdfs/storage/data目录下的fdfs_storaged.pid 文件,然后重新运行storage。
使用 FastDFS 的 Python 客户端
python版本的FastDFS客户端使用说明参考https://github.com/jefforeilly/fdfs_client-py
1.安装python版本的客户端
1 | pip install fdfs_client-py-master.zip |
fdfs_client-py-master 也可以下载下面这个来安装
链接: https://pan.baidu.com/s/15NbswzD9H8EzCBXUgRYQ2Q 密码: 9w5u
2.修改客户端的配置
配置文件client.conf: 链接: https://pan.baidu.com/s/1AcR5vrJ2eudXsfSFbE28GQ 密码: 4sjc
1 | base_path=FastDFS客户端存放日志文件的目录 |
3.使用
1 | from fdfs_client.client import Fdfs_client |
上传到storage后返回的结果如下例子:
1 | { |
Django项目使用FDFS来自定义文件存储系统
Django自带文件存储系统,使用的类:FileSystemStorage ,继承至django.core.files.storage.Storage
但是默认文件存储在本地,在本项目中,我们需要将文件保存到FastDFS服务器上,所以需要自定义文件存储系统,同样需要继承至 Storage 类, 并重写有用到的相关方法,其他方法可以看一下源代码
自定义FDFS存储类
1 | from django.core.files.storage import Storage |
在Django配置中设置自定义文件存储类
在django项目配置文件中添加设置
1 | # django文件存储 |
添加域名
在/etc/hosts中添加访问FastDFS storage服务器的域名
1 | 127.0.0.1 image.aaa.site |