欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統(tǒng) 1810 0

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

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

一、什么是FastDFS:

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

FastDFS架構(gòu)包括 Tracker server和Storage server。客戶端請求Tracker server進行文件上傳、下載,通過Tracker server調(diào)度最終由Storage server完成文件上傳和下載。

1.文件上傳交互過程:

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

2.文件下載交互過程:

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

二、Docker安裝FastDFS

1.通過鏡像下載

            
              sudo docker image pull delron
              
                /
              
              fastdfs

            
          

2.將容器上的文件夾映射到本地路徑,啟動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ù)器的地址和端口,端口默認是22122

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

            
              sudo docker ps

            
          

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

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

            
              sudo docker container start 容器名

            
          

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

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

            
          

然后在使用start指令重新啟動容器
效果圖:

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

三、FastDFS的Python客戶端

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

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

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

            
          

2.定義自己的配置文件

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

            
              
                # 連接超時時間 默認30秒
              
              
connect_timeout
              
                =
              
              
                30
              
              
                # 網(wǎng)絡(luò)超時時間
              
              
                # 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


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


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


              
                # 指定storage id的文件名,允許使用絕對路徑
              
              
                # 和tracker.conf該參數(shù)含義一樣
              
              
                # 本配置只有在load_fdfs_parameters_from_tracker=false時生效
              
              
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'
              
              
                )
              
              
                # 通過創(chuàng)建的客戶端對象執(zhí)行上傳文件的方法:
              
              
client
              
                .
              
              upload_by_filename
              
                (
              
              
                '文件名'
              
              
                )
              
              
                # 或
              
              
client
              
                .
              
              upload_by_buffer
              
                (
              
              文件
              
                bytes
              
              數(shù)據(jù)
              
                )
              
            
          

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

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

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

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

1.在剛才的fastdfs目錄中建一個fdfs_client.py文件用來自定義文件管理

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

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

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

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

代碼如下:

            
              
                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: 將來用來構(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'
              
              
                )
              
              
                :
              
              
                """
        打開文件

		將來會被stroage.open()調(diào)用,在打開文件的時候調(diào)用
        :param name:
        :param mode:
        :return:
        """
              
              
                pass
              
              
                def
              
              
                _save
              
              
                (
              
              self
              
                ,
              
               name
              
                =
              
              
                None
              
              
                ,
              
               content
              
                =
              
              
                None
              
              
                ,
              
               max_length
              
                =
              
              
                None
              
              
                )
              
              
                :
              
              
                """
        保存文件,只需要傳入一個name或者content即可
        
        將來會被storage.save() 調(diào)用,實現(xiàn)在fdfs里面保存數(shù)據(jù)
        :param name: 傳入文件名
        :param content: 文件對象
        :return:保存到數(shù)據(jù)庫中的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自動區(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
              
                )
              
            
          

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

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

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

            
              
                # 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.配置系統(tǒng)路徑

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

            
              
                127.0
              
              
                .0
              
              
                .1
              
                 image
              
                .
              
              shanghuiproject
              
                .
              
              site

            
          

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

在django里面的shell進行測試:
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號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲不卡视频 | 亚洲国产一区二区视频 | 久久99国产综合精品免费 | 日本高清乱理伦片中文字幕啊 | 91看视频 | 91精品国产综合久久婷婷香蕉 | 亚洲一区二区三区欧美 | 成人在线免费 | 欧美—级v免费大片 | 欧美日韩中文字幕一区二区高清 | 国产精品三级国语在线看 | 亚洲在成人网在线看 | 欧美线在线精品观看视频 | 欧美一级黄色网 | 国产综合欧美 | 日本视频高清免费观看xxx | 午夜男人女人爽爽爽视频 | 午夜影视免费 | 亚洲美女综合 | 9久热这里只有精品免费 | 国产精品毛片一区二区在线看 | 26uuu中文字幕 | 五月婷亚洲 | 日本污污视频在线观看 | 亚洲视频在线看 | 国产在线激情视频 | 国产成人免费 | 在线精品国内外视频 | 天天综合色天天综合 | 国产日韩精品一区 | 日本免费一级视频 | 国产羞羞网站 | 四虎影视国产884a精品亚洲 | 亚洲综合亚洲综合网成人 | 精品国产精品国产 | 成人免费精品 | 国产精品91视频 | 免费精品美女久久久久久久久久 | 久久精品亚洲 | 欧美成人另类人妖 | 欧美一级高清毛片aaa |