想作個上傳/下載文件操做,沒有文件存儲服務器,又不想花錢購買相似阿里oss文件存儲服務怎麼辦? 固然想到用開源的技術啦,開源的分佈式文件存儲系統也很多,好比 《 FastDFS 》,《 Minio 》等等。今天就來介紹 《 FastDFS 》html
一、FastDFS 介紹:java
FastDFS做者:YuQing 筆名:HappyFish 100 一位軟件架構師,同時是一位 C、Java、PHP 的程序員。 FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(上傳、下載)等, 解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。 FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標, 使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。 FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。 跟蹤器(tracker)主要作調度工做,在訪問上起負載均衡的做用。 存儲節點存儲文件,完成文件管理的全部功能:就是存儲、同步和提供存取接口,FastDFS同時對文件的metadata元數據進行管理。 所謂文件的metadata就是文件的相關屬性,以鍵值對(key-value)方式表示,如:width=1024,其中的key爲width,value爲1024。 文件metadata是文件屬性列表,能夠包含多個鍵值對。 跟蹤器和存儲節點均可以由一臺或多臺服務器構成。跟蹤器和存儲節點中的服務器都可以隨時增長或下線而不會影響線上服務。 其中跟蹤器中的全部服務器都是對等的,能夠根據服務器的壓力狀況隨時增長或減小。爲了支持大容量,存儲節點(服務器) 採用了分卷(或分組)的組織方式。 存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,全部卷的文件容量累加就是整個存儲系統中的文件容量。 一個卷能夠由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的, 卷中的多臺存儲服務器起到了冗餘備份和負載均衡的做用。 在卷中增長服務器時,同步已有的文件是由FastDFS文件系統自動完成,同步完後,系統自動將新增服務器切換到線上提供服務 當存儲空間不足或即將耗盡,能夠動態添加捲。只須要增長一臺或多臺服務器並將它們配置爲一個新的卷,這樣就擴大存儲系統的容量 FastDFS中的文件標識分爲兩個部分:卷名和文件名,兩者缺一不可。
關於 FastDFS 相關的資源文章網站這裏提供幾個:mysql
技術論壇: http://bbs.chinaunix.net/forum-240-1.htmlgit
資源地址: https://sourceforge.net/projects/fastdfs/程序員
源碼資源: https://github.com/happyfish100github
二、FastDFS技術架構圖:sql
FastDFS文件存儲系統使用的術語簡介:數據庫
Tracker Server:跟蹤服務器,主要作調度工做,在訪問上起負載均衡的做用。記錄storage server的狀態,是鏈接Client和Storage server的樞紐。 Storage Server:存儲服務器,文件和meta data都保存到存儲服務器上 group:組,也稱爲卷。同組內服務器上的文件是徹底相同的 文件標識:包括兩部分:組名和文件名(包含路徑) meta data:文件相關屬性,鍵值對(Key Value Pair)方式,如:width=1024,heigth=768
三、FastDFS文件存儲系統的上傳與下載流程:服務器
上傳流程:架構
下載流程:
文件上傳後同步機制,以及增長增長服務器後的同步機制:
同一組內的storage server之間是對等的,文件上傳、刪除等操做能夠在任意一臺storage server上進行; 文件同步只在同組內的storage server之間進行,採用push方式,即源服務器同步給目標服務器; 源頭數據才須要同步,備份數據不須要再次同步,不然就構成環路了; 上述第二條規則有個例外,就是新增長一臺storage server時,由已有的一臺storage server將已有的全部數據(包括源頭數據和備份數據)同步給該新增服務器
四、FastDFS運行時的tracker服務器以及storage服務器目錄結構:
Tracker Server 目錄:
${base_path} |__data | |__storage_groups.dat:存儲分組信息 | |__storage_servers.dat:存儲服務器列表 |__logs |__trackerd.log:tracker server日誌文件
Storage Server 目錄:
${base_path} |__data | |__.data_init_flag:當前storage server初始化信息 | |__storage_stat.dat:當前storage server統計信息 | |__sync:存放數據同步相關文件 | | |__binlog.index:當前的binlog文件索引號 | | |__binlog.###:存放更新操做記錄(日誌) | | |__${ip_addr}_${port}.mark:存放同步的完成狀況 | | | |__一級目錄:256個存放數據文件的目錄,如:00, 1F | |__二級目錄:256個存放數據文件的目錄 |__logs |__storaged.log:storage server日誌文件
五、FastDFS和其餘文件存儲的簡單對比
FastDFS和集中存儲方式對比:
指標 |
FastDFS |
NFS |
集中存儲設備如NetApp、NAS |
線性擴容性 |
高 |
差 |
差 |
文件高併發訪問性能 |
高 |
差 |
通常 |
文件訪問方式 |
專有API |
POSIX |
支持POSIX |
硬件成本 |
較低 |
中等 |
高 |
相同內容文件只保存一份 |
支持 |
不支持 |
不支持 |
FastDFS和mogileFS對比:
指標 |
FastDFS |
7mogileFS |
系統簡潔性 |
簡潔 只有兩個角色:tracker和storage |
通常 有三個角色:tracker、storage和存儲文件信息的mysqldb |
系統性能 |
很高 (沒有使用數據庫文件同步直接點對點不通過tracker中轉) |
高 (使用mysql來存儲文件索引等信息文件同步經過tracker調度和中轉) |
系統穩定性 |
高(C語言開發能夠支持高併發和高負載) |
通常(Perl語言開發,高併發和高負載支持通常) |
RAID方式 |
分組(組內冗餘),靈活性較大 |
動態冗餘,靈活性通常 |
通訊協議 |
專有協議 下載文件支持HTTP |
HTTP |
技術文檔 |
較詳細 |
較少 |
文件附加屬性(metadata) |
支持 |
不支持 |
相同內容文件只保存一份 |
支持 |
不支持 |
下載文件時支持文件偏移量 |
支持 |
不支持 |
FastDFS的簡介就這裏了。下一章講解 FastDFS的單機版安裝,以及實現文件上傳,訪問、下載。
記錄bug,記錄成長。我是展浩,一名在java道路奮鬥的小白,我們一塊兒加油!
個人座右銘:當你的能力撐不起你的野心的時候,你就應該靜下心來去學習,去沉澱。