对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载。

实际上,当文件较少的时候,Django是可以应付的过来的。但当文件以海量形式出现的时候,Django就并不是那么好用了,于是Fast DFS应运而出。

 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 os
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的泛用性之广,实实在在的提高了开发效率。

 

Docker来搭建分布式文件系统FastDfs的更多相关文章

  1. 云存储?不依赖三方服务自己也可以搞,利用Docker来搭建分布式文件系统FastDfs

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_78 对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载. 实际上,当文 ...

  2. FastDFS搭建分布式文件系统

    FastDFS搭建分布式文件系统 1. 什么是分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网 ...

  3. 分布式文件系统FastDFS简介、搭建、与SpringBoot整合实现图片上传

    之前大学时搭建过一个FastDFS的图片服务器,当时只是抱着好奇的态度搭着玩一下,当时搭建采用了一台虚拟机,tracker和storage服务在一台机器上放着,最近翻之前的博客突然想着在两台机器上搭建 ...

  4. 网站文件系统发展&&分布式文件系统fastDFS

    网站文件系统发展 1.单机时代的图片服务器架构 初创时期由于时间紧迫,开发人员水平也很有限等原因.所以通常就直接在website文件所在的目录下,建立1个upload子目录,用于保存用户上传的图片文件 ...

  5. 分布式文件系统 - FastDFS 简单了解一下

    别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白进入到当时的项目组后,在开发中上传用 ...

  6. 分布式文件系统 - FastDFS 配置 Nginx 模块及上传测试

    也不说废话,直接干 上一篇 分布式文件系统 - FastDFS 在 CentOS 下配置安装部署 中安装了 FastDFS 后,并配置启动了 Tracker 和 Storage 服务,已经可以上传文件 ...

  7. 分布式文件系统 - FastDFS

    分布式文件系统 - FastDFS 别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白 ...

  8. 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)——第一篇

    分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)--第一篇 简介 首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由 ...

  9. 分布式文件系统FastDFS详解

    上一篇文章<一次FastDFS并发问题的排查经历>介绍了一次生产排查并发问题的经历,可能有些人对FastDFS不是特别的了解,因此计划写几篇文章完整的介绍一下这个软件. 为什么要使用分布式 ...

随机推荐

  1. gitlab 搭建(基于现有nginx)

    普通搭建请看:gitlab 搭建 一.gitlab搭建 1.添加GitLab镜像源并安装gitlab服务器 wget https://mirrors.tuna.tsinghua.edu.cn/gitl ...

  2. 将input 的文本框改为不可编辑状态

    <input type="text" id = "textid" name="名称" value="值" size ...

  3. javaAgent打包找不到premain类文件解决

    agent 作用和开发 可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序.这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等. 由此可知agent ...

  4. Problem D. Country Meow 题解(三分套三分套三分)

    题目链接 题目大意 给你n(n<=100)个点,要你找一个点使得和所有点距离的最大值最小值ans 题目思路 一直在想二分答案,但是不会check 这个时候就要换一下思想 三分套三分套三分坐标即可 ...

  5. T-SQL——基础语法

    目录 0. 定义变量 1. 批处理 2. 条件逻辑--IF 3. 逻辑分支--CASE 4. 循环语句--WHILE 5. 附录--关于CASE表达式的实现函数 6. 参考 shanzm-2020年1 ...

  6. ios中关于系统定位CLLocationManager的使用解析

    //1.添加定位管理委托协议 CLLocationManagerDelegate //2.初始化定位管理对象 self.locationManager=[[CLLocationManager allo ...

  7. 使用RestTemplate,显示请求信息,响应信息

    使用RestTemplate,显示请求信息,响应信息 这里不讲怎么用RestTemplate具体细节用法,就是一个学习中的过程记录 一个简单的例子 public class App { public ...

  8. uni-app p-table下时间转换的问题

    问题描述: 从后台获取时间戳,转成日期格式,出现NaN的问题 uni的p-table插件 解决思路

  9. if判断 和while、for循环

    if判断 语法一: if     条件: 条件成立时执行子代码块 代码1 代码2 实例一: sex='female' age=18 is_beautifui=True if sex=='female' ...

  10. 2019 ACM/ICPC North America Qualifier G.Research Productivity Index(概率期望dp)

    https://open.kattis.com/problems/researchproductivityindex 这道题是考场上没写出来的一道题,今年看看感觉简单到不像话,当时自己对于dp没有什么 ...