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 的小尺寸用戶資料照片。spa

# 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 包括兩個文件,包括指針和索引文件:

Facebook 如何管理150億張照片 - summer - 夏天的技術資料

Haystack 對象存儲結構

Facebook 如何管理150億張照片 - summer - 夏天的技術資料

指針和索引文件結構

Facebook 如何管理150億張照片 - summer - 夏天的技術資料

Facebook 如何管理150億張照片 - summer - 夏天的技術資料

Haystack 寫操做

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

Haystack 讀操做

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

Haystack 刪除操做

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

照片存儲服務器

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

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

每張圖片的索引緩存包含如下數據Facebook 如何管理150億張照片 - summer - 夏天的技術資料

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

照片存儲的寫/修改操做

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

照片存儲的讀操做

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

照片存儲的刪除操做

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

從新捆紮

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

HTTP 服務器

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

結束語

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

相關文章
相關標籤/搜索