共计 2066 个字符,预计需要花费 6 分钟才能阅读完成。
对于文件存储来说,一般情况下简单的处理就是在 Django 配置文件中配置存储目录,按照规则对文件进行上传或者下载。
实际上,当文件较少的时候,Django 是可以应付的过来的。但当文件以海量形式出现的时候,Django 就并不是那么好用了,于是 FastDFS 应运而出。
FastDFS 是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。可以说它就是为互联网而生,为大数据而生的。
FastDFS 服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS 同时对文件的 meta data 进行管理。跟踪器和存储节点都可以由多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为什么要用 FastDfs:
1 解决海量存储,同时存储容量扩展方便。
2 解决文件内容重复, 如果用户上传的文件重复 (文件指纹一样),那么系统只有存储一份数据,值得一提的是,这项技术目前被广泛应用在网盘中。
3 结合 Nginx 提高网站读取图片的效率。
1,首先下载 fastdfs 镜像
docker pull delron/fastdfs
2,使用 docker 镜像构建 tracker 容器(跟踪服务器,起到调度的作用),这里 tracker 服务将会自动映射到宿主机上
注意:docker 的 -v 参数,可以自动挂载宿主机的文件件到容器中去,这样宿主和容器就可以进行无障碍的文件共享,我们通过 - v 参数,把宿主机的 root 目录自动挂载到 docker 容器中的 /var/root 目录中去
docker run -d --network=host --name tracker -v /root:/var/root delron/fastdfs tracker
3,docker 镜像构建 storage 容器(存储服务器,提供容量和备份服务),这里 storage 容器需要依赖 tracker 服务,传入你的 tracker 服务的 ip 地址,端口默认是 22122,ip 地址也就是你宿主机的 ip
docker run -d --network=host --name storage -e TRACKER_SERVER=192.168.99.100:22122 -v /root:/var/root -e GROUP_NAME=group1 delron/fastdfs storage
注意:上面 ip 为 docker 的 ip
此时,命令行输入 docker ps 就可以看到两套服务都已经启动
注意:docker ps -a 可以查看所有进程 docker rm 进程号 删除对应进程
然后分别进入宿主的命令行以及进入容器 storage 的命令行,发现文件夹已经共享
进入正在后台运行的 storage 容器
docker exec -it storage /bin/bash
下面来个例子(上传视频)
我们可以利用 docker 的 exec 命令不进入容器,直接在宿主机的环境下调用容器内的命令,因为文件夹已经共享,所以我们输入的文件目录虽然是容器中的 /var/root 目录,但是实际上该上传的文件就在宿主的 /root 目录中
docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4
上传成功后,fastdfs 将会返回视频的网络地址
浏览器访问一下,没有问题
至此,在宿主机中上传文件已经搞定,而 Python 同样也可以在命令行中执行命令,我们可以从命令中得到 URL 的做法来实现 django 与 fastdfs 的交流,这里利用的是 python 中的 os.popen 方法,可以非常简单的在命令行中获取返回的 fastdfs 网络地址,从而避开了必须要安装 fastdfs 的 python 客户端,因为该客户端对 python3 并不十分友好。代码如下:
import re
std
= os.popen(“docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4“).read()print(‘*********** fastdfs excute start ***********‘)
print(std.strip())
print(‘*********** fastdfs excute end ***********‘)
这样,在 django 中上传文件时,就可以通过命令的方式上传到 fastdfs 中,获取返回地址后入库就可以了,本次操作将 docker 的特性运用到了极致,由此可见 docker 的泛用性之广,实实在在的提高了开发效率。
: