分享照片是Facebook上最流行的的功能之一。截至目前,使用者已經上傳超過15億張照片,這使得Facebook成為最大的照片分享網站。對於每一個上傳的照片,Facebook都產生並儲存四個大小不同的映像,從而轉化為共60億張照片,總容量超過1.5PB。目前以每周220萬新照片的速度增長,相當於每周要額外增加25TB儲存。在高峰期每秒需要傳輸55萬照片。這些數字對Facebook的照片儲存基礎設施的一個重大的挑戰。
舊的 NFS 照片架構
老的照片系統架構分以下幾個層:
上傳層接收使用者上傳的照片並儲存在 NFS 儲存層。
照片服務層接收 HTTP 要求並從 NFS 儲存層輸出照片。
NFS儲存層建立在商業儲存系統之上。
因為每張照片都以檔案形式單獨儲存,這樣龐大的照片量導致非常龐大的中繼資料規模,超過了 NFS 儲存層的緩衝上限,導致每次請求上傳都包含多次I/O操作。龐大的中繼資料成為整個照片架構的瓶頸。這就是為什麼 Facebook 主要依賴 CDN 的原因。為瞭解決這些問題,他們做了兩項最佳化:
因為每張照片都以檔案形式單獨儲存,大量為目錄及檔案在NFS 儲存層上產生了大量的中繼資料, 這個規模的中繼資料量遠遠超過了超過了NFS 儲存層的緩衝上限,導致每次招聘請求會上傳都包含多次I/O操作。龐大的中繼資料成為整個照片架構的瓶頸。這就是為什麼 Facebook主要依賴 CDN 的原因。為瞭解決這些問題,他們做了兩項最佳化:
Cachr: 一個快取服務器,緩衝 Facebook 的小尺寸使用者資料照片。
NFS檔案控制代碼緩衝:部署在照片輸出層,以降低 NFS 儲存層的中繼資料開銷。
新的 Haystack 照片架構
新的照片架構將輸出層和儲存層合并為一個物理層,建立在一個基於HTTP 的照片伺服器上,照片儲存在一個叫做haystack 的物件程式庫,以消除照片讀取操作中不必要的中繼資料開銷。新架構中,I/O 操作只針對真正的照片資料(而不是檔案系統中繼資料)。haystack 可以細分為以下幾個功能層:
HTTP 伺服器
照片儲存
Haystack Object Storage Service
檔案系統
儲存空間
在下面的介紹中,我們會對於上述的每個功能層做詳細的講述。
儲存空間
Haystack 部署在商業儲存刀片伺服器上,典型配置為一個2U的伺服器,包含:
兩個4核CPU
16GB – 32GB 記憶體
硬體 RAID,含256-512M NVRAM 快取
超過12個1TB SATA 硬碟
每個刀片伺服器提供大約10TB的儲存能力,使用了硬體 RAID-6, RAID 6在保持低成本的基礎上實現了很好的效能和冗餘。不佳的寫效能可以通過RAID控制器和NVRAM緩衝回寫解決,寫由於讀取大多是隨機的,NVRAM緩衝是完全用於寫入的。
檔案系統
Haystack 物件程式庫是建立在10TB容量的單一檔案系統之上。
圖片讀取請求需要在讀取系統調用這些檔案的位置位移,但是為了執行讀取操作,檔案系統必須先找到實際物理卷上的資料。檔案系統中的每個檔案都被一個叫做inode結構標識。inode包含了一個磁碟上邏輯檔案位移和物理區塊位移的映射。在使用的特殊類型檔案系統時大檔案區塊對應可能相當大。
基於檔案系統的區塊為給個邏輯區塊和大檔案儲存映射。這些資訊通常不適合儲存在inode的緩衝中,而是儲存在在間接地址塊。所以在讀取檔案的時候必須按照特定的流程。這裡可以多個是間接地址塊,所以一個讀取會產生多個I/O取決於是否間接地址塊被緩衝。
該系統只為連續範圍的區塊保持映射。一個連續的大檔案的區塊對應可以只由一個範圍的標識,這樣是適應inode的系統需求的。但是,如果該檔案是一個被切割的不連續的塊的話,他的塊地圖可能非常的大。以上可以通過檔案系統主動為大的物理檔案分配大塊的空間來減少片段。
目前使用的檔案系統為XFS,一個很大程度提供高效的檔案預分配系統。
Haystack Object Storage Service
Haystack 是一個簡單的日誌結構(只能追加),儲存著其內部資料對象的指標。一個 Haystack 包括兩個檔案,包括指標和索引。下面的圖片將描述haystack隱藏檔的布局:
haystack最前面的8K儲存是被超級塊佔用。緊隨超級塊是針,每針組成的一個頭部,資料和尾部: