欧美三区_成人在线免费观看视频_欧美极品少妇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條評論
主站蜘蛛池模板: 成人免费毛片高清视频 | 欧美大片欧美大片 | 在线不卡视频 | 久草精品视频 | 日韩欧美亚洲 | 亚洲成a人片在线观看www流畅 | 国产小视频免费在线观看 | 亚洲精品456人成在线 | 日韩精品一区在线 | 日本黄色不卡视频 | 嫩草www | 三级av免费 | 99热久久这里只精品国产 | 96精品免费视频大全 | 久操国产在线 | 香蕉香蕉国产片一级一级毛片 | 亚洲精品一区二区三区精华液 | 激情成人综合网 | 毛片在哪看 | 国产精品怕怕怕视频免费 | 成人三级视频 | 色偷偷综合 | 日韩欧美精品 | 色小说香蕉 | 中文字幕在线一区二区三区 | www.久久久久久久久 | 那一个欧美一级毛片 | 水中色av综合 | 日日摸狠狠的摸夜夜摸 | 精品国产一区探花在线观看 | 久久精品蜜芽亚洲国产a | 国产精品每日更新 | 91av短视频| 亚洲午夜国产精品无卡 | 亚洲一区二区三区免费视频 | 狠狠色噜噜综合社区 | 国产 日韩 欧美 亚洲 | 色综合天天射 | 国产高清无专砖区2021 | 国产日产久久 | 亚洲国产视频在线观看 |