FastDFS原理
FastDFS是一個開源的輕量級分布式文件系統(tǒng)菠镇,純C實現(xiàn)昂秃,目前提供了C禀梳、Java和PHP API。功能包括:文件存儲肠骆,文件同步算途,文件訪問(文件上傳、文件下載)等蚀腿,解決了大容量存儲和負載均衡的問題嘴瓤。特別適合以中小文件(建議范圍:4KB < file_size <500MB)為載體的在線服務(wù)。
Fast DFS系統(tǒng)有三個角色:跟蹤服務(wù)器(Tracker Server)莉钙、存儲服務(wù)器(Storage Server)和客戶端(Client)廓脆。client請求Tracker server 進行文件上傳、下載磁玉,通過Tracker server調(diào)度最終由Storage server完成文件上傳和下載停忿,在底層存儲上通過邏輯的分組概念,使得通過在同組內(nèi)配置多個Storage蚊伞,從而實現(xiàn)軟RAID10席赂。
- Tracker server:跟蹤服務(wù)器,主要做調(diào)度工作时迫,起到均衡的作用颅停;負責管理所有的Storage server和group,每個storage在啟動后會連接Tracker掠拳,告知自己所屬group等信息便监,并保持周期性心跳。tracker上的元信息都是由storage匯報的信息生成的碳想,本身不需要持久化任何數(shù)據(jù)烧董,這樣使得tracker非常容易擴展,直接增加tracker機器即可擴展為tracker cluster來服務(wù)胧奔,cluster里每個tracker之間是完全對等的逊移,所有的tracker都接受stroage的心跳信息,生成元數(shù)據(jù)信息來提供讀寫服務(wù)龙填,tracker根據(jù)storage的心跳信息胳泉,建立group==>[storage server list]的映射表拐叉。
- Storage server:存儲服務(wù)器,主要提供容量和備份服務(wù)扇商;以group為單位凤瘦,每個group內(nèi)部可以有多臺storage server,數(shù)據(jù)互為備份案铺∈呓妫客戶端上傳的文件最終存儲在storage服務(wù)器上,Storage server沒有實現(xiàn)自己的文件系統(tǒng)控汉,而是利用操作系統(tǒng)的文件系統(tǒng)來管理文件笔诵,可以將storage稱為存儲服務(wù)器。storage可配置多個數(shù)據(jù)存儲目錄姑子,比如有10塊磁盤乎婿,分別掛載在/data/disk1-/data/disk10,則可將這10個目錄都配置為storage的數(shù)據(jù)存儲目錄街佑。
- Client:客戶端谢翎,上傳下載數(shù)據(jù)的服務(wù)器,也就是我們自己的項目所部署在的服務(wù)器沐旨。FastDFS向使用者提供基本文件訪問接口森逮,比如upload、download希俩、append、delete等纲辽,以客戶端庫的方式提供給用戶使用
跟蹤服務(wù)器和存儲節(jié)點都可以由一臺或多臺服務(wù)器構(gòu)成颜武,跟蹤服務(wù)器和存儲節(jié)點均可以隨時增加或者下線不會影響線上服務(wù),其中跟蹤服務(wù)器中所有服務(wù)器是對 等拖吼,可以根據(jù)服務(wù)器壓力情況隨時增加或減少
文件的上傳
Storage server會連接集群中所有的Tracker server鳞上,定時向他們報告自己的狀態(tài),包括磁盤剩余空間吊档、文件同步狀況篙议、文件上傳下載次數(shù)等統(tǒng)計信息。
上傳的內(nèi)部機制如下:
-
選擇tracker server
當集群中不止一個tracker server時怠硼,由于tracker之間是完全對等無狀態(tài)的關(guān)系鬼贱,當集群中不止一個tracker server時,由于tracker之間是完全對等的關(guān)系香璃,客戶端在upload文件時可以任意選擇一個trakcer这难。 選擇存儲的group 當tracker接收到upload file的請求時,會為該文件分配一個可以存儲該文件的group葡秒,支持如下選擇group的規(guī)則:
Round robin姻乓,所有的group間輪詢
Specified group嵌溢,指定某一個確定的group
Load balance,剩余存儲空間多多group優(yōu)先
-
選擇storage server
當選定group后蹋岩,tracker會在group內(nèi)選擇一個storage server給客戶端赖草,支持如下選擇storage的規(guī)則:
Round robin,在group內(nèi)的所有storage間輪詢
First server ordered by ip剪个,按ip排序
First server ordered by priority秧骑,按優(yōu)先級排序(優(yōu)先級在storage上配置)
-
選擇storage path
當分配好storage server后,客戶端將向storage發(fā)送寫文件請求禁偎,storage將會為文件分配一個數(shù)據(jù)存儲目錄腿堤,支持如下規(guī)則:
- Round robin,多個存儲目錄間輪詢
- 剩余存儲空間最多的優(yōu)先
-
生成Fileid
選定存儲目錄之后如暖,storage會為文件生一個Fileid笆檀,由storage server ip、文件創(chuàng)建時間盒至、文件大小酗洒、文件crc32和一個隨機數(shù)拼接而成,然后將這個二進制串進行base64編碼枷遂,轉(zhuǎn)換為可打印的字符串樱衷。 選擇兩級目錄 當選定存儲目錄之后,storage會為文件分配一個fileid酒唉,每個存儲目錄下有兩級256*256的子目錄矩桂,storage會按文件fileid進行兩次hash(猜測),路由到其中一個子目錄痪伦,然后將文件以fileid為文件名存儲到該子目錄下
-
生成文件名
當文件存儲到某個子目錄后侄榴,即認為該文件存儲成功,接下來會為該文件生成一個文件名网沾,文件名由group癞蚕、存儲目錄、兩級子目錄辉哥、fileid桦山、文件后綴名(由客戶端指定,主要用于區(qū)分文件類型)拼接而成
文件的下載
跟upload file一樣醋旦,在download file時客戶端可以選擇任意tracker server恒水。tracker發(fā)送download請求給某個tracker,必須帶上文件名信息饲齐,tracke從文件名中解析出文件的group寇窑、大小、創(chuàng)建時間等信息箩张,然后為該請求選擇一個storage用來服務(wù)讀請求甩骏。
定位文件:客戶端上傳文件后存儲服務(wù)器將文件ID返回給客戶端窗市,此文件ID用于以后訪問該文件的索引信息。文件索引信息包括:組名饮笛,虛擬磁盤路徑咨察,數(shù)據(jù)兩級目錄,文件名福青。
image
- 組名:文件上傳后所在的storage組名稱摄狱,在文件上傳成功后有storage服務(wù)器返回,需要客戶端自行保存无午。
- 虛擬磁盤路徑:storage配置的虛擬路徑媒役,與磁盤選項store_path*對應(yīng)。如果配置了store_path0則是M00宪迟,如果配置了store_path1則是M01酣衷,以此類推。
- 數(shù)據(jù)兩級目錄:storage服務(wù)器在每個虛擬磁盤路徑下創(chuàng)建的兩級目錄次泽,用于存儲數(shù)據(jù)文件穿仪。
- 文件名:與文件上傳時不同。是由存儲服務(wù)器根據(jù)特定信息生成意荤,文件名包含:源存儲服務(wù)器IP地址啊片、文件創(chuàng)建時間戳、文件大小玖像、隨機數(shù)和文件拓展名等信息紫谷。
image知道FastDFS FID的組成后,我們來看看FastDFS是如何通過這個精巧的FID定位到需要訪問的文件:
- 通過組名tracker能夠很快的定位到客戶端需要訪問的存儲服務(wù)器組捐寥,并將選擇合適的存儲服務(wù)器提供客戶端訪問
- 存儲服務(wù)器根據(jù)“文件存儲虛擬磁盤路徑”和“數(shù)據(jù)文件兩級目錄”可以很快定位到文件所在目錄笤昨,并根據(jù)文件名找到客戶端需要訪問的文件
同步時間管理
當一個文件上傳成功后,客戶端馬上發(fā)起對該文件下載請求(或刪除請求)時上真,tracker是如何選定一個適用的存儲服務(wù)器呢咬腋? 其實每個存儲服務(wù)器都需要定時將自身的信息上報給tracker羹膳,這些信息就包括了本地同步時間(即睡互,同步到的最新文件的時間戳)。而tracker根據(jù)各個存儲服務(wù)器的上報情況陵像,就能夠知道剛剛上傳的文件就珠,在該存儲組中是否已完成了同步。同步信息上報如下圖:
寫文件時醒颖,客戶端將文件寫至group內(nèi)一個storage server即認為寫文件成功妻怎,storage server寫完文件后,會由后臺線程將文件同步至同group內(nèi)其他的storage server泞歉。
每個storage寫文件后逼侦,同時會寫一份binlog匿辩,binlog里不包含文件數(shù)據(jù),只包含文件名等元信息榛丢,這份binlog用于后臺同步铲球,storage會記錄向group內(nèi)其他storage同步的進度,以便重啟后能接上次的進度繼續(xù)同步晰赞;進度以時間戳的方式進行記錄稼病,所以最好能保證集群內(nèi)所有server的時鐘保持同步。
storage的同步進度會作為元數(shù)據(jù)的一部分匯報到tracker上掖鱼,tracke在選擇讀storage的時候會以同步進度作為參考然走。 比如一個group內(nèi)有A、B戏挡、C三個storage server芍瑞,A向C同步到進度為T1 (T1以前寫的文件都已經(jīng)同步到B上了),B向C同步到時間戳為T2(T2 > T1)增拥,tracker接收到這些同步進度信息時啄巧,就會進行整理,將最小的那個做為C的同步時間戳掌栅,本例中T1即為C的同步時間戳為T1(即所有T1以前寫的數(shù)據(jù)都已經(jīng)同步到C上了)秩仆;同理,根據(jù)上述規(guī)則猾封,tracker會為A澄耍、B生成一個同步時間戳。
集成Nginx
FastDFS通過Tracker服務(wù)器,將文件放在Storage服務(wù)器存儲晌缘,但是同組存儲服務(wù)器之間需要進入文件復(fù)制齐莲,有同步延遲的問題。
假設(shè)Tracker服務(wù)器將文件上傳到了192.168.4.125磷箕,上傳成功后文件ID已經(jīng)返回給客戶端选酗。此時FastDFS存儲集群機制會將這個文件同步到同組存儲192.168.4.126,在文件還沒有復(fù)制完成的情況下岳枷,客戶端如果用這個文件ID在192.168.4.126上取文件,就會出現(xiàn)文件無法訪問的錯誤芒填。
而fastdfs-nginx-module可以重定向文件連接到文件上傳時的源服務(wù)器取文件,避免客戶端由于復(fù)制延遲導(dǎo)致的文件無法訪問錯誤。
另外空繁,使用nginx反向代理后殿衰,后端可以以HTTP請求的方式來訪問文件資源。訪問nginx反向代理+上傳文件時的ID
MooseFS原理
MooseFS 是一款具有冗余容錯功能的分布式文件系統(tǒng)盛泡。它把數(shù)據(jù)分散在多臺服務(wù)器上闷祥,確保一份數(shù)據(jù)多個備份副本,對外提供統(tǒng)一的結(jié)構(gòu)傲诵。對于標準的文件操作凯砍,MooseFS 表現(xiàn)與其他類Unix文件系統(tǒng)一致箱硕。 支持的通過文件系統(tǒng)特性:
層次結(jié)構(gòu)(目錄樹)
兼容 POSIX 文件屬性
支持特殊文件
符號鏈接和硬鏈接
基于 IP 地址和密碼的訪問控制
高可靠性(數(shù)據(jù)的多個副本存儲在不同服務(wù)器)
容量動態(tài)擴展(添加新硬盤或者服務(wù)器)
可以回收在制定時間內(nèi)刪除的文件,類似回收站功能
可以對整個文件甚至是正在被寫入的文件創(chuàng)建文件快照
MooseFS架構(gòu)中的四種角色
- 管理服務(wù)器(Master Server):也稱為元數(shù)據(jù)服務(wù)器悟衩,負責管理各個數(shù)據(jù)存儲服務(wù)器颅痊,調(diào)度文件讀寫,回收文件空間以及恢復(fù)多節(jié)點拷貝局待。目前MFS只支持一個元數(shù)據(jù)服務(wù)器master斑响,這是一個單點故障,需要一個性能穩(wěn)定的服務(wù)器來充當
-
元數(shù)據(jù)日志服務(wù)器(Metalogger Server):負責備份管理服務(wù)器的變化日志文件钳榨,文件類型為
changelog_ml.*.mfs
舰罚,以便于在管理服務(wù)器出問題時接替其進行工作。元數(shù)據(jù)日志服務(wù)器是mfs 1.6以后版本新增的服務(wù)薛耻,可以把元數(shù)據(jù)日志保留在管理服務(wù)器中营罢,也可以單獨存儲在一臺服務(wù)器中。為保證數(shù)據(jù)的安全性和可靠性饼齿,建議單獨用一臺服務(wù)器來存放元數(shù)據(jù)日志饲漾。需要注意的是,元數(shù)據(jù)日志守護進程跟管理服務(wù)器在同一個服務(wù)器上缕溉,備份元數(shù)據(jù)日志服務(wù)器作為它的客戶端考传,從管理服務(wù)器取得日志文件進行備份 - 數(shù)據(jù)存儲服務(wù)器(Chunk Server):數(shù)據(jù)存儲服務(wù)器是真正存儲用戶數(shù)據(jù)的服務(wù)器,負責連接管理服務(wù)器证鸥,聽從管理服務(wù)器調(diào)度僚楞,提供存儲空間,并為客戶提供數(shù)據(jù)傳輸枉层。在存儲文件時泉褐,首先把文件分成塊,然后將這些塊在數(shù)據(jù)存儲服務(wù)器之間互相復(fù)制
- 客戶端(Client):通過FUSE內(nèi)核接口掛載遠程管理服務(wù)器上所管理的數(shù)據(jù)存儲服務(wù)器鸟蜡,使共享的文件系統(tǒng)和使用本地文件系統(tǒng)的效果看起來是一樣的
讀機制
- 首先客戶端(Client)訪問主服務(wù)器(Master)膜赃,獲取文件實體的位置等相關(guān)信息
- 主服務(wù)器(Master)查詢緩存記錄,把文件實體的位置等相關(guān)信息發(fā)給客戶端(Client)
- 客戶端(Client)根據(jù)拿到的信息去訪問對應(yīng)的存儲實體數(shù)據(jù)的服務(wù)器(Chunk Server)
- 存儲實體數(shù)據(jù)的服務(wù)器(Chunk Server)把對應(yīng)的數(shù)據(jù)返回給客戶端(Client)
寫機制
- 客戶端(Client)訪問主服務(wù)器(Master)揉忘,請求寫入數(shù)據(jù)
- 主服務(wù)器(Master)查詢緩存記錄跳座,如果是新文件,則聯(lián)系后面的數(shù)據(jù)服務(wù)器(Chunk Server)創(chuàng)建對應(yīng)的chunk對象準備存放文件
- 數(shù)據(jù)服務(wù)器(Chunk Server)返回創(chuàng)建chunk對象成功的消息給主服務(wù)器(Master)
- 主服務(wù)器(Master)把文件實體的位置等相關(guān)信息發(fā)給客戶端(Client)
- 客戶端(Client)訪問對應(yīng)的數(shù)據(jù)服務(wù)器(Chunk Server)寫數(shù)據(jù)
- 數(shù)據(jù)服務(wù)器(Chunk Server)之間進行數(shù)據(jù)同步癌淮,互相確認成功
- 數(shù)據(jù)服務(wù)器(Chunk Server)返回成功寫入信息給客戶端(Client)
- 客戶端(Client)回報給主服務(wù)器(Master)寫入結(jié)束
MooseFS VS FastDFS
對比說明 / 文件系統(tǒng) | FastDFS | MooseFS |
---|---|---|
開發(fā)語言 | C | perl |
性能 | 很高 | 相對較差 |
易用性 | 安裝簡單躺坟,社區(qū)相對活躍沦补,不需要二次開發(fā)即可直接使用 | 安裝簡單乳蓄,官方文檔多,且提供Web界面的方式進行管理與監(jiān)控 |
適用場景 | 單集群的中小文件 | 單集群的大中文件 |
在線擴容 | 支持 | 支持 |
冗余備份 | 支持 | 支持 |
單點故障 | 不存在 | 存在 |
跨集群同步 | 部分支持 | 不支持 |
數(shù)據(jù)存儲方式 | 文件/塊 | 塊 |
FUSE掛載 | 不支持 | 支持 |
訪問接口 | 不支持POSIX | 支持POSIX |
FUSE掛載:fuse解決了文件系統(tǒng)必須在內(nèi)核態(tài)的的難題夕膀。實現(xiàn)了一個對文件系統(tǒng)訪問的回調(diào)虚倒,它使無特權(quán)的用戶能夠無需編輯內(nèi)核代碼而創(chuàng)建自己的文件系統(tǒng)
POSIX:表示可移植操作系統(tǒng)接口(Portable Operating System Interface of UNIX美侦,縮寫為 POSIX ),也就是Unix下應(yīng)用程序共同遵循的一種規(guī)范魂奥。支持POSIX的應(yīng)用程序意味著在各個Unix系統(tǒng)間提供了跨平臺運行的支持菠剩。
例如:
#include <pthread.h>
//在Linux下編寫多線程程序需要包含的頭文件POSIX線程(POSIX threads),簡稱Pthreads耻煤,是線程的POSIX標準具壮。該標準定義了創(chuàng)建和操縱線程的一整套API。在類Unix操作系統(tǒng)(Unix哈蝇、Linux棺妓、Mac OS X等)中,都使用Pthreads作為操作系統(tǒng)的線程炮赦。Windows操作系統(tǒng)也有其移植版pthreads-win32怜跑。