筆記-Facebook Haystack

Facebook目前存儲(chǔ)了2600億張照片稚矿,總大小為20PB,通過計(jì)算可以得出每張照片的平均大小為20PB/260GB,約為80KB。用戶每周新增照片數(shù)為10億(總大小為60TB)阳柔,平均每秒新增的照片數(shù)為10_{9}/7/40000(按每天40000s計(jì)),約為每秒3500次寫操作蚓峦,讀操作峰值可以達(dá)到每秒百萬次舌剂。

Facebook相冊(cè)后端早期采用基于NAS的存儲(chǔ)济锄,通過NFS掛載NAS中的照片文件來提供服務(wù)。后來出于性能和成本考慮霍转,自主研發(fā)了Facebook Haystack存儲(chǔ)相冊(cè)數(shù)據(jù)荐绝。

系統(tǒng)架構(gòu)

Facebook Haystack的思路與TFS類似,也是多個(gè)邏輯文件共享一個(gè)物理文件谴忧。Haystack架構(gòu)及讀請(qǐng)求處理流程如圖4-6所示很泊。


Haystack系統(tǒng)主要包括三個(gè)部分:目錄(Directory)角虫、存儲(chǔ)(Store)以及緩存(Cache)沾谓。Haystack存儲(chǔ)是物理存儲(chǔ)節(jié)點(diǎn),以物理卷軸(physical volume)的形式組織存儲(chǔ)空間戳鹅,每個(gè)物理卷軸一般都很大均驶,比如100GB,這樣10TB的數(shù)據(jù)也只需100個(gè)物理卷軸枫虏。每個(gè)物理卷軸對(duì)應(yīng)一個(gè)物理文件妇穴,因此,每個(gè)存儲(chǔ)節(jié)點(diǎn)上的物理文件元數(shù)據(jù)都很小隶债。多個(gè)物理存儲(chǔ)節(jié)點(diǎn)上的物理卷軸組成一個(gè)邏輯卷軸(logical volume)腾它,用于備份。Haystack目錄存放邏輯卷軸和物理卷軸的對(duì)應(yīng)關(guān)系死讹,以及照片id到邏輯卷軸之間的映射關(guān)系瞒滴。Haystack緩存主要用于解決對(duì)CDN提供商過于依賴的問題,提供最近增加的照片的緩存服務(wù)赞警。

Haystack照片讀取請(qǐng)求大致流程為:用戶訪問一個(gè)頁面時(shí)妓忍,Web服務(wù)器請(qǐng)求Haystack目錄構(gòu)造一個(gè)URL:http://<CDN>/<Cache>/<Machine id>/<Logical volume,Photo>,后續(xù)根據(jù)各個(gè)部分的信息依次訪問CDN愧旦、Haystack緩存和后端的Haystack存儲(chǔ)節(jié)點(diǎn)世剖。Haystack目錄構(gòu)造URL時(shí)可以省略<CDN>部分從而使得用戶直接請(qǐng)求Haystack緩存而不必經(jīng)過CDN。CDN笤虫。Haystack緩存收到的請(qǐng)求包含兩個(gè)部分:用戶瀏覽器的請(qǐng)求及CDN的請(qǐng)求旁瘫,Haystack緩存只緩存用戶瀏覽器發(fā)送的請(qǐng)求且要求請(qǐng)求的Haystack存儲(chǔ)節(jié)點(diǎn)是可寫的。一般來說琼蚯,Haystack后端的存儲(chǔ)節(jié)點(diǎn)寫一段時(shí)間以后達(dá)到容量上限變?yōu)橹蛔x境蜕,因此,可寫節(jié)點(diǎn)的照片為最近增加的照片凌停,是熱點(diǎn)數(shù)據(jù)粱年。本節(jié)暫不討論CDN,只討論Haystack后端存儲(chǔ)系統(tǒng)罚拟,包括Haystack目錄和Haystack緩存兩個(gè)部分台诗。

1.寫流程

如圖4-7所示完箩,Haystack的寫請(qǐng)求(照片上傳)處理流程為:Web服務(wù)器首先請(qǐng)求Haystack目錄獲取可寫的邏輯卷軸,接著生成照片唯一id并將數(shù)據(jù)寫入每一個(gè)對(duì)應(yīng)的物理卷軸(備份數(shù)一般為3)拉队。寫操作成功要求所有的物理卷軸都成功弊知,如果中間出現(xiàn)故障,需要重試粱快。


Haystack的一致性模型保證只要寫操作成功秩彤,邏輯卷軸對(duì)應(yīng)的所有物理卷軸都存在一個(gè)有效的照片文件,但有效照片文件在不同物理卷軸中的偏移(offset)可能不同事哭。

Haystack存儲(chǔ)節(jié)點(diǎn)只支持追加操作漫雷,如果需要更新一張照片,可以新增一張編號(hào)相同的照片到系統(tǒng)中鳍咱,如果新增照片和原有的照片在不同的邏輯卷軸降盹,Haystack目錄的元數(shù)據(jù)會(huì)更新為最新的邏輯卷軸;如果新增照片和原有的照片在相同的邏輯卷軸谤辜,Haystack存儲(chǔ)會(huì)以偏移更大的照片文件為準(zhǔn)蓄坏。

2.容錯(cuò)處理

(1)Haystack存儲(chǔ)節(jié)點(diǎn)容錯(cuò)

檢測(cè)到存儲(chǔ)節(jié)點(diǎn)故障時(shí),所有物理卷軸對(duì)應(yīng)的邏輯卷軸都被標(biāo)記為只讀丑念。存儲(chǔ)節(jié)點(diǎn)上的未完成的寫操作全部失敗涡戳,寫操作將重試;如果發(fā)生故障的存儲(chǔ)節(jié)點(diǎn)不可恢復(fù)脯倚,需要執(zhí)行一個(gè)拷貝任務(wù)渔彰,從其他副本所在的存儲(chǔ)節(jié)點(diǎn)拷貝丟失的物理卷軸的數(shù)據(jù);由于物理卷軸一般很大挠将,比如100GB胳岂,所以拷貝的過程會(huì)很長,一般為小時(shí)級(jí)別舔稀。

2)Haystack目錄容錯(cuò)

Haystack目錄采用主備數(shù)據(jù)庫(Replicated Database)做持久化存儲(chǔ)乳丰,由主備數(shù)據(jù)庫提供容錯(cuò)機(jī)制。

3.Haystack目錄

Haystack目錄的功能如下:

1)提供邏輯卷軸到物理卷軸的映射内贮,維護(hù)照片id到邏輯卷軸的映射产园;

2)提供負(fù)載均衡,為寫操作選擇邏輯卷軸夜郁,讀操作選擇物理卷軸什燕;

3)屏蔽CDN服務(wù),可以選擇某些圖片請(qǐng)求直接走Haystack緩存竞端;

4)標(biāo)記某些邏輯卷軸為只讀屎即。

根據(jù)前面的計(jì)算結(jié)果可知,F(xiàn)acebook相冊(cè)系統(tǒng)每秒的寫操作大約為3500次,每秒的讀請(qǐng)求大約為100萬次技俐。每個(gè)寫請(qǐng)求都需要通過Haystack緩存獲取可寫的卷軸乘陪,每個(gè)讀請(qǐng)求需要通過Haystack緩存構(gòu)造讀取URL。這里需要注意雕擂,照片id到邏輯卷軸的映射的數(shù)據(jù)量太大啡邑,單機(jī)內(nèi)存無法存放,筆者猜測(cè)內(nèi)部使用了MySQL Sharding集群井赌,另外谤逼,還增加了一個(gè)Memcache集群滿足查詢需求。

4.Haystack存儲(chǔ)

Haystack存儲(chǔ)保存物理卷軸仇穗,每個(gè)物理卷軸對(duì)應(yīng)文件系統(tǒng)中的一個(gè)物理文件流部,每個(gè)物理文件的格式如圖4-8所示。


多個(gè)照片文件存放在一個(gè)物理卷軸中仪缸,每個(gè)照片文件是一個(gè)Needle贵涵,包含實(shí)際數(shù)據(jù)及邏輯照片文件的元數(shù)據(jù)列肢。部分元數(shù)據(jù)需要裝載到內(nèi)存中用于照片查找恰画,包括Key(照片id,8字節(jié))瓷马,Alternate Key(照片規(guī)格拴还,包括Thumbnail、Small欧聘、Medium及Large片林,4字節(jié)),照片在物理卷軸的偏移Offset(4字節(jié))怀骤,照片的大小Size(4字節(jié))费封,每張照片占用8+8+4=20字節(jié)的空間,假設(shè)每臺(tái)機(jī)器的可用磁盤為8TB蒋伦,照片平均大小為80KB弓摘,單機(jī)存儲(chǔ)的照片數(shù)為8TB/80KB=100MB,占用內(nèi)存100MB×20=2GB痕届。

存儲(chǔ)節(jié)點(diǎn)宕機(jī)時(shí)韧献,需要恢復(fù)內(nèi)存中的邏輯照片查找表,掃描整個(gè)物理卷軸耗時(shí)太長研叫,因此锤窑,對(duì)每個(gè)物理卷軸維護(hù)了一個(gè)索引文件(Index File),保存每個(gè)Needle查找相關(guān)的元數(shù)據(jù)嚷炉。寫操作首先更新物理卷軸文件渊啰,然后異步更新索引文件。由于更新索引文件是異步的申屹,所以可能出現(xiàn)索引文件和物理卷軸文件不一致的情況绘证,不過由于對(duì)物理卷軸文件和索引文件的操作都是追加操作走搁,只需要掃描物理卷軸文件最后寫入的幾個(gè)Needle,然后補(bǔ)全索引文件即可迈窟。這種技術(shù)在僅支持追加的文件系統(tǒng)很常見私植。

Haystack Store存儲(chǔ)節(jié)點(diǎn)采用延遲刪除的回收策略,刪除照片只是向卷軸中追加一個(gè)帶有刪除標(biāo)記的Needle车酣,定時(shí)執(zhí)行Compaction任務(wù)回收已刪除空間曲稼。所謂Compaction操作,即將所有老數(shù)據(jù)文件中的數(shù)據(jù)掃描一遍湖员,以保留最新一個(gè)照片的原則進(jìn)行刪除贫悄,并生成新的數(shù)據(jù)文件。

討論

相比TFS,Haystack的一大特色就是磁盤空間回收娘摔。Blob文件在TFS中通過<Block id,Block offset>標(biāo)識(shí)窄坦,因此,不能對(duì)TFS中的數(shù)據(jù)塊進(jìn)行重整操作凳寺;而Haystack中的元信息只能定位到Blob文件所在的邏輯卷軸鸭津,Haystack存儲(chǔ)節(jié)點(diǎn)可以根據(jù)情況對(duì)物理卷軸進(jìn)行Compaction操作以回收磁盤空間。

Facebook Haystack中每個(gè)邏輯卷軸的大小為100GB肠缨,這樣減少了元信息逆趋,但是增加了遷移的時(shí)間。假設(shè)限制內(nèi)部網(wǎng)絡(luò)帶寬為20MB/s晒奕,那么遷移100GB的數(shù)據(jù)需要的時(shí)間為100GB/20MB/s=5000s闻书,大約是一個(gè)半小時(shí)。而TFS設(shè)計(jì)的數(shù)據(jù)規(guī)模相比Haystack要小脑慧,因此魄眉,可以選擇64MB的塊大小,有利于負(fù)載均衡闷袒。

另外坑律,Haystack使用RAID 6,并且底層文件系統(tǒng)使用性能更好的XFS霜运,淘寶TFS不使用RAID機(jī)制脾歇,文件系統(tǒng)使用Ext3,由應(yīng)用程序負(fù)責(zé)管理多個(gè)磁盤淘捡。Haystack使用了Akamai&Limelight的CDN服務(wù)藕各,而淘寶已經(jīng)使用自建的CDN,當(dāng)然焦除,F(xiàn)acebook也在考慮自建CDN激况。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乌逐,更是在濱河造成了極大的恐慌竭讳,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浙踢,死亡現(xiàn)場(chǎng)離奇詭異绢慢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洛波,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門胰舆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹬挤,你說我怎么就攤上這事缚窿。” “怎么了焰扳?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵倦零,是天一觀的道長。 經(jīng)常有香客問我吨悍,道長扫茅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任畜份,我火速辦了婚禮诞帐,結(jié)果婚禮上欣尼,老公的妹妹穿的比我還像新娘爆雹。我一直安慰自己,他們只是感情好愕鼓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布钙态。 她就那樣靜靜地躺著,像睡著了一般菇晃。 火紅的嫁衣襯著肌膚如雪册倒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天磺送,我揣著相機(jī)與錄音驻子,去河邊找鬼。 笑死估灿,一個(gè)胖子當(dāng)著我的面吹牛崇呵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馅袁,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼域慷,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起犹褒,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤抵窒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叠骑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體李皇,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年宙枷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疙赠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朦拖,死狀恐怖圃阳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情璧帝,我是刑警寧澤捍岳,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站睬隶,受9級(jí)特大地震影響锣夹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苏潜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一银萍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恤左,春花似錦贴唇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巧鸭,卻和暖如春瓶您,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纲仍。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工呀袱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郑叠。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓夜赵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锻拘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子油吭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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