Facebook圖片管理架構(gòu)

0 評論 8460 瀏覽 1 收藏 8 分鐘

Facebook 的照片分享很受歡迎,迄今,F(xiàn)acebook 用戶已經(jīng)上傳了150億張照片,加上縮略圖,總?cè)萘砍^1.5PB,而每周新增的照片為2億2000萬張,約25TB,高峰期,F(xiàn)acebook 每秒處理55萬張照片,這些數(shù)字讓如何管理這些數(shù)據(jù)成為一個巨大的挑戰(zhàn)。本文由 Facebook 工程師撰寫,講述了他們是如何管理這些照片的。

舊的 NFS 照片架構(gòu)
老的照片系統(tǒng)架構(gòu)分以下幾個層:
# 上傳層接收用戶上傳的照片并保存在 NFS 存儲層。
# 照片服務(wù)層接收 HTTP 請求并從 NFS 存儲層輸出照片。
# NFS存儲層建立在商業(yè)存儲系統(tǒng)之上。

因為每張照片都以文件形式單獨存儲,這樣龐大的照片量導(dǎo)致非常龐大的元數(shù)據(jù)規(guī)模,超過了 NFS 存儲層的緩存上限,導(dǎo)致每次招聘請求會上傳都包含多次I/O操作。龐大的元數(shù)據(jù)成為整個照片架構(gòu)的瓶頸。這就是為什么 Facebook 主要依賴 CDN 的原因。為了解決這些問題,他們做了兩項優(yōu)化:
# Cachr: 一個緩存服務(wù)器,緩存 Facebook 的小尺寸用戶資料照片。
# NFS文件句柄緩存:部署在照片輸出層,以降低 NFS 存儲層的元數(shù)據(jù)開銷。

新的 Haystack 照片架構(gòu)
新的照片架構(gòu)將輸出層和存儲層合并為一個物理層,建立在一個基于 HTTP 的照片服務(wù)器上,照片存儲在一個叫做 haystack 的對象庫,以消除照片讀取操作中不必要的元數(shù)據(jù)開銷。新架構(gòu)中,I/O 操作只針對真正的照片數(shù)據(jù)(而不是文件系統(tǒng)元數(shù)據(jù))。haystack 可以細分為以下幾個功能層:
# HTTP 服務(wù)器
# 照片存儲
# Haystack 對象存儲
# 文件系統(tǒng)
# 存儲空間

存儲
Haystack 部署在商業(yè)存儲刀片服務(wù)器上,典型配置為一個2U的服務(wù)器,包含:
# 兩個4核CPU
# 16GB – 32GB 內(nèi)存
# 硬件 RAID,含256-512M NVRAM 高速緩存
# 超過12個1TB SATA 硬盤

每個刀片服務(wù)器提供大約10TB的存儲能力,使用了硬件 RAID-6, RAID 6在保持低成本的基礎(chǔ)上實現(xiàn)了很好的性能和冗余。不佳的寫性能可以通過高速緩存解決,硬盤緩存被禁用以防止斷電損失。
文件系統(tǒng)
Haystack 對象庫是建立在10TB容量的單一文件系統(tǒng)之上。文件系統(tǒng)中的每個文件都在一張區(qū)塊表中對應(yīng)具體的物理位置,目前使用的文件系統(tǒng)為 XFS。
Haystack 對象庫
Haystack 是一個簡單的日志結(jié)構(gòu),存儲著其內(nèi)部數(shù)據(jù)對象的指針。一個 Haystack 包括兩個文件,包括指針和索引文件:

Haystack 對象存儲結(jié)構(gòu)

haystack2

haystack3

指針和索引文件結(jié)構(gòu)

Haystack 寫操作
Haystack 寫操作同步將指針追加到 haystack 存儲文件,當(dāng)指針積累到一定程度,就會生成索引寫到索引文件。為了降低硬件故障帶來的損失,索引文件還會定期寫道存儲空間中。

Haystack 讀操作
傳到 haystack 讀操作的參數(shù)包括指針的偏移量,key,代用Key,Cookie 以及數(shù)據(jù)尺寸。Haystack 于是根據(jù)數(shù)據(jù)尺寸從文件中讀取整個指針。

Haystack 刪除操作
刪除比較簡單,只是在 Haystack 存儲的指針上設(shè)置一個已刪除標(biāo)志。已經(jīng)刪除的指針和索引的空間并不回收。

照片存儲服務(wù)器
照片存儲服務(wù)器負責(zé)接受 HTTP 請求,并轉(zhuǎn)換成相應(yīng)的 Haystack 操作。為了降低I/O操作,該服務(wù)器維護著全部 Haystack 中文件索引的緩存。服務(wù)器啟動時,系統(tǒng)就會將這些索引讀到緩存中。由于每個節(jié)點都有數(shù)百萬張照片,必須保證索引的容量不會超過服務(wù)器的物理內(nèi)存。

對于用戶上傳的圖片,系統(tǒng)分配一個64位的獨立ID,照片接著被縮放成4種不同尺寸,每種尺寸的圖擁有相同的隨機 Cookie 和 ID,圖片尺寸描述(大,中,小,縮略圖)被存在代用key 中。接著上傳服務(wù)器通知照片存儲服務(wù)器將這些資料聯(lián)通圖片存儲到 haystack 中。

每張圖片的索引緩存包含以下數(shù)據(jù)

haystack4

Haystack 使用 Google 的開源 sparse hash data 結(jié)構(gòu)以保證內(nèi)存中的索引緩存盡可能小。
照片存儲的寫/修改操作
寫操作將照片數(shù)據(jù)寫到 Haystack 存儲并更新內(nèi)存中的索引。如果索引中已經(jīng)包含相同的 Key,說明是修改操作。

照片存儲的讀操作
傳遞到 Haystack 的參數(shù)包括 Haystack ID,照片的 Key, 尺寸以及 Cookie,服務(wù)器從緩存中查找并到 Haystack 中讀取真正的數(shù)據(jù)。

照片存儲的刪除操作
通知 Haystack 執(zhí)行刪除操作之后,內(nèi)存中的索引緩存會被更新,將便宜量設(shè)置為0,表示照片已被刪除。

重新捆扎
重新捆扎會復(fù)制并建立新的 Haystack,期間,略過那些已經(jīng)刪除的照片的數(shù)據(jù),并重新建立內(nèi)存中的索引緩存。

HTTP 服務(wù)器
Http 框架使用的是簡單的 evhttp 服務(wù)器。使用多線程,每個線程都可以單獨處理一個 HTTP 請求。

結(jié)束語
Haystack 是一個基于 HTTP 的對象存儲,包含指向?qū)嶓w數(shù)據(jù)的指針,該架構(gòu)消除了文件系統(tǒng)元數(shù)據(jù)的開銷,并實現(xiàn)將全部索引直接存儲到緩存,以最小的 I/O 操作實現(xiàn)對照片的存儲和讀取。

本文國際來源:http://www.facebook.com/FacebookEngineering#/note.php?note_id=76191543919&ref=mf

中文翻譯來源:COMSHARP CMS 官方網(wǎng)站

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發(fā)揮!