HayStack是Fackbook用于存儲照片的系統(tǒng),其存儲照片的數(shù)量在千億數(shù)量級,本文簡要分析HayStack的設(shè)計(jì)與實(shí)現(xiàn)原理。
圖片存儲的幾個關(guān)鍵點(diǎn):
1. Metadata信息存儲。由于圖片數(shù)量巨大,單機(jī)存放不了所有的Metadata信息,假設(shè)每個圖片文件的Metadata占用100字節(jié),260 billion圖片Metadata占用的空間為260G * 100 = 26000GB。
2. 減少圖片讀取的IO次數(shù)。在普通的Linux文件系統(tǒng)中,讀取一個文件包括三次磁盤IO:讀取目錄元數(shù)據(jù)到內(nèi)存,把文件的inode節(jié)點(diǎn)裝載到內(nèi)存,最后讀取實(shí)際的文件內(nèi)容。由于文件數(shù)太多,無法將所有目錄及文件的inode信息緩存到內(nèi)存,因此磁盤IO次數(shù)很難達(dá)到每個圖片讀取只需要一次磁盤IO的理想狀態(tài)。
3. 圖片緩存。圖片寫入以后就不再修改,因此,需要對圖片進(jìn)行緩存并且將緩存放到離用戶最近的位置,一般會使用CDN技術(shù)。
HayStack的主要目標(biāo):
1. High throughput and low latency(高吞吐量、低延時):簡化元數(shù)據(jù)結(jié)構(gòu)與存儲模式,直接存儲文件在物理卷上的位置,減小lookup時間。
2. Fault-tolerant(容錯性):在不同的機(jī)器上維護(hù)多個副本
3. Cost-effective(高效):提高存儲空間利用率、提高請求處理效率。
4. Simple(簡單):易于實(shí)現(xiàn)和維護(hù),部署周期短。
HayStack的總體架構(gòu):
Haystack的寫請求(圖片上傳)處理流程為:Web Server首先請求Haystack Directory獲取圖片的id和可寫的邏輯卷軸,接著將數(shù)據(jù)寫入對應(yīng)的每一個物理卷軸(備份數(shù)一般為3)。
Haystack圖片讀取請求大致流程為:用戶訪問一個頁面時,Web Server請求Haystack Directory構(gòu)造一個URL:http:// / / / ,后續(xù)根據(jù)各個部分的信息依次訪問CDN,Cache和后端的Haystack Store存儲節(jié)點(diǎn)。Haystack Directory構(gòu)造URL時可以省略部分從而使得用戶直接請求Haystack Cache而不必經(jīng)過CDN。Haystack cache收到的請求包含兩個部分:用戶Browser的請求及CDN的請求,Haystack cache只緩存用戶Browser發(fā)送的請求且要求請求的Haystack Store存儲節(jié)點(diǎn)是可寫的。一般來說,Haystack Store的存儲節(jié)點(diǎn)寫一段時間以后達(dá)到容量上限變?yōu)橹蛔x,因此,可寫節(jié)點(diǎn)的圖片為最近增加的圖片,是熱點(diǎn)數(shù)據(jù)。
Haystack 刪除操作比較簡單,只是在 Haystack 存儲的指針上設(shè)置一個已刪除標(biāo)志,已經(jīng)刪除的指針和索引的空間并不回收??赏ㄟ^定期的對物理卷進(jìn)行合并,以回收已刪除的空間。
Haystack Directory的主要功能如下:
1, 提供邏輯卷軸到物理卷軸的映射,為寫請求分配圖片id;
2, 提供負(fù)載均衡,為寫操作選擇邏輯卷軸,讀操作選擇物理卷軸;
3, 屏蔽CDN服務(wù),可以選擇某些圖片請求直接走HayStack Cache;
4, 標(biāo)記某些邏輯卷軸為read-only;