Docker來搭建分布式文件系統FastDfs


對於文件存儲來說,一般情況下簡單的處理就是在Django配置文件中配置存儲目錄,按照規則對文件進行上傳或者下載。

實際上,當文件較少的時候,Django是可以應付的過來的。但當文件以海量形式出現的時候,Django就並不是那么好用了,於是Fast DFS應運而出。

 FastDFS是一個開源的分布式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、視頻網站等等。可以說它就是為互聯網而生,為大數據而生的。

    FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要做調度工作,在訪問上起負載均衡的作用。 存儲節點存儲文件,完成文件管理的所有功能:存儲、同步和提供存取接口,FastDFS同時對文件的meta data進行管理。跟蹤器和存儲節點都可以由多台服務器構成。跟蹤器和存儲節點中的服務器均可以隨時增加或下線而不會影響線上服務。其中跟蹤器中的所有服務器都是對等的,可以根據服務器的壓力情況隨時增加或減少。

為什么要用FastDfs:

    1 解決海量存儲,同時存儲容量擴展方便。
    2 解決文件內容重復,如果用戶上傳的文件重復(文件指紋一樣),那么系統只有存儲一份數據,值得一提的是,這項技術目前被廣泛應用在網盤中。
    3 結合Nginx提高網站讀取圖片的效率。

 

1,首先下載fastdfs鏡像

docker pull delron/fastdfs

2,使用docker鏡像構建tracker容器(跟蹤服務器,起到調度的作用),這里tracker服務將會自動映射到宿主機上

注意:docker 的 -v 參數,可以自動掛載宿主機的文件件到容器中去,這樣宿主和容器就可以進行無障礙的文件共享,我們通過-v參數,把宿主機的root目錄自動掛載到docker容器中的/var/root目錄中去

docker run -d --network=host --name tracker -v /root:/var/root delron/fastdfs tracker

3,docker鏡像構建storage容器(存儲服務器,提供容量和備份服務),這里storage容器需要依賴tracker服務,傳入你的tracker服務的ip地址,端口默認是22122,ip地址也就是你宿主機的ip

docker run -d --network=host --name storage -e TRACKER_SERVER=192.168.99.100:22122 -v /root:/var/root -e GROUP_NAME=group1 delron/fastdfs storage

注意:上面ip為docker的ip

此時,命令行輸入 docker ps 就可以看到兩套服務都已經啟動

注意: docker ps -a 可以查看所有進程   docker rm 進程號 刪除對應進程

然后分別進入宿主的命令行以及進入容器storage的命令行,發現文件夾已經共享

 

進入正在后台運行的storage容器

docker exec -it storage /bin/bash

下面來個例子(上傳視頻)

我們可以利用docker的exec命令不進入容器,直接在宿主機的環境下調用容器內的命令,因為文件夾已經共享,所以我們輸入的文件目錄雖然是容器中的/var/root目錄,但是實際上該上傳的文件就在宿主的/root目錄中

docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4

 上傳成功后,fastdfs將會返回視頻的網絡地址

 

 

瀏覽器訪問一下,沒有問題

 

 

至此,在宿主機中上傳文件已經搞定,而python同樣也可以在命令行中執行命令,我們可以從命令中得到URL的做法來實現django與fastdfs的交流,這里利用的是python中的os.popen方法,可以非常簡單的在命令行中獲取返回的fastdfs網絡地址,從而避開了必須要安裝fastdfs的python客戶端,因為該客戶端對python3並不十分友好。代碼如下:

import os
import re

std = os.popen("docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4").read()
print('*********** fastdfs excute start ***********')
print(std.strip())
print('*********** fastdfs excute end ***********')

 

這樣,在django中上傳文件時,就可以通過命令的方式上傳到fastdfs中,獲取返回地址后入庫就可以了,本次操作將docker的特性運用到了極致,由此可見docker的泛用性之廣,實實在在的提高了開發效率。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM