黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

FastDFS分布式系統(tǒng)在Docker和Python中的應(yīng)用

系統(tǒng) 2114 0

fastdfs分布式系統(tǒng)在docker和python中的應(yīng)用

  • 一、什么是FastDFS:
    • 1.文件上傳交互過(guò)程:
    • 2.文件下載交互過(guò)程:
  • 二、Docker安裝FastDFS
    • 1.通過(guò)鏡像下載
    • 2.將容器上的文件夾映射到本地路徑,啟動(dòng)tracker和storage服務(wù)器
    • 3.查看tracker和storage服務(wù)器是否開啟
  • 三、FastDFS的Python客戶端
    • 1.下載環(huán)境包
    • 2.定義自己的配置文件
    • 3.上傳文件例子
  • 四、自定義django文件存儲(chǔ)并且保存到FDFS服務(wù)器上
    • 1.在剛才的fastdfs目錄中建一個(gè)fdfs_client.py文件用來(lái)自定義文件管理
    • 2.在Django配置文件中設(shè)置自定義文件存儲(chǔ)類
    • 3.配置系統(tǒng)路徑
    • 4.測(cè)試上傳以及文件服務(wù)器域名

一、什么是FastDFS:

FastDFS是用c語(yǔ)言編寫的一款開源的分布式文件系統(tǒng)。FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo),使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)。

FastDFS架構(gòu)包括 Tracker server和Storage server??蛻舳苏?qǐng)求Tracker server進(jìn)行文件上傳、下載,通過(guò)Tracker server調(diào)度最終由Storage server完成文件上傳和下載。

1.文件上傳交互過(guò)程:

  1. Storage server 定時(shí)向Tracker server 上傳狀態(tài)信息
  2. Client 向 Tracker server 發(fā)送連接請(qǐng)求
  3. Tracker server 查詢可用的storage
  4. Tracker server 返回storage的IP和端口給Client
  5. Client 上傳文件到Storage server
  6. Storage server 將文件寫入磁盤,同時(shí)生成文件id
  7. Storage server 返回文件id(路徑信息和文件名)給Client
  8. Client 存儲(chǔ)文件信息

2.文件下載交互過(guò)程:

  1. Storage server 定時(shí)向Tracker server 上傳狀態(tài)信息
  2. Client 向 Tracker server 發(fā)送連接請(qǐng)求
  3. Tracker server 查詢可用的storage
  4. Tracker server 返回storage的IP和端口給Client
  5. Client 發(fā)送文件id(路徑信息和文件名)給 Storage server
  6. Storage server 根據(jù)信息進(jìn)行查找文件
  7. Storage server 將文件返回給Client

二、Docker安裝FastDFS

1.通過(guò)鏡像下載

            
              sudo docker image pull delron
              
                /
              
              fastdfs

            
          

2.將容器上的文件夾映射到本地路徑,啟動(dòng)tracker和storage服務(wù)器

            
              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

            
          

注意:storage服務(wù)器需要指定tracker調(diào)度服務(wù)器的地址和端口,端口默認(rèn)是22122

3.查看tracker和storage服務(wù)器是否開啟

            
              sudo docker ps

            
          

效果圖:
在這里插入圖片描述

如果倆個(gè)都有,那就代表都已經(jīng)開啟了。如果沒(méi)有可以使用下面指令開啟

            
              sudo docker container start 容器名

            
          

如果輸入上面的開啟代碼,但是容器還是沒(méi)有開啟,就執(zhí)行下面的操作:

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

            
          

然后在使用start指令重新啟動(dòng)容器
效果圖:

FastDFS分布式系統(tǒng)在Docker和Python中的應(yīng)用_第1張圖片

三、FastDFS的Python客戶端

1.下載環(huán)境包

先在GitHub下載:https://github.com/JaceHo/fdfs_client-py 然后在自己對(duì)應(yīng)的環(huán)境安裝。

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

            
          

2.定義自己的配置文件

使用FastDFS 客戶端,需要有配置文件,在項(xiàng)目目錄下創(chuàng)建fastdfs文件夾,然后在里面創(chuàng)建一個(gè)client.conf配置文件,主要修改tracker_server 和base_path:

            
              
                # 連接超時(shí)時(shí)間 默認(rèn)30秒
              
              
connect_timeout
              
                =
              
              
                30
              
              
                # 網(wǎng)絡(luò)超時(shí)時(shí)間
              
              
                # default value is 30s
              
              
network_timeout
              
                =
              
              
                60
              
              
                # 工作文件夾,日志存在此
              
              
base_path
              
                =
              
              
                /
              
              home
              
                /
              
              hadoop
              
                /
              
              桌面
              
                /
              
              shanghui
              
                /
              
              shanghuishop
              
                /
              
              shanghuiproject
              
                /
              
              logs

              
                # tracer server列表,多個(gè)tracer server的話,分行列出
              
              
tracker_server
              
                =
              
              
                192.168
              
              
                .149
              
              
                .129
              
              
                :
              
              
                22122
              
              
                #日志級(jí)別
              
              
                ### emerg for emergency
              
              
                ### alert
              
              
                ### crit for critical
              
              
                ### error
              
              
                ### warn for warning
              
              
                ### notice
              
              
                ### info
              
              
                ### debug
              
              
log_level
              
                =
              
              info


              
                # 是否使用連接池
              
              
use_connection_pool 
              
                =
              
               false


              
                # 連接閑置超時(shí)時(shí)間,連接如果閑置的時(shí)間超過(guò)本配置,則關(guān)閉次連接,單位秒
              
              
connection_pool_max_idle_time 
              
                =
              
              
                3600
              
              
                # 是否從tracer server讀取fastdfs的參數(shù),默認(rèn)為false
              
              
load_fdfs_parameters_from_tracker
              
                =
              
              false


              
                # 是否使用storage id 替換 ip,默認(rèn)為false
              
              
                # 和tracker.conf該參數(shù)含義一樣
              
              
                # 本配置只有在load_fdfs_parameters_from_tracker=false時(shí)生效
              
              
                # 本配置默認(rèn)為false
              
              
use_storage_id 
              
                =
              
               false


              
                # 指定storage id的文件名,允許使用絕對(duì)路徑
              
              
                # 和tracker.conf該參數(shù)含義一樣
              
              
                # 本配置只有在load_fdfs_parameters_from_tracker=false時(shí)生效
              
              
storage_ids_filename 
              
                =
              
               storage_ids
              
                .
              
              conf


              
                #HTTP settings
              
              
                #http.tracker_server_port=8080
              
              
                #引入HTTP相關(guān)配置
              
              
                ##include http.conf
              
            
          

3.上傳文件例子

            
              
                from
              
               fdfs_client
              
                .
              
              client 
              
                import
              
               Fdfs_client


              
                # 下面參數(shù)為client.conf的文件地址
              
              
client 
              
                =
              
               Fdfs_client
              
                (
              
              
                'fastdfs/client.conf'
              
              
                )
              
              
                # 通過(guò)創(chuàng)建的客戶端對(duì)象執(zhí)行上傳文件的方法:
              
              
client
              
                .
              
              upload_by_filename
              
                (
              
              
                '文件名'
              
              
                )
              
              
                # 或
              
              
client
              
                .
              
              upload_by_buffer
              
                (
              
              文件
              
                bytes
              
              數(shù)據(jù)
              
                )
              
            
          

通過(guò)Python測(cè)試:
先找到client.conf文件路徑
在這里插入圖片描述
上次文件:
FastDFS分布式系統(tǒng)在Docker和Python中的應(yīng)用_第2張圖片
‘Remote file_id’: ‘group1/M00/00/00/wKiVgV0UKeGAeXeKAABPHvQkMfU978.jpg’

說(shuō)明:
group1 : 文件上傳之后storage組的名稱
M00: storage 配置的虛擬路徑
/00/00/ : 數(shù)據(jù)的倆級(jí)目錄,用來(lái)存放數(shù)據(jù)
wKiVgV0UKeGAeXeKAABPHvQkMfU978.jpg :文件上傳之后的名字,它和上傳的時(shí)候的已經(jīng)不一樣了,它是由服務(wù)器根據(jù)特定的信息生成的,文件名包括:源存儲(chǔ)服務(wù)器的IP地址、文件創(chuàng)建的時(shí)間戳、文件的大小、隨機(jī)數(shù)和文件的擴(kuò)展名等信息

四、自定義django文件存儲(chǔ)并且保存到FDFS服務(wù)器上

Django是自帶文件存儲(chǔ)系統(tǒng)的,但是默認(rèn)的文件存儲(chǔ)到本地,在本項(xiàng)目中,需要將文件保存到FastDFS服務(wù)器上,所以需要自定義文件存儲(chǔ)系統(tǒng)。

1.在剛才的fastdfs目錄中建一個(gè)fdfs_client.py文件用來(lái)自定義文件管理

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

  • 支持Django不帶任何參數(shù)來(lái)實(shí)例化存儲(chǔ)類,也就是說(shuō)任何設(shè)置應(yīng)該從配置django.conf.settings中獲取

  • 存儲(chǔ)類中必須實(shí)現(xiàn)_open()和_save()方法,以及任何后續(xù)使用中可能用到的其他方法。

  • 需要為存儲(chǔ)類添加django.utils.deconstruct.deconstructible裝飾器,以便在遷移中的字段上使用它時(shí)可以序列化,只要你的字段有自己的參數(shù)可以自動(dòng)序列化。

代碼如下:

            
              
                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
              
              
                )
              
              
                :
              
              
                """
        初始化對(duì)象
        :param base_url: 將來(lái)用來(lái)構(gòu)建圖片、文件等的完整路徑
        :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'
              
              
                )
              
              
                :
              
              
                """
        打開文件

		將來(lái)會(huì)被stroage.open()調(diào)用,在打開文件的時(shí)候調(diào)用
        :param name:
        :param mode:
        :return:
        """
              
              
                pass
              
              
                def
              
              
                _save
              
              
                (
              
              self
              
                ,
              
               name
              
                =
              
              
                None
              
              
                ,
              
               content
              
                =
              
              
                None
              
              
                ,
              
               max_length
              
                =
              
              
                None
              
              
                )
              
              
                :
              
              
                """
        保存文件,只需要傳入一個(gè)name或者content即可
        
        將來(lái)會(huì)被storage.save() 調(diào)用,實(shí)現(xiàn)在fdfs里面保存數(shù)據(jù)
        :param name: 傳入文件名
        :param content: 文件對(duì)象
        :return:保存到數(shù)據(jù)庫(kù)中的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
              
                )
              
              
                :
              
              
                """
        檢查文件是否重復(fù), FastDFS自動(dòng)區(qū)分重復(fù)文件
        :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
              
                )
              
            
          

注意:并不是這些方法全部都要實(shí)現(xiàn),可以省略用不到的方法

2.在Django配置文件中設(shè)置自定義文件存儲(chǔ)類

在settings/dev.py 中添加設(shè)置:

            
              
                # django 文件儲(chǔ)存
              
              
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.配置系統(tǒng)路徑

在/etc/hosts中添加訪問(wèn)FastDFS storage服務(wù)器的域名

            
              
                127.0
              
              
                .0
              
              
                .1
              
                 image
              
                .
              
              shanghuiproject
              
                .
              
              site

            
          

4.測(cè)試上傳以及文件服務(wù)器域名

在django里面的shell進(jìn)行測(cè)試:
FastDFS分布式系統(tǒng)在Docker和Python中的應(yīng)用_第3張圖片
上傳成功后瀏覽器打開image.shanghui.site:8888/ 后面在拼接上面ret返回的值

效果圖:
FastDFS分布式系統(tǒng)在Docker和Python中的應(yīng)用_第4張圖片


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論