Django+FastDFSファイル管理システムに基づいて構築

24955 ワード

FastDFSの紹介
  • プロフィールFastDFSは、Linux、FreeBSD、AIXなどのUNIXシステムをサポートする純粋なC言語で実現されたGoogle FSクラスのオープンソース分散ファイルシステムである.専用APIでのみファイルへのアクセスが可能で、POSIXインタフェース方式はサポートされず、mountでは使用できません.正確に言えば、Google FSやFastDFS、mogileFS、HDFS、TFSなどのGoogle FSは、システムレベルの分散ファイルシステムではなく、アプリケーションレベルの分散ファイルストレージサービスである.FastDFSはオープンソースの高性能分散ファイルシステム(DFS)である.主な機能は、ファイルストレージ、ファイル同期、ファイルアクセス、高容量と負荷のバランスです.主に大量のデータストレージの問題を解決し、特に中小ファイル(推奨範囲:4 KB
  • 原理ガイドFastDFSアーキテクチャはトラッカーサーバとStorageサーバを含む.クライアントはTracker serverにファイルのアップロード、ダウンロードを要求し、Trackerserverスケジューリングによって最終的にStorage serverによってファイルのアップロードとダウンロードを完了する.FastDFSシステムには、トレースサーバ(Tracker Server)、ストレージサーバ(Storage Server)、クライアント(Client)の3つの役割があります.Tracker Server:サーバを追跡し、主にスケジューリングを行い、バランスのとれた役割を果たす.すべてのstorage serverとgroupを管理し、各storageは起動後にTrackerに接続され、自分が属するgroupなどの情報を伝え、周期的な心拍数を維持します.Trackerserverを使用すると、ファイルのアップロード時にいくつかのポリシーに従ってStorageserverを見つけてファイルアップロードサービスを提供できます.Storage Server:ストレージサーバで、主に容量とバックアップサービスを提供します.group単位で、各groupには複数のstorage serverがあり、データは互いにバックアップされます.Storage serverは、独自のファイルシステムではなく、オペレーティングシステムのファイルシステムを利用してファイルを管理します.Client:クライアント、ダウンロードデータをアップロードするサーバ、つまり私たち自身のプロジェクトが配置しているサーバです.
  • FastDFSインストール1、FastDFS Linux依存パッケージのインストール
    yum install libevent libevent-devel gcc* -y
    
    2、FastDFSの公式依存パッケージのインストール
    wget -O libfastcommon-1.0.39.tar.gz  https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.39
    
    # 
    tar -zxvf libfastcommon-1.0.39.tar.gz
    # 
    cd libfastcommon-1.0.39 ./make.sh ./make.sh install 
    3、trackerTrackerを構成するプロファイルは/etc/fdfs/で、まずプロファイルのバックアップ
    cd /etc/fdfs/
    cp tracker.conf.sample tracker.conf
    vim tracker.conf
    
    # 
    	1、	 disable 
    	disable=false
    	2、	 
    	port=22122
    	3、	 tracker 
    	base_path=/fastdfs/tracker
    	4、	 http ( )
    	http.server_port=9080 5、  tracker_base  mkdir -p /fastdfs/tracker 4、  tracker #  systemctl stop firewalld 
    # 
    systemctl start fdfs_trackerd
    
    # 
    systemctl status fdfs_trackerd
    	```
    
    ```bash # : fdfs_trackerd.service - LSB: FastDFS tracker server Loaded: loaded (/etc/rc.d/init.d/fdfs_trackerd; bad; vendor preset: disabled) Active: active (running) since Mon 2020-06-22 01:53:40 EDT; 47min ago Docs: man:systemd-sysv-generator(8) Process: 1017 ExecStart=/etc/rc.d/init.d/fdfs_trackerd start (code=exited, status=0/SUCCESS) CGroup: /system.slice/fdfs_trackerd.service └─1034 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf Jun 22 01:53:40 localhost.localdomain systemd[1]: Starting LSB: FastDFS tracker server... Jun 22 01:53:40 localhost.localdomain fdfs_trackerd[1017]: Starting FastDFS tracker server: Jun 22 01:53:40 localhost.localdomain systemd[1]: Started LSB: FastDFS tracker server. #  netstat -tulnp|grep fdfs # : tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 1034/fdfs_trackerd # tracker  chkconfig fdfs_trackerd on # tracker /etc/init.d/fdfs_trackerd stop service fdfs_trackerd stop systemctl stop fdfs_trackerd 
    5、storagestorageを構成するプロファイルディレクトリも/etc/fdfs/
    # storage
    cd /etc/fdfs/
    cp storage.conf.sample storage.conf
    vim storage.conf
     
    disable=false
    group_name=group1 port=23000 heart_beat_interval=30 base_path=/fastdfs/storage/base store_path_count=1 store_path0=/fastdfs/storage subdir_count_per_path=256 tracker_server=192.168.194.158:22122 sync_start_time=00:00 sysc_end_time=23:59 http.server_port=9888 #  makedir -p /fastdfs/storage/base 
    6、storageを起動
    # storage
    /etc/init.d/fdfs_storaged start
    service fdfs_storaged start
    systemctl start fdfs_storaged
    
    # 
    systemctl status fdfs_storaged
    # 
    ● fdfs_storaged.service - LSB: FastDFS storage server
       Loaded: loaded (/etc/rc.d/init.d/fdfs_storaged; bad; vendor preset: disabled) Active: active (running) since Mon 2020-06-22 01:53:40 EDT; 1h 15min ago Docs: man:systemd-sysv-generator(8) Process: 1018 ExecStart=/etc/rc.d/init.d/fdfs_storaged start (code=exited, status=0/SUCCESS) CGroup: /system.slice/fdfs_storaged.service └─1031 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf Jun 22 01:53:40 localhost.localdomain systemd[1]: Starting LSB: FastDFS storage server... Jun 22 01:53:40 localhost.localdomain fdfs_storaged[1018]: Starting FastDFS storage server: Jun 22 01:53:40 localhost.localdomain systemd[1]: Started LSB: FastDFS storage server. #  netstat -unltp|grep fdfs tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 1031/fdfs_storaged # tracker storage  fdfs_monitor /etc/fdfs/storage.conf #  …… server_count=1, server_index=0 tracker server is 192.168.194.158:22122 group count: 1 Group 1: group name = group1 disk total space = 17394 MB disk free space = 15770 MB trunk free space = 0 MB storage server count = 1 active server count = 1 storage server port = 23000 storage HTTP port = 9888 store path count = 1 …… # storage  chkconfig fdfs_storaged on # storage /etc/init.d/fdfs_storaged stop service fdfs_storaged stop systemctl stop fdfs_storaged 7、  client client /etc/fdfs/  cd /etc/fdfs/ cp client.conf.sample client.conf vim client.conf #  base_path=/fastdfs/client tracker_server=192.168.194.158:22122 
    8、テストアップロード
    cd /opt/
    fdfs_upload_file /etc/fdfs/client.conf bjh.jpg
     
    group1/M00/00/00/wKjCnl7wXLSAT0pPAA8GO9kg11w732.jpg 
    Django_FastDFS 
    	Django fastDFS 
    		py3fdfs
    		fdfs_client-py
     windows ,python3 fdfs_client-py , py3fdfs 。
    pip install py3fdfs
    	 
    
    from fdfs_client.client import Fdfs_client, get_tracker_conf
    
    tracker_path = get_tracker_conf('./client.conf') client = Fdfs_client(tracker_path) ret = client.upload_by_filename('./by.jpg') print(ret) # : {'Group name': b'group1', 'Remote file_id': b'group1/M00/00/00/wKjCnl7wcgCAS13GAAA6-XV4BMg226.jpg', 'Status': 'Upload successed.', 'Local file name': './by.jpg', 'Uploaded size': '14.74KB', 'Storage IP': b'192.168.194.158'}  django  from django.shortcuts import render from fdfs_client.client import Fdfs_client, get_tracker_conf def index(request): if request.method == "POST": file = request.FILES.get("tfile") tracker_path = get_tracker_conf('./client.conf') client = Fdfs_client(tracker_path) ret = client.upload_by_buffer(file.read(),file_ext_name=file.name) print(ret) return render(request,"index.html") 
    ファイルダウンロードファイルの変更とファイルダウンロードファイルの削除にはファイル付きremote_file_id,このidはファイルアップロード時に返信
    # 
    {'Group name': b'group1', 'Remote file_id': b'group1/M00/00/00/wKjCnl7wcgCAS13GAAA6-XV4BMg226.jpg', 'Status': 'Upload successed.', 'Local file name': './by.jpg', 'Uploaded size': '14.74KB', 'Storage IP': b'192.168.194.158'} from fdfs_client.client import Fdfs_client, get_tracker_conf tracker_path = get_tracker_conf('./client.conf') client = Fdfs_client(tracker_path) ret = client.download_to_buffer(remote_name) print(ret)  django  #  from django.db import models class FileManager(models.Model): file_name = models.CharField(max_length = 128) remote_name = models.CharField(max_length = 128) upload_size = models.CharField(max_length = 32) file_type = models.CharField(max_length = 32) upload_time = models.DateTimeField() change_time = models.DateTimeField() group_name = models.CharField(max_length = 32) storage_ip = models.CharField(max_length = 64) #  import os import datetime from django.shortcuts import render from django.http import JsonResponse from fdfs_client.client import Fdfs_client, get_tracker_conf from FileManager.models import FileManager def upload(request): result = {"code": "","data": [],"state": ""} if request.method == "POST": file = request.FILES.get("file") file_name = file.name client = os.path.join( os.path.dirname(__file__),"client.conf" ) tracker_path = get_tracker_conf(client) try: client = Fdfs_client(tracker_path) ret = client.upload_by_buffer(file.read(), file_ext_name = file_name) except Exception as e: result["code"] = 500 result["state"] = str(e) result["data"].append(str(e)) else: f = FileManager() f.file_name = file_name f.remote_name = ret.get("Remote file_id").decode() f.upload_size = ret.get("Uploaded size") f.file_type = " " f.upload_time = datetime.datetime.now() f.change_time = datetime.datetime.now() f.group_name = ret.get("Group name").decode() f.storage_ip = ret.get("Storage IP").decode() f.save() result["code"] = 200 result["state"] = " " result["data"].append({ "file_name": file_name, "file_size": f.upload_size, "file_id": f.id }) else: result["code"] = 403 result["state"] = " " result["data"].append(" ") return JsonResponse(result) #  def download(request): result = {"code": "", "data": [], "state": ""} id_list = request.GET.getlist("file") for id in id_list: file = FileManager.objects.filter(id=id).first() if file: client