亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

FastDFS分布式系統在Docker和Python中的應用

系統 1736 0

fastdfs分布式系統在docker和python中的應用

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

一、什么是FastDFS:

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

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

1.文件上傳交互過程:

  1. Storage server 定時向Tracker server 上傳狀態信息
  2. Client 向 Tracker server 發送連接請求
  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 上傳狀態信息
  2. Client 向 Tracker server 發送連接請求
  3. Tracker server 查詢可用的storage
  4. Tracker server 返回storage的IP和端口給Client
  5. Client 發送文件id(路徑信息和文件名)給 Storage server
  6. Storage server 根據信息進行查找文件
  7. Storage server 將文件返回給Client

二、Docker安裝FastDFS

1.通過鏡像下載

            
              sudo docker image pull delron
              
                /
              
              fastdfs

            
          

2.將容器上的文件夾映射到本地路徑,啟動tracker和storage服務器

            
              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服務器需要指定tracker調度服務器的地址和端口,端口默認是22122

3.查看tracker和storage服務器是否開啟

            
              sudo docker ps

            
          

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

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

            
              sudo docker container start 容器名

            
          

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

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

            
          

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

FastDFS分布式系統在Docker和Python中的應用_第1張圖片

三、FastDFS的Python客戶端

1.下載環境包

先在GitHub下載:https://github.com/JaceHo/fdfs_client-py 然后在自己對應的環境安裝。

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

            
          

2.定義自己的配置文件

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

            
              
                # 連接超時時間 默認30秒
              
              
connect_timeout
              
                =
              
              
                30
              
              
                # 網絡超時時間
              
              
                # 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


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


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


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


              
                #HTTP settings
              
              
                #http.tracker_server_port=8080
              
              
                #引入HTTP相關配置
              
              
                ##include http.conf
              
            
          

3.上傳文件例子

            
              
                from
              
               fdfs_client
              
                .
              
              client 
              
                import
              
               Fdfs_client


              
                # 下面參數為client.conf的文件地址
              
              
client 
              
                =
              
               Fdfs_client
              
                (
              
              
                'fastdfs/client.conf'
              
              
                )
              
              
                # 通過創建的客戶端對象執行上傳文件的方法:
              
              
client
              
                .
              
              upload_by_filename
              
                (
              
              
                '文件名'
              
              
                )
              
              
                # 或
              
              
client
              
                .
              
              upload_by_buffer
              
                (
              
              文件
              
                bytes
              
              數據
              
                )
              
            
          

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

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

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

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

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

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

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

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

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

代碼如下:

            
              
                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: 將來用來構建圖片、文件等的完整路徑
        :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()調用,在打開文件的時候調用
        :param name:
        :param mode:
        :return:
        """
              
              
                pass
              
              
                def
              
              
                _save
              
              
                (
              
              self
              
                ,
              
               name
              
                =
              
              
                None
              
              
                ,
              
               content
              
                =
              
              
                None
              
              
                ,
              
               max_length
              
                =
              
              
                None
              
              
                )
              
              
                :
              
              
                """
        保存文件,只需要傳入一個name或者content即可
        
        將來會被storage.save() 調用,實現在fdfs里面保存數據
        :param name: 傳入文件名
        :param content: 文件對象
        :return:保存到數據庫中的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
              
                )
              
              
                :
              
              
                """
        檢查文件是否重復, FastDFS自動區分重復文件
        :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
              
                )
              
            
          

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

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

在settings/dev.py 中添加設置:

            
              
                # 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.配置系統路徑

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

            
              
                127.0
              
              
                .0
              
              
                .1
              
                 image
              
                .
              
              shanghuiproject
              
                .
              
              site

            
          

4.測試上傳以及文件服務器域名

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

效果圖:
FastDFS分布式系統在Docker和Python中的應用_第4張圖片


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲高清中文字幕综合网 | 日韩精品中文字幕一区二区三区 | 5151四虎永久在线精品免费 | 国产精品v免费视频 | 青草免费视频 | 九九国产精品 | 色片网 | 日本一级毛片毛片一级毛片 | 97视频在线观看视频在线精品 | 精品伊人久久久久7777人 | 99精品全国免费7观看视频 | 国产男女xoxo在线视频 | 99视频免费 | 俄罗斯一级毛片aaaa | 99热精品久久 | 亚洲日本欧美产综合在线 | 毛片天堂 | 亚洲图片在线观看 | 成人人免费夜夜视频观看 | 欧美日韩亚洲精品一区二区 | 亚洲成精品动漫久久精久 | 日日私人影院 | 深夜国产| www.天天射.com| 久久综合久久综合久久 | 日本国产成人精品视频 | 国产成+人+综合+欧美 亚洲 | 免费爱爱的视频太爽了 | 99视频都是精品热在线播放 | 26uuu最新地址 | 九九婷婷| 手机看一级片 | 91资源在线视频 | 91精品久久久久久久久久 | 两性色午夜视频免费老司机 | 真实的国产乱xxxx | 成人午夜爱爱爱爱爱 | 精品久久久久久婷婷 | 国产 日韩 一区 | 99热这里只有精品首页 | 国产精品女仆装在线播放 |