Java中文件管理系統(tǒng)FastDFS詳解
什么是FastDFS
很多以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等,都需要對文件進(jìn)行管理,包括文件的存儲、同步、訪問(文件上傳、文件下載)等,同時肯定會伴隨著大容量存儲和負(fù)載均衡的問題。
在日常的一些項(xiàng)目中,比如做用戶的KYC認(rèn)證等,也需要存儲文件、圖片、視頻等。此時可以選擇使用OSS云服務(wù),也可以自己構(gòu)建相對專業(yè)的文件管理系統(tǒng)。
FastDFS是一個開源的輕量級分布式文件系統(tǒng),用于解決大數(shù)據(jù)量存儲和負(fù)載均衡等問題,并需要通過專有API進(jìn)行訪問。滿足大容量文件存儲問題,并保證高性能和高擴(kuò)展性。它能夠很好的解決上述提到的業(yè)務(wù)場景。
FastDFS的特性
FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo),使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)。
優(yōu)點(diǎn):
- 文件不分塊存儲,文件和系統(tǒng)中的文件一一對應(yīng)。
- 對文件內(nèi)容做hash處理,避免出現(xiàn)重復(fù)文件,節(jié)約磁盤空間。
- 下載文件支持HTTP協(xié)議,可基于內(nèi)置Web Server或外部Web Server。
- 支持在線擴(kuò)容,動態(tài)添加卷。支持文件冗余備份和負(fù)載均衡。
- 存儲服務(wù)器上可以保存文件屬性(meta-data)V2.0 網(wǎng)絡(luò)通信采用libevent,支持大并發(fā)訪問,整體性能更好。
缺點(diǎn):
- 直接按文件存儲,可直接查看文件內(nèi)容,缺乏文件安全性。
- 數(shù)據(jù)同步無校驗(yàn),存在靜默IO問題,降低系統(tǒng)可用性。
- 單線程數(shù)據(jù)同步,僅適合存儲小文件(4KB到500MB之間)。
- 備份數(shù)根據(jù)存儲分卷(分組)決定,缺乏文件備份數(shù)設(shè)置靈活性。
- 單個掛載點(diǎn)異常會導(dǎo)致整個存儲節(jié)點(diǎn)下線。
- 缺乏多機(jī)房容災(zāi)支持。
- 靜態(tài)的負(fù)載均衡機(jī)制。
優(yōu)點(diǎn)與缺點(diǎn)并存,但針對中小型系統(tǒng)已經(jīng)完全足夠使用了。
FastDFS的角色
初次接觸或部署FastDFS的朋友往往會有些疑惑,為什么要部署那么多服務(wù)才能使用FastDFS。這是由FastDFS的角色構(gòu)成決定的。
FastDFS系統(tǒng)有三個角色:跟蹤服務(wù)器(Tracker Server)、存儲服務(wù)器(Storage Server)和客戶端(Client)。
如果通過Http訪問,通常情況下,還需要部署Nginx服務(wù)。
Tracker Server:跟蹤服務(wù)器,主要做調(diào)度工作,起到均衡的作用;負(fù)責(zé)管理所有的storage server和group,每個storage在啟動后會連接 Tracker,同步自己所屬group等信息,并保持周期性心跳。它是客戶端和數(shù)據(jù)服務(wù)器交互的樞紐。
Storage Server:存儲服務(wù)器,主要提供容量和備份服務(wù);以group為單位,每個group內(nèi)可以有多臺storage server,數(shù)據(jù)互為備份。文件及屬性(Meta Data)都保存在該服務(wù)器上。
Client:客戶端,上傳下載數(shù)據(jù)請求的發(fā)起方,通過專有接口,使用TCP/IP協(xié)議與跟蹤器服務(wù)器或存儲節(jié)點(diǎn)進(jìn)行數(shù)據(jù)交互。
下面通過一張圖來看看FastDFS的不同角色在整個流轉(zhuǎn)過程中的作用。
上圖中Tracker相當(dāng)于一個調(diào)度中心,上傳和下載都通過它來進(jìn)行分配指定。
上面我們提到Nginx,客戶端通常會使用Ngnix等靜態(tài)服務(wù)器來調(diào)用或者做一部分的緩存。后面搭建環(huán)境時便是基于Nginx。
Storage cluster部分,由Volume1、Volume2……VolumeK組成,它們稱為卷(或者叫做組),卷與卷之間是平行的關(guān)系,可以根據(jù)資源的使用情況隨時增加,卷內(nèi)服務(wù)器文件相互同步備份,以達(dá)到容災(zāi)的目的。
上傳過程
當(dāng)服務(wù)啟動之后,Storage Server會定期的向Tracker Server發(fā)送存儲信息。如果Tracker Server是集群形式,則每個Tracker之間的關(guān)系是對等的,客戶端上傳時選擇任意一個Tracker即可。
整體流程:當(dāng)客戶端請求Tracker進(jìn)行上傳操作時,會獲取存儲服務(wù)器相關(guān)信息,主要包括IP和端口。根據(jù)返回信息上傳文件,通過存儲服務(wù)器寫入磁盤,并返回給客戶端file_id、路徑信息、文件名等信息。
對應(yīng)流程圖如下:
其中,當(dāng)Tracker收到客戶端上傳文件的請求時,會為該文件分配一個可以存儲文件的group,當(dāng)選定了group后就要決定給客戶端分配group中的哪一個storage server。
當(dāng)分配好storage server后,客戶端向storage發(fā)送寫文件請求,storage將會為文件分配一個數(shù)據(jù)存儲目錄。然后為文件分配一個fileid,最后根據(jù)以上的信息生成文件名存儲文件。
生成的文件名基本格式如下:
下載過程
跟上傳一樣,在下載時客戶端可以選擇任意Tracker server。
客戶端帶文件名信息請求Tracker,Tracker從文件名中解析出文件的group、大小、創(chuàng)建時間等信息,然后選擇一個storage用來服務(wù)處理請求,返回對應(yīng)文件。
對應(yīng)流程圖如下:
如果是基于Web的http請求,此處的Client可以是Nginx代理服務(wù)。下面這張圖更加形象的描述了相關(guān)的流程。
小結(jié)
關(guān)于FastDFS的基本特性和原理已經(jīng)介紹完畢,重點(diǎn)關(guān)注三個角色和兩個流程,以及將三個角色融入到兩個流程中進(jìn)行分析。明白了這個大的方向之后,至于執(zhí)行的細(xì)節(jié)部分就可以逐步了解和掌握。
到此這篇關(guān)于Java中文件管理系統(tǒng)FastDFS詳解的文章就介紹到這了,更多相關(guān)Java文件管理系統(tǒng)FastDFS內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC 實(shí)現(xiàn)用戶登錄實(shí)例代碼
這篇文章主要介紹了SpringMVC 實(shí)現(xiàn)用戶登錄實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02OpenFeign如何解決Get請求自動轉(zhuǎn)化成POST的問題
這篇文章主要介紹了OpenFeign如何解決Get請求自動轉(zhuǎn)化成POST的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Java輕松實(shí)現(xiàn)在Excel中添加超鏈接功能
這篇文章主要為大家詳細(xì)介紹了Java如何輕松實(shí)現(xiàn)在Excel中添加超鏈接功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01ArrayList與linkedList的用法區(qū)別及擴(kuò)容方式
這篇文章主要介紹了ArrayList與linkedList的用法區(qū)別及擴(kuò)容方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03SSH框架網(wǎng)上商城項(xiàng)目第11戰(zhàn)之查詢和刪除商品功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第11戰(zhàn)之查詢和刪除商品功能實(shí)現(xiàn)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-06-06Java數(shù)組與二維數(shù)組及替換空格實(shí)戰(zhàn)真題講解
數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語言中提供的數(shù)組是用來存儲固定大小的同類型元素,這篇文章主要介紹了Java數(shù)組與二維數(shù)組及替換空格實(shí)戰(zhàn)真題講解2022-07-07Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式
這篇文章主要介紹了Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07