FastDFS原理詳解

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等纲辽,以客戶端庫的方式提供給用戶使用
image

跟蹤服務(wù)器和存儲節(jié)點都可以由一臺或多臺服務(wù)器構(gòu)成颜武,跟蹤服務(wù)器和存儲節(jié)點均可以隨時增加或者下線不會影響線上服務(wù),其中跟蹤服務(wù)器中所有服務(wù)器是對 等拖吼,可以根據(jù)服務(wù)器壓力情況隨時增加或減少

文件的上傳

image

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ī)則:

    1. Round robin姻乓,所有的group間輪詢

    2. Specified group嵌溢,指定某一個確定的group

    3. Load balance,剩余存儲空間多多group優(yōu)先

  • 選擇storage server

    當選定group后蹋岩,tracker會在group內(nèi)選擇一個storage server給客戶端赖草,支持如下選擇storage的規(guī)則:

    1. Round robin,在group內(nèi)的所有storage間輪詢

    2. First server ordered by ip剪个,按ip排序

    3. First server ordered by priority秧骑,按優(yōu)先級排序(優(yōu)先級在storage上配置)

  • 選擇storage path

    當分配好storage server后,客戶端將向storage發(fā)送寫文件請求禁偎,storage將會為文件分配一個數(shù)據(jù)存儲目錄腿堤,支持如下規(guī)則:

    1. Round robin,多個存儲目錄間輪詢
    2. 剩余存儲空間最多的優(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ū)分文件類型)拼接而成

文件的下載

image

跟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定位到需要訪問的文件:

  1. 通過組名tracker能夠很快的定位到客戶端需要訪問的存儲服務(wù)器組捐寥,并將選擇合適的存儲服務(wù)器提供客戶端訪問
  2. 存儲服務(wù)器根據(jù)“文件存儲虛擬磁盤路徑”和“數(shù)據(jù)文件兩級目錄”可以很快定位到文件所在目錄笤昨,并根據(jù)文件名找到客戶端需要訪問的文件

同步時間管理

當一個文件上傳成功后,客戶端馬上發(fā)起對該文件下載請求(或刪除請求)時上真,tracker是如何選定一個適用的存儲服務(wù)器呢咬腋? 其實每個存儲服務(wù)器都需要定時將自身的信息上報給tracker羹膳,這些信息就包括了本地同步時間(即睡互,同步到的最新文件的時間戳)。而tracker根據(jù)各個存儲服務(wù)器的上報情況陵像,就能夠知道剛剛上傳的文件就珠,在該存儲組中是否已完成了同步。同步信息上報如下圖:

image

寫文件時醒颖,客戶端將文件寫至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)的效果看起來是一樣的
image

讀機制

image
  1. 首先客戶端(Client)訪問主服務(wù)器(Master)膜赃,獲取文件實體的位置等相關(guān)信息
  2. 主服務(wù)器(Master)查詢緩存記錄,把文件實體的位置等相關(guān)信息發(fā)給客戶端(Client)
  3. 客戶端(Client)根據(jù)拿到的信息去訪問對應(yīng)的存儲實體數(shù)據(jù)的服務(wù)器(Chunk Server)
  4. 存儲實體數(shù)據(jù)的服務(wù)器(Chunk Server)把對應(yīng)的數(shù)據(jù)返回給客戶端(Client)

寫機制

image
  1. 客戶端(Client)訪問主服務(wù)器(Master)揉忘,請求寫入數(shù)據(jù)
  2. 主服務(wù)器(Master)查詢緩存記錄跳座,如果是新文件,則聯(lián)系后面的數(shù)據(jù)服務(wù)器(Chunk Server)創(chuàng)建對應(yīng)的chunk對象準備存放文件
  3. 數(shù)據(jù)服務(wù)器(Chunk Server)返回創(chuàng)建chunk對象成功的消息給主服務(wù)器(Master)
  4. 主服務(wù)器(Master)把文件實體的位置等相關(guān)信息發(fā)給客戶端(Client)
  5. 客戶端(Client)訪問對應(yīng)的數(shù)據(jù)服務(wù)器(Chunk Server)寫數(shù)據(jù)
  6. 數(shù)據(jù)服務(wù)器(Chunk Server)之間進行數(shù)據(jù)同步癌淮,互相確認成功
  7. 數(shù)據(jù)服務(wù)器(Chunk Server)返回成功寫入信息給客戶端(Client)
  8. 客戶端(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怜跑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吠勘,隨后出現(xiàn)的幾起案子性芬,更是在濱河造成了極大的恐慌,老刑警劉巖剧防,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植锉,死亡現(xiàn)場離奇詭異,居然都是意外死亡峭拘,警方通過查閱死者的電腦和手機汽煮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棚唆,“玉大人暇赤,你說我怎么就攤上這事∠瑁” “怎么了鞋囊?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞎惫。 經(jīng)常有香客問我溜腐,道長,這世上最難降的妖魔是什么瓜喇? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任挺益,我火速辦了婚禮,結(jié)果婚禮上乘寒,老公的妹妹穿的比我還像新娘望众。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布烂翰。 她就那樣靜靜地躺著夯缺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甘耿。 梳的紋絲不亂的頭發(fā)上踊兜,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音佳恬,去河邊找鬼捏境。 笑死,一個胖子當著我的面吹牛毁葱,可吹牛的內(nèi)容都是我干的典蝌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼头谜,長吁一口氣:“原來是場噩夢啊……” “哼骏掀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柱告,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤截驮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后际度,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葵袭,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年乖菱,在試婚紗的時候發(fā)現(xiàn)自己被綠了坡锡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡窒所,死狀恐怖鹉勒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吵取,我是刑警寧澤禽额,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皮官,受9級特大地震影響脯倒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捺氢,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一藻丢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摄乒,春花似錦悠反、人聲如沸残黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挤茄,卻和暖如春如叼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穷劈。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工笼恰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歇终。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓社证,卻偏偏與公主長得像,于是被迫代替她去往敵國和親评凝。 傳聞我的和親對象是個殘疾皇子追葡,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容