응용 프로그램 FastDFS은 부두 노동자와 파이썬에 시스템을 분산

첫째, 무엇 FastDFS입니다 :

FastDFS는 C 언어에서 파일 시스템 분산 오픈 소스를 기록됩니다. FastDFS의 인터넷, 중복의 전체 계정,로드 밸런싱 및 다른 메커니즘 선형 확장을 위해 재단사 만든 및 고 가용성, 고성능 및 기타 지표에 초점이 파일 업로드 및 다운로드를 제공하는 고성능 파일 서버 클러스터를 구축 할 FastDFS를 사용하기 쉬운 및 기타 서비스를 제공합니다.

FastDFS 아키텍처는 트래커 서버 및 스토리지 서버가 포함되어 있습니다. 파일 업로드, 다운로드, 업로드 및 다운로드 파일의 트래커 서버 클라이언트 요청 트래커 서버 예약하여 스토리지 서버에 의해 완성.

1. 파일 업로드 상호 작용 :

  1. 스토리지 서버는 트래커 서버 상태로 타이밍 정보를 업로드
  2. 클라이언트는 트래커 서버에 연결 요청을 보냅니다
  3. 트래커 서버 쿼리 저장 가능한에게
  4. 트래커 서버 IP 및 클라이언트에 반환 스토리지 포트
  5. 스토리지 서버에 클라이언트 업로드 파일
  6. 파일 ID를 생성하는 동안 스토리지 서버는 파일을 디스크에 기록
  7. 스토리지 서버는 클라이언트에 파일 ID (파일 이름 및 경로 정보)를 반환
  8. 고객 정보 저장 파일

2. 다운로드 상호 작용 :

  1. 스토리지 서버는 트래커 서버 상태로 타이밍 정보를 업로드
  2. 클라이언트는 트래커 서버에 연결 요청을 보냅니다
  3. 트래커 서버 쿼리 저장 가능한에게
  4. 트래커 서버 IP 및 클라이언트에 반환 스토리지 포트
  5. 클라이언트는 스토리지 서버에 파일 ID (파일 이름 및 경로 정보)를 전송
  6. 스토리지 서버는 정보를 기반으로 파일을 찾을 수
  7. 스토리지 서버는 클라이언트에 파일을 반환

두, 도커 설치 FastDFS

1. 거울 다운로드

sudo docker image pull delron/fastdfs

2. 추적 서버 및 스토리지부터 로컬 경로에 매핑 된 컨테이너 폴더에 파일을 저장

sudo docker run -dit --network=host --name=tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
sudo docker run -dit --network=host --name=storage -e TRACKER_SERVER=192.168.149.129:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage

주 : 스토리지 서버가 추적기 스케줄링 서버 주소와 포트를 지정해야합니다, 기본 포트는 22122입니다

추적기 및 스토리지 서버가 켜져 3. 검토

sudo docker ps

렌더링 :
여기에 그림 삽입 설명

두 개의 달이있는 경우,이를 대신하여 열린 것이다. 어떤 명령은 다음을 사용하여 열 수없는 경우

sudo docker container start 容器名

입력 된 코드가 상기 개방이지만, 용기가 켜져 있지 않은 경우, 다음과 같은 작업을 수행

cd /var/fdfs/storage/data/
sudo rm -rf fdfs_storaged.pid

그런 다음 시작 명령과 용기를 다시 시작
렌더링을 :

여기에 그림 삽입 설명

세, 파이썬 클라이언트를 FastDFS

1. 패키지 환경을 다운로드

GitHub의 첫 다운로드 : https://github.com/JaceHo/fdfs_client-py는 다음 해당 환경에 설치.

pip install fdfs_client-py-master.zip
pip install mutagen
pip isntall requests

2. 자신의 프로파일을 정의

프로젝트 디렉토리 아래 fastdfs 폴더를 생성, FastDFS 클라이언트 구성 파일의 필요성을 사용하고 내부 구성 파일 client.conf, 주요 변경 tracker_server 및 base_path를 만들 :

# 连接超时时间 默认30秒
connect_timeout=30

# 网络超时时间
# default value is 30s
network_timeout=60

# 工作文件夹,日志存在此
base_path=/home/hadoop/桌面/shanghui/shanghuishop/shanghuiproject/logs
# tracer server列表,多个tracer server的话,分行列出
tracker_server=192.168.149.129:22122

#日志级别
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# 是否使用连接池
use_connection_pool = false

# 连接闲置超时时间,连接如果闲置的时间超过本配置,则关闭次连接,单位秒
connection_pool_max_idle_time = 3600

# 是否从tracer server读取fastdfs的参数,默认为false
load_fdfs_parameters_from_tracker=false

# 是否使用storage id 替换 ip,默认为false
# 和tracker.conf该参数含义一样
# 本配置只有在load_fdfs_parameters_from_tracker=false时生效
# 本配置默认为false
use_storage_id = false

# 指定storage id的文件名,允许使用绝对路径
# 和tracker.conf该参数含义一样
# 本配置只有在load_fdfs_parameters_from_tracker=false时生效
storage_ids_filename = storage_ids.conf

#HTTP settings
#http.tracker_server_port=8080


#引入HTTP相关配置
##include http.conf

3. 업로드 파일의 예

from fdfs_client.client import Fdfs_client

# 下面参数为client.conf的文件地址
client = Fdfs_client('fastdfs/client.conf')

# 通过创建的客户端对象执行上传文件的方法:
client.upload_by_filename('文件名')
# 或
client.upload_by_buffer(文件bytes数据)

파이썬 테스트 작성자 :
처음에 client.conf 파일 경로 찾기
여기에 그림 삽입 설명
: 마지막 파일
여기에 그림 삽입 설명
'원격 FILE_ID': '그룹 1 / M00은 / 00/00 / wKiVgV0UKeGAeXeKAABPHvQkMfU978.jpg를'

说明:
group1 : 文件上传之后storage组的名称
M00: storage 配置的虚拟路径
/00/00/ : 数据的俩级目录,用来存放数据
wKiVgV0UKeGAeXeKAABPHvQkMfU978.jpg :文件上传之后的名字,它和上传的时候的已经不一样了,它是由服务器根据特定的信息生成的,文件名包括:源存储服务器的IP地址、文件创建的时间戳、文件的大小、随机数和文件的扩展名等信息

四、自定义django文件存储并且保存到FDFS服务器上

Django是自带文件存储系统的,但是默认的文件存储到本地,在本项目中,需要将文件保存到FastDFS服务器上,所以需要自定义文件存储系统。

1.在刚才的fastdfs目录中建一个fdfs_client.py文件用来自定义文件管理

  • 需要继承自django.core.files.storage.Storage

  • 支持Django不带任何参数来实例化存储类,也就是说任何设置应该从配置django.conf.settings中获取

  • 存储类中必须实现_open()和_save()方法,以及任何后续使用中可能用到的其他方法。

  • 需要为存储类添加django.utils.deconstruct.deconstructible装饰器,以便在迁移中的字段上使用它时可以序列化,只要你的字段有自己的参数可以自动序列化。

代码如下:

from fdfs_client.client import Fdfs_client
from django.core.files.storage import Storage, FileSystemStorage
from django.conf import settings
from django.utils.deconstruct import deconstructible

# 装饰器的作用: 序列化
@deconstructible
class FastDfsStorage(Storage):
    '''定义FSATDFS客户端'''
    def __init__(self, base_url=None, client_conf=None):
        """
        初始化对象
        :param base_url: 将来用来构建图片、文件等的完整路径
        :param client_conf: fdfs客户端的配置文件的完整路径
        """
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url

        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

    def _open(self, name, mode='rb'):
        """
        打开文件

		将来会被stroage.open()调用,在打开文件的时候调用
        :param name:
        :param mode:
        :return:
        """
        pass

    def _save(self, name=None, content=None, max_length=None):
        """
        保存文件,只需要传入一个name或者content即可
        
        将来会被storage.save() 调用,实现在fdfs里面保存数据
        :param name: 传入文件名
        :param content: 文件对象
        :return:保存到数据库中的FastDFSDE文件名
        """
        client = Fdfs_client(self.client_conf)
        if name is None:
            ret = client.upload_by_buffer(content.read())
        else:
            ret = client.upload_by_filename(name)
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")
        file_name = ret.get("Remote file_id")
        return file_name

    def exists(self, name):
        """
        检查文件是否重复, FastDFS自动区分重复文件
        :param name:
        :return:
        """
        return False

    def url(self, name):
        """
        获取name文件的完整url
        :param name:
        :return:
        """
        return self.base_url + name

    def delete(self, name):
        '''
        删除文件
        :param name: Remote file_id
        :return:
        '''

        client = Fdfs_client(self.client_conf)
        client.delete_file(name)

注意:并不是这些方法全部都要实现,可以省略用不到的方法

2.在Django配置文件中设置自定义文件存储类

在settings/dev.py 中添加设置:

# django 文件储存
DEFAULT_FILE_STORAGE = 'shanghuiproject.fastdfs.fdfs_client.FastDfsStorage'

# FastDFS
FDFS_URL = 'http://image.shanghui.site:8888/'
LAST_BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
FDFS_CLIENT_CONF = os.path.join(LAST_BASE_DIR, 'fastdfs/client.conf')

3.配置系统路径

在/etc/hosts中添加访问FastDFS storage服务器的域名

127.0.0.1   image.shanghuiproject.site

4.测试上传以及文件服务器域名

장고는 쉘 내부 테스트 :
여기에 그림 삽입 설명
업로드 브라우저가 값 image.shanghui.site:8888/ 반환 RET 위의 모자이크 나중에 열리면

렌더링 :
여기에 그림 삽입 설명

추천

출처blog.csdn.net/dakengbi/article/details/93765831