Facebook - 150億張照片海量存貯架構

Facebook 的照片分享很受歡迎,迄今,Facebook 用戶已經上傳了150億張照片,加上縮略圖,總容量超過1.5PB,而每週新增的照片爲2億2000萬張,約25TB,高峯期,Facebook 每秒處理55萬張照片,這些數字讓如何管理這些數據成爲一個巨大的挑戰。本文由 Facebook 工程師撰寫,講述了他們是如何管理這些照片的。

舊的 NFS 照片架構

老的照片系統架構分以下幾個層:
# 上傳層接收用戶上傳的照片並保存在 NFS 存儲層。
# 照片服務層接收 HTTP 請求並從 NFS 存儲層輸出照片。
# NFS存儲層建立在商業存儲系統之上。

因爲每張照片都以文件形式單獨存儲,這樣龐大的照片量導致非常龐大的元數據規模,超過了 NFS 存儲層的緩存上限,導致每次招聘請求會上傳都包含多次I/O操作。龐大的元數據成爲整個照片架構的瓶頸。這就是爲什麼 Facebook 主要依賴 CDN 的原因。爲了解決這些問題,他們做了兩項優化:

# Cachr: 一個緩存服務器,緩存 Facebook 的小尺寸用戶資料照片。
# NFS文件句柄緩存:部署在照片輸出層,以降低 NFS 存儲層的元數據開銷。

新的 Haystack 照片架構

新的照片架構將輸出層和存儲層合併爲一個物理層,建立在一個基於 HTTP 的照片服務器上,照片存儲在一個叫做 haystack 的對象庫,以消除照片讀取操作中不必要的元數據開銷。新架構中,I/O 操作只針對真正的照片數據(而不是文件系統元數據)。haystack 可以細分爲以下幾個功能層:

# HTTP 服務器
# 照片存儲
# Haystack 對象存儲
# 文件系統
# 存儲空間

存儲

Haystack 部署在商業存儲刀片服務器上,典型配置爲一個2U的服務器,包含:

# 兩個4核CPU
# 16GB – 32GB 內存
# 硬件 RAID,含256-512M NVRAM 高速緩存
# 超過12個1TB SATA 硬盤

每個刀片服務器提供大約10TB的存儲能力,使用了硬件 RAID-6, RAID 6在保持低成本的基礎上實現了很好的性能和冗餘。不佳的寫性能可以通過高速緩存解決,硬盤緩存被禁用以防止斷電損失。

文件系統

Haystack 對象庫是建立在10TB容量的單一文件系統之上。文件系統中的每個文件都在一張區塊表中對應具體的物理位置,目前使用的文件系統爲 XFS。

Haystack 對象庫

Haystack 是一個簡單的日誌結構,存儲着其內部數據對象的指針。一個 Haystack 包括兩個文件,包括指針和索引文件:


Haystack 對象存儲結構

指針和索引文件結構




Haystack 寫操作

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

Haystack 讀操作

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

Haystack 刪除操作

刪除比較簡單,只是在 Haystack 存儲的指針上設置一個已刪除標誌。已經刪除的指針和索引的空間並不回收。

照片存儲服務器

照片存儲服務器負責接受 HTTP 請求,並轉換成相應的 Haystack 操作。爲了降低I/O操作,該服務器維護着全部 Haystack 中文件索引的緩存。服務器啓動時,系統就會將這些索引讀到緩存中。由於每個節點都有數百萬張照片,必須保證索引的容量不會超過服務器的物理內存。

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

每張圖片的索引緩存包含以下數據

Haystack 使用 Google 的開源 sparse hash data 結構以保證內存中的索引緩存儘可能小。

照片存儲的寫/修改操作

寫操作將照片數據寫到 Haystack 存儲並更新內存中的索引。如果索引中已經包含相同的 Key,說明是修改操作。

照片存儲的讀操作

傳遞到 Haystack 的參數包括 Haystack ID,照片的 Key, 尺寸以及 Cookie,服務器從緩存中查找併到 Haystack 中讀取真正的數據。

照片存儲的刪除操作

通知 Haystack 執行刪除操作之後,內存中的索引緩存會被更新,將便宜量設置爲0,表示照片已被刪除。

重新捆紮

重新捆紮會複製並建立新的 Haystack,期間,略過那些已經刪除的照片的數據,並重新建立內存中的索引緩存。

HTTP 服務器

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

結束語

Haystack 是一個基於 HTTP 的對象存儲,包含指向實體數據的指針,該架構消除了文件系統元數據的開銷,並實現將全部索引直接存儲到緩存,以最小的 I/O 操作實現對照片的存儲和讀取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章