天天看點

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 包括兩個檔案,包括指針和索引檔案:

Facebook 如何管理150億張照片

Haystack 對象存儲結構

Facebook 如何管理150億張照片

指針和索引檔案結構

Facebook 如何管理150億張照片
Facebook 如何管理150億張照片

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億張照片

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

照片存儲的寫/修改操作

寫操作将照片資料寫到 Haystack 存儲并更新記憶體中的索引。如果索引中已經包含相同的 Key,說明是修改操作。

照片存儲的讀操作

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

照片存儲的删除操作

通知 Haystack 執行删除操作之後,記憶體中的索引緩存會被更新,将便宜量設定為0,表示照片已被删除。

重新捆紮

重新捆紮會複制并建立新的 Haystack,期間,略過那些已經删除的照片的資料,并重建立立記憶體中的索引緩存。

HTTP 伺服器

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

結束語

Haystack 是一個基于 HTTP 的對象存儲,包含指向實體資料的指針,該架構消除了檔案系統中繼資料的開銷,并實作将全部索引直接存儲到緩存,以最小的 I/O 操作實作對照片的存儲和讀取。

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

中文翻譯來源:COMSHARP CMS 官方網站

繼續閱讀