FastDFS分布式文件系統(tǒng)調(diào)研

分布式文件存儲系統(tǒng)FastDFS

概述


普通存儲方案:Rsync仰楚、DAS(IDE/SATA/SAS/SCSI等塊)岔霸、NAS(NFS薛躬、CIFS、SAMBA等文件系統(tǒng))呆细、SAN(FibreChannel, iSCSI, FoE存儲網(wǎng)絡(luò)塊)型宝,Openfiler、FreeNas(ZFS快照復(fù)制)由于生產(chǎn)環(huán)境中往往由于對存儲數(shù)據(jù)量很大絮爷,而SAN存儲價格又比較昂貴趴酣,因此大多會選擇分布式 存儲來解決一下問題:
海量數(shù)據(jù)存儲問題
數(shù)據(jù)高可用問題(冗余備份)問題
較高的讀寫性能和負(fù)載均衡問題
支持多平臺多語言問題
高并發(fā)問題

主流開源分布式文件系統(tǒng)


分布式文件系統(tǒng) 適合類型 文件分布 系統(tǒng)性能 復(fù)雜度 FUSE POSIX 備份機制 接口類型 社區(qū)支持 開發(fā)語言 使用
FastDFS 4KB~500MB 小文件合并存儲,不分片處理 很高 簡單 不支持 不支持 組(卷 )冗余存儲 API略水,HTTP接口 國內(nèi)用戶群 C 支付寶价卤,UC劝萤,京東
HDFS 大文件 大文件分塊存儲 很高 簡單 支持 支持 多副本 原生API 較多 JAVA 大數(shù)據(jù)離線計算
Ceph 對象渊涝、塊、FS存儲 OSD一主多從 復(fù)雜 支持 支持 多副本 原生API 較多 C++ 許多大企業(yè)在用
MFS 大于64KB 分片存儲 master占內(nèi)存較大 支持 支持 多點備份動態(tài)冗余 使用FUSE掛載 較多 Perl
MogileFS 海量小文件 復(fù)雜 可以支持 不支持 動態(tài)冗余 原生API 文檔少 perl
ClusterFS 大文件 簡單 支持 支持 鏡像 C
TFS 小文件 小文件合并床嫌,以block組織分片 復(fù)雜 不支持 不支持 Block存儲多份跨释,主從災(zāi)備 API HTTP C++ 淘寶圖片儲存
BFS 小文件 百度圖片儲存
swift 任意大小文件的數(shù)據(jù) 當(dāng)容器的對象超過100 萬個時,其性能就會急劇下降 原生 API

FastDFS是什么?


FastDFS概述

FastDFS是阿里巴巴開源的一套輕量級,天生就是分布式設(shè)計的文件系統(tǒng)厌处,F(xiàn)astDFS的源代碼由C語言開發(fā)鳖谈,目前可運行在Linux,FreeBSD,Unix等類操作系統(tǒng)上阔涉,F(xiàn)astDFS解決了大數(shù)據(jù)量文件存儲和讀寫分離,備份容錯,負(fù)載均衡,動態(tài)擴容等問題缆娃,這也就是原作者所描述的高性能和高擴展性的文件系統(tǒng)。適合存儲4KB~500MB之間的小文件瑰排,如圖片網(wǎng)站贯要、短視頻網(wǎng)站、文檔椭住、app下載站等崇渗。在UC基于FastDFS開發(fā)向用戶提供了:網(wǎng)盤,社區(qū)京郑,廣告和應(yīng)用下載等業(yè)務(wù)的存儲服務(wù)宅广。

FastDFS是一款開源的輕量級分布式文件系統(tǒng)純C實現(xiàn),支持Linux些举、FreeBSD等UNIX系統(tǒng)類google FS跟狱,不是通用的文件系統(tǒng),只能通過專有API訪問户魏,目前提供了C兽肤、Java和PHP API為互聯(lián)網(wǎng)應(yīng)用量身定做套腹,解決大容量文件存儲問題,追求高性能和高擴展性FastDFS可以看做是基于文件的key value pair存儲系統(tǒng)资铡,稱作分布式文件存儲服務(wù)更為合適电禀。

FastDFS作者簡介

FastDFS的作者是余慶(happyfish100),github地址https://github.com/happyfish100

FastDFS主要特性

  • 為互聯(lián)網(wǎng)量身定制笤休,海量數(shù)據(jù)文件存儲尖飞。
  • 高可用(同組備份機制)。
  • FastDFS可以看作是基于key/value pair存儲系統(tǒng)店雅,也許稱為分布式文件存儲服務(wù)更合適政基。
  • 支持高并發(fā)
  • 文件不分塊存儲,上傳的文件和OS文件系統(tǒng)中的文件一一對應(yīng)
  • 支持相同內(nèi)容的文件只保存一份闹啦,節(jié)約磁盤空間
  • 下載文件支持HTTP協(xié)議沮明,可以使用內(nèi)置Web Server,也可以和其他Web Server配合使用
  • 支持在線擴容
  • 支持主從文件(文件備份窍奋,讀寫)
  • 存儲服務(wù)器上可以保存文件屬性(meta-data)V2.0網(wǎng)絡(luò)通信采用libevent荐健,支持大并發(fā)訪問,整體性能更好
  • 支持秒存(并發(fā)上傳)
  • 支持?jǐn)帱c續(xù)傳琳袄,分片上傳

FastDFS主要用戶


FastDFS相關(guān)概念


FastDFS服務(wù)端有三個角色:跟蹤服務(wù)器(tracker server)存儲服務(wù)器(storage server)窖逗、客戶端(client)址否。

跟蹤服務(wù)器(tracker server)

跟蹤服務(wù)器,主要做調(diào)度工作碎紊,起負(fù)載均衡的作用佑附。在內(nèi)存中記錄集群中所有存儲組和存儲服務(wù)器的狀態(tài)信息,是客戶端和數(shù)據(jù)服務(wù)器交互的樞紐仗考。相比GFS中的master更為精簡音同,不記錄文件索引信息,占用的內(nèi)存量很少痴鳄。

Tracker是FastDFS的協(xié)調(diào)者瘟斜,負(fù)責(zé)管理所有的storage server和group,每個storage在啟動后會連接Tracker痪寻,告知自己所屬的group等信息螺句,并保持周期性的心跳,tracker根據(jù)storage的心跳信息橡类,建立group==>[storage server list]的映射表蛇尚。

Tracker需要管理的元信息很少,會全部存儲在內(nèi)存中顾画;另外tracker上的元信息都是由storage匯報的信息生成的取劫,本身不需要持久化任何數(shù)據(jù)匆笤,這樣使得tracker非常容易擴展,直接增加tracker機器即可擴展為tracker cluster來服務(wù)谱邪,cluster里每個tracker之間是完全對等的炮捧,所有的tracker都接受stroage的心跳信息,生成元數(shù)據(jù)信息來提供讀寫服務(wù)惦银。

存儲服務(wù)器(storage server)

存儲服務(wù)器(又稱:存儲節(jié)點或數(shù)據(jù)服務(wù)器)咆课,文件和文件屬性(meta data)都保存到存儲服務(wù)器上。Storage server直接利用OS的文件系統(tǒng)調(diào)用管理文件扯俱。

Storage server(后簡稱storage)以組(卷书蚪,group或volume)為單位組織,一個group內(nèi)包含多臺storage機器迅栅,數(shù)據(jù)互為備份殊校,存儲空間以group內(nèi)容量最小的storage為準(zhǔn),所以建議group內(nèi)的多個storage盡量配置相同读存,以免造成存儲空間的浪費为流。

以group為單位組織存儲能方便的進行應(yīng)用隔離、負(fù)載均衡宪萄、副本數(shù)定制(group內(nèi)storage server數(shù)量即為該group的副本數(shù))艺谆,比如將不同應(yīng)用數(shù)據(jù)存到不同的group就能隔離應(yīng)用數(shù)據(jù)榨惰,同時還可根據(jù)應(yīng)用的訪問特性來將應(yīng)用分配到不同的group來做負(fù)載均衡拜英;缺點是group的容量受單機存儲容量的限制,同時當(dāng)group內(nèi)有機器壞掉時琅催,數(shù)據(jù)恢復(fù)只能依賴group內(nèi)地其他機器居凶,使得恢復(fù)時間會很長。

group內(nèi)每個storage的存儲依賴于本地文件系統(tǒng)藤抡,storage可配置多個數(shù)據(jù)存儲目錄侠碧,比如有10塊磁盤,分別掛載在/data/disk1-/data/disk10缠黍,則可將這10個目錄都配置為storage的數(shù)據(jù)存儲目錄弄兜。

storage接受到寫文件請求時,會根據(jù)配置好的規(guī)則(后面會介紹)瓷式,選擇其中一個存儲目錄來存儲文件替饿。為了避免單個目錄下的文件數(shù)太多砸西,在storage第一次啟動時乔外,會在每個數(shù)據(jù)存儲目錄里創(chuàng)建2級子目錄,每級256個嘉裤,總共65536個文件廊驼,新寫的文件會以hash的方式被路由到其中某個子目錄下据过,然后將文件數(shù)據(jù)直接作為一個本地文件存儲到該目錄中惋砂。

客戶端(client)

客戶端,作為業(yè)務(wù)請求的發(fā)起方绳锅,通過專有接口西饵,使用TCP/IP協(xié)議與跟蹤器服務(wù)器或存儲節(jié)點進行數(shù)據(jù)交互。FastDFS向使用者提供基本文件訪問接口鳞芙,比如upload罗标、download、append积蜻、delete等闯割,以客戶端庫的方式提供給用戶使用。

另外兩個概念:

group :組竿拆, 也可稱為卷宙拉。 同組內(nèi)服務(wù)器上的文件是完全相同的 ,同一組內(nèi)的storage server之間是對等的丙笋, 文件上傳谢澈、 刪除等操作可以在任意一臺storage server上進行 。

meta data :文件相關(guān)屬性御板,鍵值對( Key Value Pair) 方式锥忿,如:width=1024,heigth=768 。

image

Tracker相當(dāng)于FastDFS的大腦怠肋,不論是上傳還是下載都是通過tracker來分配資源敬鬓;客戶端一般可以使用ngnix等靜態(tài)服務(wù)器來調(diào)用或者做一部分的緩存;存儲服務(wù)器內(nèi)部分為卷(或者叫做組)笙各,卷于卷之間是平行的關(guān)系钉答,可以根據(jù)資源的使用情況隨時增加,卷內(nèi)服務(wù)器文件相互同步備份杈抢,以達到容災(zāi)的目的数尿。

FastDFS文件上傳機制


首先客戶端請求Tracker服務(wù)獲取到存儲服務(wù)器的ip地址和端口,然后客戶端根據(jù)返回的IP地址和端口號請求上傳文件惶楼,存儲服務(wù)器接收到請求后生產(chǎn)文件右蹦,并且將文件內(nèi)容寫入磁盤并返回給客戶端file_id、路徑信息歼捐、文件名等信息何陆,客戶端保存相關(guān)信息上傳完畢。

image

內(nèi)部機制如下:

1窥岩、選擇tracker server

當(dāng)集群中不止一個tracker server時甲献,由于tracker之間是完全對等的關(guān)系,客戶端在upload文件時可以任意選擇一個trakcer颂翼。 選擇存儲的group 當(dāng)tracker接收到upload file的請求時晃洒,會為該文件分配一個可以存儲該文件的group慨灭,支持如下選擇group的規(guī)則:

  • 1、Round robin球及,所有的group間輪詢
  • 2氧骤、Specified group,指定某一個確定的group
  • 3吃引、Load balance筹陵,剩余存儲空間多多group優(yōu)先

2、選擇storage server

當(dāng)選定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上配置)

3、選擇storage path

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

  • 1衣式、Round robin寸士,多個存儲目錄間輪詢
  • 2、剩余存儲空間最多的優(yōu)先

4瞳收、生成Fileid

選定存儲目錄之后碉京,storage會為文件生一個Fileid厢汹,由storage server ip螟深、文件創(chuàng)建時間、文件大小烫葬、文件crc32和一個隨機數(shù)拼接而成界弧,然后將這個二進制串進行base64編碼,轉(zhuǎn)換為可打印的字符串搭综。 選擇兩級目錄 當(dāng)選定存儲目錄之后垢箕,storage會為文件分配一個fileid,每個存儲目錄下有兩級256*256的子目錄兑巾,storage會按文件fileid進行兩次hash(猜測)条获,路由到其中一個子目錄,然后將文件以fileid為文件名存儲到該子目錄下蒋歌。

5帅掘、生成文件名

當(dāng)文件存儲到某個子目錄后委煤,即認(rèn)為該文件存儲成功,接下來會為該文件生成一個文件名修档,文件名由group碧绞、存儲目錄、兩級子目錄吱窝、fileid讥邻、文件后綴名(由客戶端指定,主要用于區(qū)分文件類型)拼接而成院峡。

FastDFS文件下載機制


客戶端帶上文件名信息請求Tracker服務(wù)獲取到存儲服務(wù)器的ip地址和端口兴使,然后客戶端根據(jù)返回的IP地址和端口號請求下載文件,存儲服務(wù)器接收到請求后返回文件給客戶端照激。

image

跟upload file一樣鲫惶,在download file時客戶端可以選擇任意tracker server。tracker發(fā)送download請求給某個tracker实抡,必須帶上文件名信息欠母,tracke從文件名中解析出文件的group、大小吆寨、創(chuàng)建時間等信息赏淌,然后為該請求選擇一個storage用來服務(wù)讀請求。由于group內(nèi)的文件同步時在后臺異步進行的啄清,所以有可能出現(xiàn)在讀到時候六水,文件還沒有同步到某些storage server上,為了盡量避免訪問到這樣的storage辣卒,tracker按照如下規(guī)則選擇group內(nèi)可讀的storage掷贾。

  • 1、該文件上傳到的源頭storage - 源頭storage只要存活著荣茫,肯定包含這個文件想帅,源頭的地址被編碼在文件名中。
  • 2啡莉、文件創(chuàng)建時間戳==storage被同步到的時間戳 且(當(dāng)前時間-文件創(chuàng)建時間戳) > 文件同步最大時間(如5分鐘) - 文件創(chuàng)建后港准,認(rèn)為經(jīng)過最大同步時間后,肯定已經(jīng)同步到其他storage了咧欣。
  • 3浅缸、文件創(chuàng)建時間戳 < storage被同步到的時間戳。 - 同步時間戳之前的文件確定已經(jīng)同步了
  • 4魄咕、(當(dāng)前時間-文件創(chuàng)建時間戳) > 同步延遲閥值(如一天)衩椒。 - 經(jīng)過同步延遲閾值時間,認(rèn)為文件肯定已經(jīng)同步了。

同步時間管理


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

image

寫文件時言蛇,客戶端將文件寫至group內(nèi)一個storage server即認(rèn)為寫文件成功僻他,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生成一個同步時間戳讲衫。

精巧的文件ID-FID


說到下載就不得不提文件索引(又稱:FID)的精巧設(shè)計了。文件索引結(jié)構(gòu)如下圖,是客戶端上傳文件后存儲服務(wù)器返回給客戶端涉兽,用于以后訪問該文件的索引信息招驴。文件索引信息包括:組名,虛擬磁盤路徑枷畏,數(shù)據(jù)兩級目錄别厘,文件名。

image
  • 組名:文件上傳后所在的存儲組名稱拥诡,在文件上傳成功后有存儲服務(wù)器返回触趴,需要客戶端自行保存。
  • 虛擬磁盤路徑:存儲服務(wù)器配置的虛擬路徑渴肉,與磁盤選項store_path*對應(yīng)冗懦。
  • 數(shù)據(jù)兩級目錄:存儲服務(wù)器在每個虛擬磁盤路徑下創(chuàng)建的兩級目錄,用于存儲數(shù)據(jù)文件仇祭。
  • 文件名:與文件上傳時不同披蕉。是由存儲服務(wù)器根據(jù)特定信息生成,文件名包含:源存儲服務(wù)器IP地址乌奇、文件創(chuàng)建時間戳没讲、文件大小、隨機數(shù)和文件拓展名等信息礁苗。

快速定位文件

知道FastDFS FID的組成后食零,我們來看看FastDFS是如何通過這個精巧的FID定位到需要訪問的文件。

  • 1寂屏、通過組名tracker能夠很快的定位到客戶端需要訪問的存儲服務(wù)器組贰谣,并將選擇合適的存儲服務(wù)器提供客戶端訪問;
  • 2迁霎、存儲服務(wù)器根據(jù)“文件存儲虛擬磁盤路徑”和“數(shù)據(jù)文件兩級目錄”可以很快定位到文件所在目錄吱抚,并根據(jù)文件名找到客戶端需要訪問的文件。
image

如何搭建FastDFS考廉?秘豹,下圖為某用戶搭建的架構(gòu)示意圖

image

FastDFS性能VS HDFS


引用性能測試報告

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昌粤,隨后出現(xiàn)的幾起案子既绕,更是在濱河造成了極大的恐慌,老刑警劉巖涮坐,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凄贩,死亡現(xiàn)場離奇詭異,居然都是意外死亡袱讹,警方通過查閱死者的電腦和手機疲扎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椒丧,你說我怎么就攤上這事壹甥。” “怎么了壶熏?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵句柠,是天一觀的道長。 經(jīng)常有香客問我棒假,道長溯职,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任淆衷,我火速辦了婚禮缸榄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祝拯。我一直安慰自己甚带,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布佳头。 她就那樣靜靜地躺著鹰贵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪康嘉。 梳的紋絲不亂的頭發(fā)上碉输,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音亭珍,去河邊找鬼敷钾。 笑死,一個胖子當(dāng)著我的面吹牛肄梨,可吹牛的內(nèi)容都是我干的阻荒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼众羡,長吁一口氣:“原來是場噩夢啊……” “哼侨赡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粱侣,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羊壹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后齐婴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體油猫,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年尔店,在試婚紗的時候發(fā)現(xiàn)自己被綠了眨攘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片主慰。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚣州,死狀恐怖鲫售,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情该肴,我是刑警寧澤情竹,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站匀哄,受9級特大地震影響秦效,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涎嚼,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一阱州、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧法梯,春花似錦苔货、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铛绰,卻和暖如春诈茧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捂掰。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工敢会, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人这嚣。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓鸥昏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疤苹。 傳聞我的和親對象是個殘疾皇子互广,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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