Facebook圖片管理架構(gòu)
Facebook 的照片分享很受歡迎,迄今,F(xiàn)acebook 用戶已經(jīng)上傳了150億張照片,加上縮略圖,總?cè)萘砍^(guò)1.5PB,而每周新增的照片為2億2000萬(wàn)張,約25TB,高峰期,F(xiàn)acebook 每秒處理55萬(wàn)張照片,這些數(shù)字讓如何管理這些數(shù)據(jù)成為一個(gè)巨大的挑戰(zhàn)。本文由 Facebook 工程師撰寫(xiě),講述了他們是如何管理這些照片的。
舊的 NFS 照片架構(gòu)
老的照片系統(tǒng)架構(gòu)分以下幾個(gè)層:
# 上傳層接收用戶上傳的照片并保存在 NFS 存儲(chǔ)層。
# 照片服務(wù)層接收 HTTP 請(qǐng)求并從 NFS 存儲(chǔ)層輸出照片。
# NFS存儲(chǔ)層建立在商業(yè)存儲(chǔ)系統(tǒng)之上。
因?yàn)槊繌堈掌家晕募问絾为?dú)存儲(chǔ),這樣龐大的照片量導(dǎo)致非常龐大的元數(shù)據(jù)規(guī)模,超過(guò)了 NFS 存儲(chǔ)層的緩存上限,導(dǎo)致每次招聘請(qǐng)求會(huì)上傳都包含多次I/O操作。龐大的元數(shù)據(jù)成為整個(gè)照片架構(gòu)的瓶頸。這就是為什么 Facebook 主要依賴(lài) CDN 的原因。為了解決這些問(wèn)題,他們做了兩項(xiàng)優(yōu)化:
# Cachr: 一個(gè)緩存服務(wù)器,緩存 Facebook 的小尺寸用戶資料照片。
# NFS文件句柄緩存:部署在照片輸出層,以降低 NFS 存儲(chǔ)層的元數(shù)據(jù)開(kāi)銷(xiāo)。
新的 Haystack 照片架構(gòu)
新的照片架構(gòu)將輸出層和存儲(chǔ)層合并為一個(gè)物理層,建立在一個(gè)基于 HTTP 的照片服務(wù)器上,照片存儲(chǔ)在一個(gè)叫做 haystack 的對(duì)象庫(kù),以消除照片讀取操作中不必要的元數(shù)據(jù)開(kāi)銷(xiāo)。新架構(gòu)中,I/O 操作只針對(duì)真正的照片數(shù)據(jù)(而不是文件系統(tǒng)元數(shù)據(jù))。haystack 可以細(xì)分為以下幾個(gè)功能層:
# HTTP 服務(wù)器
# 照片存儲(chǔ)
# Haystack 對(duì)象存儲(chǔ)
# 文件系統(tǒng)
# 存儲(chǔ)空間
存儲(chǔ)
Haystack 部署在商業(yè)存儲(chǔ)刀片服務(wù)器上,典型配置為一個(gè)2U的服務(wù)器,包含:
# 兩個(gè)4核CPU
# 16GB – 32GB 內(nèi)存
# 硬件 RAID,含256-512M NVRAM 高速緩存
# 超過(guò)12個(gè)1TB SATA 硬盤(pán)
每個(gè)刀片服務(wù)器提供大約10TB的存儲(chǔ)能力,使用了硬件 RAID-6, RAID 6在保持低成本的基礎(chǔ)上實(shí)現(xiàn)了很好的性能和冗余。不佳的寫(xiě)性能可以通過(guò)高速緩存解決,硬盤(pán)緩存被禁用以防止斷電損失。
文件系統(tǒng)
Haystack 對(duì)象庫(kù)是建立在10TB容量的單一文件系統(tǒng)之上。文件系統(tǒng)中的每個(gè)文件都在一張區(qū)塊表中對(duì)應(yīng)具體的物理位置,目前使用的文件系統(tǒng)為 XFS。
Haystack 對(duì)象庫(kù)
Haystack 是一個(gè)簡(jiǎn)單的日志結(jié)構(gòu),存儲(chǔ)著其內(nèi)部數(shù)據(jù)對(duì)象的指針。一個(gè) Haystack 包括兩個(gè)文件,包括指針和索引文件:
Haystack 對(duì)象存儲(chǔ)結(jié)構(gòu)
指針和索引文件結(jié)構(gòu)
Haystack 寫(xiě)操作
Haystack 寫(xiě)操作同步將指針追加到 haystack 存儲(chǔ)文件,當(dāng)指針?lè)e累到一定程度,就會(huì)生成索引寫(xiě)到索引文件。為了降低硬件故障帶來(lái)的損失,索引文件還會(huì)定期寫(xiě)道存儲(chǔ)空間中。
Haystack 讀操作
傳到 haystack 讀操作的參數(shù)包括指針的偏移量,key,代用Key,Cookie 以及數(shù)據(jù)尺寸。Haystack 于是根據(jù)數(shù)據(jù)尺寸從文件中讀取整個(gè)指針。
Haystack 刪除操作
刪除比較簡(jiǎn)單,只是在 Haystack 存儲(chǔ)的指針上設(shè)置一個(gè)已刪除標(biāo)志。已經(jīng)刪除的指針和索引的空間并不回收。
照片存儲(chǔ)服務(wù)器
照片存儲(chǔ)服務(wù)器負(fù)責(zé)接受 HTTP 請(qǐng)求,并轉(zhuǎn)換成相應(yīng)的 Haystack 操作。為了降低I/O操作,該服務(wù)器維護(hù)著全部 Haystack 中文件索引的緩存。服務(wù)器啟動(dòng)時(shí),系統(tǒng)就會(huì)將這些索引讀到緩存中。由于每個(gè)節(jié)點(diǎn)都有數(shù)百萬(wàn)張照片,必須保證索引的容量不會(huì)超過(guò)服務(wù)器的物理內(nèi)存。
對(duì)于用戶上傳的圖片,系統(tǒng)分配一個(gè)64位的獨(dú)立ID,照片接著被縮放成4種不同尺寸,每種尺寸的圖擁有相同的隨機(jī) Cookie 和 ID,圖片尺寸描述(大,中,小,縮略圖)被存在代用key 中。接著上傳服務(wù)器通知照片存儲(chǔ)服務(wù)器將這些資料聯(lián)通圖片存儲(chǔ)到 haystack 中。
每張圖片的索引緩存包含以下數(shù)據(jù)
Haystack 使用 Google 的開(kāi)源 sparse hash data 結(jié)構(gòu)以保證內(nèi)存中的索引緩存盡可能小。
照片存儲(chǔ)的寫(xiě)/修改操作
寫(xiě)操作將照片數(shù)據(jù)寫(xiě)到 Haystack 存儲(chǔ)并更新內(nèi)存中的索引。如果索引中已經(jīng)包含相同的 Key,說(shuō)明是修改操作。
照片存儲(chǔ)的讀操作
傳遞到 Haystack 的參數(shù)包括 Haystack ID,照片的 Key, 尺寸以及 Cookie,服務(wù)器從緩存中查找并到 Haystack 中讀取真正的數(shù)據(jù)。
照片存儲(chǔ)的刪除操作
通知 Haystack 執(zhí)行刪除操作之后,內(nèi)存中的索引緩存會(huì)被更新,將便宜量設(shè)置為0,表示照片已被刪除。
重新捆扎
重新捆扎會(huì)復(fù)制并建立新的 Haystack,期間,略過(guò)那些已經(jīng)刪除的照片的數(shù)據(jù),并重新建立內(nèi)存中的索引緩存。
HTTP 服務(wù)器
Http 框架使用的是簡(jiǎn)單的 evhttp 服務(wù)器。使用多線程,每個(gè)線程都可以單獨(dú)處理一個(gè) HTTP 請(qǐng)求。
結(jié)束語(yǔ)
Haystack 是一個(gè)基于 HTTP 的對(duì)象存儲(chǔ),包含指向?qū)嶓w數(shù)據(jù)的指針,該架構(gòu)消除了文件系統(tǒng)元數(shù)據(jù)的開(kāi)銷(xiāo),并實(shí)現(xiàn)將全部索引直接存儲(chǔ)到緩存,以最小的 I/O 操作實(shí)現(xiàn)對(duì)照片的存儲(chǔ)和讀取。
本文國(guó)際來(lái)源:http://www.facebook.com/FacebookEngineering#/note.php?note_id=76191543919&ref=mf
中文翻譯來(lái)源:COMSHARP CMS 官方網(wǎng)站
- 目前還沒(méi)評(píng)論,等你發(fā)揮!