文件存儲方案FastDFS
1. FastDFS介紹
- 用
c語言
編寫的一款開源的輕量級分布式文件系統。 - 功能包括:文件存儲、文件訪問(文件上傳、文件下載)、文件同步等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網站、視頻網站等等。
- 為互聯網量身定制,充分考慮了冗余備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標。
- 可以幫助我們搭建一套高性能的文件服務器集群,並提供文件上傳、下載等服務。
- FastDFS架構 包括
Client
、Tracker server
和Storage server
。Client
請求Tracker
進行文件上傳、下載,Tracker
再調度Storage
完成文件上傳和下載。
- Client: 客戶端,業務請求的發起方,通過專有接口,使用TCP/IP協議與
Tracker
或Storage
進行數據交互。FastDFS提供了upload
、download
、delete
等接口供客戶端使用。 - Tracker server:跟蹤服務器,主要做調度工作,起負載均衡的作用。在內存中記錄集群中所有存儲組和存儲服務器的狀態信息,是客戶端和數據服務器交互的樞紐。
- Storage server:存儲服務器(存儲節點或數據服務器),文件和文件屬性都保存到存儲服務器上。Storage server直接利用OS的文件系統調用管理文件。
- Storage群中的橫向可以擴容,縱向可以備份。
2. FastDFS上傳和下載流程
3. FastDFS文件索引
- FastDFS上傳和下載流程 可以看出都涉及到一個數據叫文件索引(file_id)。
- 文件索引(file_id)是客戶端上傳文件后Storage返回給客戶端的一個字符串,是以后訪問該文件的索引信息。
- 文件索引(file_id)信息包括:組名、虛擬磁盤路徑、數據兩級目錄、文件名等信息。
- 組名:文件上傳后所在的 Storage 組名稱。
- 虛擬磁盤路徑:Storage 配置的虛擬路徑,與磁盤選項
store_path*
對應。如果配置了store_path0
則是M00
,如果配置了store_path1
則是M01
,以此類推。 - 數據兩級目錄:Storage 服務器在每個虛擬磁盤路徑下創建的兩級目錄,用於存儲數據文件。
- 文件名:由存儲服務器根據特定信息生成,文件名包含:源存儲服務器IP地址、文件創建時間戳、文件大小、隨機數和文件拓展名等信息。
二、FastDFS的安裝
1、使用docker安裝
1.獲取FastDFS鏡像
# 從倉庫拉取鏡像 $ sudo docker image pull delron/fastdfs # 解壓教學資料中本地鏡像 $ sudo docker load -i 文件路徑/fastdfs_docker.tar
2.開啟tracker容器
- 我們將 tracker 運行目錄映射到宿主機的
/var/fdfs/tracker
目錄中。
$ sudo docker run -dit --name tracker --network=host -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
3.開啟storage容器
- TRACKER_SERVER=Tracker的ip地址:22122(Tracker的ip地址不要使用127.0.0.1)
- 我們將 storage 運行目錄映射到宿主機的
/var/fdfs/storage
目錄中。
$ sudo docker run -dti --name storage --network=host -e TRACKER_SERVER=192.168.103.158:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
4.查看宿主機映射路徑
注意:如果無法重啟storage容器,可以刪除/var/fdfs/storage/data目錄下的fdfs_storaged.pid 文件,然后重新運行storage。
2. FastDFS客戶端上傳文件
1.安裝FastDFS客戶端擴展
- 安裝准備好的
fdfs_client-py-master.zip
到虛擬環境中
$ pip install fdfs_client-py-master.zip
$ pip install mutagen
$ pip isntall requests
2.准備FastDFS客戶端擴展的配置文件
meiduo_mall.utils.fastdfs.client.conf
base_path=FastDFS客戶端存放日志文件的目錄
tracker_server=運行Tracker服務的機器ip:22122
3.FastDFS客戶端實現文件存儲
# 使用 shell 進入 Python交互環境 $ python manage.py shell
# 1. 導入FastDFS客戶端擴展 from fdfs_client.client import Fdfs_client # 2. 創建FastDFS客戶端實例 client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf') # 3. 調用FastDFS客戶端上傳文件方法 ret = client.upload_by_filename('/Users/zhangjie/Desktop/kk.jpeg')
ret = { 'Group name': 'group1', 'Remote file_id': 'group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg', 'Status': 'Upload successed.', 'Local file name': '/Users/zhangjie/Desktop/kk.jpeg', 'Uploaded size': '69.00KB', 'Storage IP': '192.168.103.158' }
ret = { 'Group name': 'Storage組名', 'Remote file_id': '文件索引,可用於下載', 'Status': '文件上傳結果反饋', 'Local file name': '上傳文件全路徑', 'Uploaded size': '文件大小', 'Storage IP': 'Storage地址' }
3. 瀏覽器下載並渲染圖片
思考:如何才能找到在Storage中存儲的圖片?
- 協議:
http
- IP地址:
192.168.103.158
Nginx
服務器的IP地址。- 因為 FastDFS 擅長存儲靜態文件,但是不擅長提供靜態文件的下載服務,所以我們一般會將 Nginx 服務器綁定到 Storage ,提升下載性能。
- 端口:
8888
Nginx
服務器的端口。
- 路徑:
group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
- 文件在Storage上的文件索引。
- 完整圖片下載地址
http://192.168.103.158:8888/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
編寫測試代碼:
meiduo_mall.utils.fdfs_t.html
<img src="http://192.168.103.158:8888/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg" width="320" height="480">