Facebook 如何管理150億張照片
作者: its
|
發布: 2009/5/1 (上午 08:46)
|
閱讀: 20022
|
評論: 0
|
靜態地址
|
內容源碼
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 操作實現對照片的存儲和讀取。
本文國際來源:http://www.facebook.com/FacebookEngineering#/note.php?note_id=76191543919&ref=mf 中文翻譯來源:COMSHARP CMS 官方網站
|