大規(guī)模分布式存儲(chǔ)系統(tǒng)-分布式文件系統(tǒng)
分布式文件系統(tǒng)是分布式存儲(chǔ)系統(tǒng)(鍵值系統(tǒng)、表格系統(tǒng)、數(shù)據(jù)庫(kù)系統(tǒng))的底層基礎(chǔ)部件,其所起的主要功能有兩個(gè):一個(gè)是存儲(chǔ)文檔、圖像、視頻之類的Blob類型數(shù)據(jù);另外一個(gè)是作為分布式表格系統(tǒng)的持久化層。
我們來(lái)看看業(yè)界是如何構(gòu)建各家基礎(chǔ)的分布式文件系統(tǒng)。
Google文件系統(tǒng)(GFS)
GFS系統(tǒng)的節(jié)點(diǎn)可分為三種角色:GFS Master(主控服務(wù)器)、GFS ChunkServer(CS,數(shù)據(jù)塊服務(wù)器)以及GFS客戶端。GFS文件被劃分為固定大小的數(shù)據(jù)塊(chunk),由主服務(wù)器在創(chuàng)建時(shí)分配一個(gè)64位全局唯一的chunk句柄。CS以普通的Linux文件的形式將chunk存儲(chǔ)在磁盤中。為了保證可靠性,chunk在不同的機(jī)器中復(fù)制多份,默認(rèn)為三份??蛻舳嗽L問(wèn)GFS時(shí),首先訪問(wèn)主控服務(wù)器節(jié)點(diǎn),獲取與之進(jìn)行交互的CS信息,然后直接訪問(wèn)這些CS,完成數(shù)據(jù)存取工作。需要注意的是,GFS中的客戶端不緩存文件數(shù)據(jù),只緩存主控服務(wù)器中獲取的元數(shù)據(jù),整體架構(gòu)如圖1所示。
1、租約機(jī)制
GFS系統(tǒng)中通過(guò)租約( lease)機(jī)制將chunk寫操作授權(quán)給ChunkServer。擁有租約授權(quán)的ChunkServe稱為主ChunkServer,其他副本所在的ChunkServer稱為備ChunkServer。租約授權(quán)針對(duì)單個(gè)chunk,在租約有效期內(nèi),對(duì)該chunk的寫操作都由主ChunkServer負(fù)責(zé),從而減輕Master的負(fù)載。一般來(lái)說(shuō),租約的有效期比較長(zhǎng),比如60秒,只要沒有出現(xiàn)異常,主ChunkServer可以不斷向Master請(qǐng)求延長(zhǎng)租約的有效期直到整個(gè)chunk寫滿。GFS為每個(gè)chunk維護(hù)一個(gè)版本號(hào),每次給chunk進(jìn)行租約授權(quán)或者主ChunkServer重新延長(zhǎng)租約有效期時(shí),Master會(huì)將chunk的版本號(hào)加1。
主ChunkServer向Master重新申請(qǐng)租約并增加對(duì)應(yīng)副本的版本號(hào),如果有備副本下線的話,重新上線后如果版本號(hào)太低,會(huì)被Master發(fā)現(xiàn),從而將其標(biāo)記為可刪除的chunk,Master的垃圾回收任務(wù)會(huì)定時(shí)檢查,并通知ChunkServer將此副本回收掉,從以上機(jī)制可見,版本號(hào)在整個(gè)機(jī)制中起到了至關(guān)重要的作用。
2、一致性模型
GFS主要是為了追加(append)而不是改寫(overwrite)而設(shè)計(jì)的。一方面是因?yàn)楦膶懙男枨蟊容^少,或者可以通過(guò)追加(加上版本號(hào))來(lái)實(shí)現(xiàn),比如可以只使用GFS的追加功能構(gòu)建分布式表格系統(tǒng)Bigtable;另一方面是因?yàn)樽芳拥囊恢滦阅P拖啾雀膶懸雍?jiǎn)單有效。這種模式下,可能出現(xiàn)記錄在某些副本中被追加了多次,即重復(fù)記錄;也可能出現(xiàn)一些可識(shí)別的填充記錄,應(yīng)用層需要能夠處理這些問(wèn)題(冪等)。GFS的這種一致性模型是追求性能導(dǎo)致的,這增加了應(yīng)用程序開發(fā)的難度。
3、追加流程
圖2中,分離數(shù)據(jù)流與控制流主要是為了優(yōu)化數(shù)據(jù)傳輸,每一臺(tái)機(jī)器都是把數(shù)據(jù)發(fā)送給網(wǎng)絡(luò)拓?fù)鋱D上“最近”的尚未收到數(shù)據(jù)的節(jié)點(diǎn)。
4、容錯(cuò)機(jī)制
- Master容錯(cuò)
操作日志+checkpoint+實(shí)時(shí)熱備。GFS Master的修改操作總是先記錄操作日志,然后修改內(nèi)存。當(dāng)Master發(fā)生故障重啟時(shí),可以通過(guò)磁盤中的操作日志恢復(fù)內(nèi)存數(shù)據(jù)結(jié)構(gòu)。另外,為了減少M(fèi)aster宕機(jī)恢復(fù)時(shí)間,Master會(huì)定期將內(nèi)存中的數(shù)據(jù)以checkpoint文件的形式轉(zhuǎn)儲(chǔ)到磁盤中,從而減少回放的日志量。所有的元數(shù)據(jù)修改操作都必須保證發(fā)送到實(shí)時(shí)熱備才算成功。
- ChunkServer容錯(cuò)
GFS采用復(fù)制多個(gè)副本的方式實(shí)現(xiàn)ChunkServer的容錯(cuò),另外,ChunkServer會(huì)對(duì)存儲(chǔ)的數(shù)據(jù)維持校驗(yàn)和。GFS以64MB為chunk大小來(lái)劃分文件,每個(gè)chunk又以Block為單位進(jìn)行劃分,Block大小為64KB,每個(gè)Block對(duì)應(yīng)一個(gè)32位的校驗(yàn)和。當(dāng)讀取一個(gè)chunk副本時(shí),ChunkServer會(huì)將讀取的數(shù)據(jù)和校驗(yàn)和進(jìn)行比較,如果不匹配,就會(huì)返回錯(cuò)誤,客戶端將選擇其他ChunkServer上的副本。
5、Master設(shè)計(jì)
由于GFS中的文件一般都是大文件,因此,文件命名空間占用內(nèi)存不多。這也就說(shuō)明了Master內(nèi)存容量不會(huì)成為GFS酌系統(tǒng)瓶頸;另外,從負(fù)載均衡的角度考慮,可以限制每個(gè)Chunk-Server“最近”創(chuàng)建的數(shù)量;每個(gè)chunk復(fù)制任務(wù)都有一個(gè)優(yōu)先級(jí),按照優(yōu)先級(jí)從高到低在Master排隊(duì)等待執(zhí)行;Master會(huì)定期掃描當(dāng)前副本的分布情況,如果發(fā)現(xiàn)磁盤使用量或者機(jī)器負(fù)載不均衡,將執(zhí)行重新負(fù)載均衡操作;在進(jìn)行副本重均衡時(shí),要注意限制拷貝速度,否則會(huì)影響性能。
- 垃圾回收
GFS采用延遲刪除的機(jī)制,Master定時(shí)檢查,如果發(fā)現(xiàn)文件刪除超過(guò)一段時(shí)間(默認(rèn)為3天,可配置),那么它會(huì)把文件從內(nèi)存元數(shù)據(jù)中刪除,為了減輕系統(tǒng)的負(fù)載,垃圾回收一般在服務(wù)低峰期執(zhí)行,比如每天晚上凌晨1:00開始。系統(tǒng)對(duì)每個(gè)chunk都維護(hù)了版本號(hào),過(guò)期的chunk可以通過(guò)版本號(hào)檢測(cè)出來(lái)。Master仍然通過(guò)正常的垃圾回收機(jī)制來(lái)刪除過(guò)期的副本。
- 快照
快照( Snapshot)操作是對(duì)源文件/目錄進(jìn)行一個(gè)“快照”操作,生成該時(shí)刻源文件/目錄的一個(gè)瞬間狀態(tài)存放于目標(biāo)文件/目錄中o GFS中使用標(biāo)準(zhǔn)的寫時(shí)復(fù)制機(jī)制生成快照,也就是說(shuō),“快照”只是增加GFS中chunk的引用計(jì)數(shù),表示這個(gè)chunk被快照文件引用了,等到客戶端修改這個(gè)chunk時(shí),才需要在ChunkServer中拷貝chunk的數(shù)據(jù)生成新的chunk,后續(xù)的修改操作落到新生成的chunk上。(不改就不拷貝,只引用)
6、 ChunkServer設(shè)計(jì)
Linux文件系統(tǒng)刪除64MB大文件消耗的時(shí)間太長(zhǎng)且沒有必要,因?yàn)镃hunkServer是一個(gè)磁盤和網(wǎng)絡(luò)IO密集型應(yīng)用,因此,刪除chunk時(shí)可以只將對(duì)應(yīng)的chunk文件移動(dòng)到每個(gè)磁盤的回收站,以后新建chunk的時(shí)候可以重用。
自動(dòng)化對(duì)系統(tǒng)的容錯(cuò)能力提出了很高的要求,Google在軟件層面的努力獲得了巨大的回報(bào),由于軟件層面能夠做到自動(dòng)化容錯(cuò),底層的硬件可以采用廉價(jià)的錯(cuò)誤率較高的硬件,比如廉價(jià)的SATA盤,這大大降低了云服務(wù)的人力及硬件成本。
Google的成功經(jīng)驗(yàn)也表明了一點(diǎn):?jiǎn)蜯aster的設(shè)計(jì)是可行的。單Master的設(shè)計(jì)不僅簡(jiǎn)化了系統(tǒng),而且還能夠較好的實(shí)現(xiàn)一致性。另外,Master維護(hù)的元數(shù)據(jù)很多,需要設(shè)計(jì)高效的數(shù)據(jù)結(jié)構(gòu),占用內(nèi)存小,并且能夠支持快照操作。支持寫時(shí)復(fù)制的B樹能夠滿足Master的元數(shù)據(jù)管理需求,然而,它的實(shí)現(xiàn)是相當(dāng)復(fù)雜的。
Taobao File System
TFS設(shè)計(jì)時(shí)采用的思路是:多個(gè)邏輯圖片文件共享一個(gè)物理文件。通過(guò)<塊ID,文件編號(hào)>來(lái)唯一確定一個(gè)文件。
1、系統(tǒng)架構(gòu)
- TFS整體架構(gòu)
NameServer通過(guò)心跳對(duì)DataServer的狀態(tài)進(jìn)行監(jiān)測(cè);每個(gè)DataServer上會(huì)運(yùn)行多個(gè)dsp進(jìn)程,一個(gè)dsp對(duì)應(yīng)一個(gè)掛載點(diǎn),這個(gè)掛載點(diǎn)一般對(duì)應(yīng)一個(gè)獨(dú)立磁盤,從而管理多塊磁盤,TFS中Block的實(shí)際數(shù)據(jù)都存儲(chǔ)在DataServer中,大小一般為64MB,默認(rèn)存儲(chǔ)三份。
TFS是寫少讀多的應(yīng)用,即使每次寫操作都需要經(jīng)過(guò)NameNode也不會(huì)出現(xiàn)問(wèn)題,這大大簡(jiǎn)化了系統(tǒng)的設(shè)計(jì),同一時(shí)刻每個(gè)Block只能有一個(gè)寫操作,多個(gè)客戶端的寫操作會(huì)被串行化??蛻舳耸紫认騈ameServer發(fā)起寫請(qǐng)求,NameServer需要根據(jù)DataServer上的可寫塊、容量和負(fù)載加權(quán)平均來(lái)選擇一個(gè)可寫的Block,并且在該Block所在的多個(gè)DataServer中選擇一個(gè)作為寫入的主副本(Primary),如果所有的副本都修改成功,主副本會(huì)首先通知NameServer更新Block的版本號(hào),成功以后才會(huì)返回客戶端操作結(jié)果,整個(gè)流程如圖3所示。
2、討論
相比GFS,TFS的寫流程不夠優(yōu)化,***,每個(gè)寫請(qǐng)求都需要多次訪問(wèn)NameServer;第二,數(shù)據(jù)推送也沒有采用流水線方式減小延遲。這也是由特定歷史時(shí)期的特定業(yè)務(wù)需求所決定的,淘寶的系統(tǒng)是需求驅(qū)動(dòng),用***的成本、最簡(jiǎn)單的方式解決用戶面臨的問(wèn)題,TFS NameServer不需要保存文件目錄樹信息,也不需要維護(hù)文件與Block之間的映射關(guān)系。
由于用戶可能上傳大量相同的圖片,因此,圖片上傳到TFS前,需要去重。一般在外部維護(hù)一套文件級(jí)別的去重系統(tǒng)( Dedup),采用MD5或者SHA1等Hash算法為圖片文件計(jì)算指紋( FingerPrint)。圖片寫入TFS之前首先到去重系統(tǒng)中查找是否存在指紋,如果已經(jīng)存在,基本可以認(rèn)為是重復(fù)圖片;圖片寫入TFS以后也需要將圖片的指紋以及在TFS中的位置信息保存到去重系統(tǒng)中。去重是一個(gè)鍵值存儲(chǔ)系統(tǒng),淘寶內(nèi)部使用Tair來(lái)進(jìn)行圖片去重。圖片的更新操作是在TFS中寫入新圖片,并在應(yīng)用系統(tǒng)的數(shù)據(jù)庫(kù)中保存新圖片的位置,圖片的刪除操作僅僅在應(yīng)用系統(tǒng)中將圖片刪除。
隨著系統(tǒng)的規(guī)模越來(lái)越大,商用軟件往往很難滿足需求,通過(guò)采用開源軟件與自主開發(fā)相結(jié)合的方式,可以有更好的可控性,系統(tǒng)也有更高的可擴(kuò)展性?;ヂ?lián)網(wǎng)技術(shù)的優(yōu)勢(shì)在于規(guī)模效應(yīng),隨著規(guī)模越來(lái)越大,單位成本也會(huì)越來(lái)越低。
3、內(nèi)容分發(fā)網(wǎng)絡(luò)
淘寶CDN采用分級(jí)存儲(chǔ)。由于緩存數(shù)據(jù)有較高的局部性,在Squid服務(wù)器上使用SSD+SAS+SATA混合存儲(chǔ),圖片隨著熱點(diǎn)變化而遷移,最熱門的存儲(chǔ)到SSD,中等熱度的存儲(chǔ)到SAS,輕熱度的存儲(chǔ)到SATA。通過(guò)這樣的方式,能夠很好地結(jié)合SSD的性能和SAS、SATA磁盤的成本優(yōu)勢(shì)。