什么是FastDFS
很多以文件為載體的在線服務,如相冊網站、視頻網站等,都需要對文件進行管理,包括文件的存儲、同步、訪問(文件上傳、文件下載)等,同時肯定會伴隨着大容量存儲和負載均衡的問題。
在日常的一些項目中,比如做用戶的KYC認證等,也需要存儲文件、圖片、視頻等。此時可以選擇使用OSS雲服務,也可以自己構建相對專業的文件管理系統。
FastDFS是一個開源的輕量級分布式文件系統,用於解決大數據量存儲和負載均衡等問題,並需要通過專有API進行訪問。滿足大容量文件存儲問題,並保證高性能和高擴展性。它能夠很好的解決上述提到的業務場景。
FastDFS的特性
FastDFS為互聯網量身定制,充分考慮了冗余備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。
優點:
- 文件不分塊存儲,文件和系統中的文件一一對應。
- 對文件內容做hash處理,避免出現重復文件,節約磁盤空間。
- 下載文件支持HTTP協議,可基於內置Web Server或外部Web Server。
- 支持在線擴容,動態添加卷。
- 支持文件冗余備份和負載均衡。
- 存儲服務器上可以保存文件屬性(meta-data)V2.0 網絡通信采用libevent,支持大並發訪問,整體性能更好。
缺點:
- 直接按文件存儲,可直接查看文件內容,缺乏文件安全性。
- 數據同步無校驗,存在靜默IO問題,降低系統可用性。
- 單線程數據同步,僅適合存儲小文件(4KB到500MB之間)。
- 備份數根據存儲分卷(分組)決定,缺乏文件備份數設置靈活性。
- 單個掛載點異常會導致整個存儲節點下線。
- 缺乏多機房容災支持。
- 靜態的負載均衡機制。
優點與缺點並存,但針對中小型系統已經完全足夠使用了。
FastDFS的角色
初次接觸或部署FastDFS的朋友往往會有些疑惑,為什么要部署那么多服務才能使用FastDFS。這是由FastDFS的角色構成決定的。
FastDFS系統有三個角色:跟蹤服務器(Tracker Server)、存儲服務器(Storage Server)和客戶端(Client)。
如果通過Http訪問,通常情況下,還需要部署Nginx服務。
Tracker Server:跟蹤服務器,主要做調度工作,起到均衡的作用;負責管理所有的storage server和group,每個storage在啟動后會連接 Tracker,同步自己所屬group等信息,並保持周期性心跳。它是客戶端和數據服務器交互的樞紐。
Storage Server:存儲服務器,主要提供容量和備份服務;以group為單位,每個group內可以有多台storage server,數據互為備份。文件及屬性(Meta Data)都保存在該服務器上。
Client:客戶端,上傳下載數據請求的發起方,通過專有接口,使用TCP/IP協議與跟蹤器服務器或存儲節點進行數據交互。
下面通過一張圖來看看FastDFS的不同角色在整個流轉過程中的作用。

上圖中Tracker相當於一個調度中心,上傳和下載都通過它來進行分配指定。
上面我們提到Nginx,客戶端通常會使用Ngnix等靜態服務器來調用或者做一部分的緩存。后面搭建環境時便是基於Nginx。
Storage cluster部分,由Volume1、Volume2……VolumeK組成,它們稱為卷(或者叫做組),卷與卷之間是平行的關系,可以根據資源的使用情況隨時增加,卷內服務器文件相互同步備份,以達到容災的目的。
上傳過程
當服務啟動之后,Storage Server會定期的向Tracker Server發送存儲信息。如果Tracker Server是集群形式,則每個Tracker之間的關系是對等的,客戶端上傳時選擇任意一個Tracker即可。
整體流程:當客戶端請求Tracker進行上傳操作時,會獲取存儲服務器相關信息,主要包括IP和端口。根據返回信息上傳文件,通過存儲服務器寫入磁盤,並返回給客戶端file_id、路徑信息、文件名等信息。
對應流程圖如下:

其中,當Tracker收到客戶端上傳文件的請求時,會為該文件分配一個可以存儲文件的group,當選定了group后就要決定給客戶端分配group中的哪一個storage server。
當分配好storage server后,客戶端向storage發送寫文件請求,storage將會為文件分配一個數據存儲目錄。然后為文件分配一個fileid,最后根據以上的信息生成文件名存儲文件。
生成的文件名基本格式如下:

下載過程
跟上傳一樣,在下載時客戶端可以選擇任意Tracker server。
客戶端帶文件名信息請求Tracker,Tracker從文件名中解析出文件的group、大小、創建時間等信息,然后選擇一個storage用來服務處理請求,返回對應文件。
對應流程圖如下:

如果是基於Web的http請求,此處的Client可以是Nginx代理服務。下面這張圖更加形象的描述了相關的流程。

小結
關於FastDFS的基本特性和原理已經介紹完畢,重點關注三個角色和兩個流程,以及將三個角色融入到兩個流程中進行分析。明白了這個大的方向之后,至於執行的細節部分就可以逐步了解和掌握。
下一篇文章我們將來介紹基於Docker如何部署FastDFS。關注微信公眾號【程序新視界】獲得持續更新內容。

