對于文件存儲來說,一般情況下簡單的處理就是在Django配置文件中配置存儲目錄,按照規(guī)則對文件進(jìn)行上傳或者下載。
實際上,當(dāng)文件較少的時候,Django是可以應(yīng)付的過來的。但當(dāng)文件以海量形式出現(xiàn)的時候,Django就并不是那么好用了,于是FastDFS應(yīng)運(yùn)而出。
FastDFS是一個開源的分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負(fù)載均衡的問題。特別適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等??梢哉f它就是為互聯(lián)網(wǎng)而生,為大數(shù)據(jù)而生的。
FastDFS服務(wù)端有兩個角色:跟蹤器(tracker)和存儲節(jié)點(diǎn)(storage)。跟蹤器主要做調(diào)度工作,在訪問上起負(fù)載均衡的作用。 存儲節(jié)點(diǎn)存儲文件,完成文件管理的所有功能:存儲、同步和提供存取接口,F(xiàn)astDFS同時對文件的meta data進(jìn)行管理。跟蹤器和存儲節(jié)點(diǎn)都可以由多臺服務(wù)器構(gòu)成。跟蹤器和存儲節(jié)點(diǎn)中的服務(wù)器均可以隨時增加或下線而不會影響線上服務(wù)。其中跟蹤器中的所有服務(wù)器都是對等的,可以根據(jù)服務(wù)器的壓力情況隨時增加或減少。
為什么要用FastDfs:
1 解決海量存儲,同時存儲容量擴(kuò)展方便。
2 解決文件內(nèi)容重復(fù),如果用戶上傳的文件重復(fù)(文件指紋一樣),那么系統(tǒng)只有存儲一份數(shù)據(jù),值得一提的是,這項技術(shù)目前被廣泛應(yīng)用在網(wǎng)盤中。
3 結(jié)合Nginx提高網(wǎng)站讀取圖片的效率。
1,首先下載fastdfs鏡像
docker pull delron/fastdfs
2,使用docker鏡像構(gòu)建tracker容器(跟蹤服務(wù)器,起到調(diào)度的作用),這里tracker服務(wù)將會自動映射到宿主機(jī)上
注意:docker 的 -v 參數(shù),可以自動掛載宿主機(jī)的文件件到容器中去,這樣宿主和容器就可以進(jìn)行無障礙的文件共享,我們通過-v參數(shù),把宿主機(jī)的root目錄自動掛載到docker容器中的/var/root目錄中去
docker run -d --network=host --name tracker -v /root:/var/root delron/fastdfs tracker
3,docker鏡像構(gòu)建storage容器(存儲服務(wù)器,提供容量和備份服務(wù)),這里storage容器需要依賴tracker服務(wù),傳入你的tracker服務(wù)的ip地址,端口默認(rèn)是22122,ip地址也就是你宿主機(jī)的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 就可以看到兩套服務(wù)都已經(jīng)啟動
注意: docker ps -a 可以查看所有進(jìn)程 docker rm 進(jìn)程號 刪除對應(yīng)進(jìn)程
然后分別進(jìn)入宿主的命令行以及進(jìn)入容器storage的命令行,發(fā)現(xiàn)文件夾已經(jīng)共享
進(jìn)入正在后臺運(yùn)行的storage容器
docker exec -it storage /bin/bash
下面來個例子(上傳視頻)
我們可以利用docker的exec命令不進(jìn)入容器,直接在宿主機(jī)的環(huán)境下調(diào)用容器內(nèi)的命令,因為文件夾已經(jīng)共享,所以我們輸入的文件目錄雖然是容器中的/var/root目錄,但是實際上該上傳的文件就在宿主的/root目錄中
docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4
上傳成功后,fastdfs將會返回視頻的網(wǎng)絡(luò)地址
瀏覽器訪問一下,沒有問題
至此,在宿主機(jī)中上傳文件已經(jīng)搞定,而Python同樣也可以在命令行中執(zhí)行命令,我們可以從命令中得到URL的做法來實現(xiàn)django與fastdfs的交流,這里利用的是python中的os.popen方法,可以非常簡單的在命令行中獲取返回的fastdfs網(wǎng)絡(luò)地址,從而避開了必須要安裝fastdfs的python客戶端,因為該客戶端對python3并不十分友好。代碼如下:
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的特性運(yùn)用到了極致,由此可見docker的泛用性之廣,實實在在的提高了開發(fā)效率。