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.文件上傳交互過程:
- Storage server 定時向Tracker server 上傳狀態信息
- Client 向 Tracker server 發送連接請求
- Tracker server 查詢可用的storage
- Tracker server 返回storage的IP和端口給Client
- Client 上傳文件到Storage server
- Storage server 將文件寫入磁盤,同時生成文件id
- Storage server 返回文件id(路徑信息和文件名)給Client
- Client 存儲文件信息
2.文件下載交互過程:
- Storage server 定時向Tracker server 上傳狀態信息
- Client 向 Tracker server 發送連接請求
- Tracker server 查詢可用的storage
- Tracker server 返回storage的IP和端口給Client
- Client 發送文件id(路徑信息和文件名)給 Storage server
- Storage server 根據信息進行查找文件
- 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的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文件路徑
上次文件:
‘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進行測試:
上傳成功后瀏覽器打開image.shanghui.site:8888/ 后面在拼接上面ret返回的值
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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