欧美三区_成人在线免费观看视频_欧美极品少妇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條評論
主站蜘蛛池模板: 亚洲免费黄色 | 国产午夜精品一区二区三区在线观看 | 国产精品久久久久久久久久久久 | 欧美日韩高清不卡免费观看 | 日韩高清一区 | 日本二本三本二区 | 亚洲视频一区在线 | 深夜福利一区二区 | 69pao强力打造免费高清 | 本道综合精品 | 色综合天天综合网看在线影院 | 成人97在线观看免费高清 | 亚洲一区二区三区久久久 | 日美女网站 | 99xxoo视频在线永久免费观看 | 偷偷狠狠的日日2020 | 91看片片 | 免费毛片看 | 欧美在线 | 亚洲 | 黄色片免费在线 | 国产高清一区二区 | 国产高清在线精品一区二区三区 | 欧美黄色一级片视频 | ab毛片 | 日本粉嫩一区二区三区视频 | 亚洲第一在线 | 久久精品免费视频观看 | 久久人精品| 久久久久久久国产精品电影 | 91视频网址 | 欧美午夜一区二区三区免费大片 | 五月婷婷狠狠干 | 欧美日韩高清不卡一区二区三区 | 一级黄色毛片视频 | 国产网站在线播放 | 精品一区二区三区在线观看国产 | 亚洲网站色 | 性视频网站免费 | 色五月丁香五月综合五月 | 日本男人天堂 | 九色网址|