前言web
Facebook(後面簡稱fb)是世界最大的社交平臺,須要存儲的數據時刻都在劇增(佔比最大爲圖片,天天存儲約20億張,大概是微信的三倍)。面試
那麼問題來了,fb是如何存儲兆級別的圖片?而且又是如何處理每秒百萬級別的圖片查詢?瀏覽器
本文以簡單易懂,圖文並茂的方式來解釋其中的原理,並不涉及空洞,難解的框架,也沒有大篇章的廢話鋪陳,只有痛點與反思;就如同fb的架構師所說:fb的存儲架構就像高速公路上換輪胎,沒有最完美的設計,咱們最求的只是如何讓它變得更簡單。緩存
短篇介紹服務器
fb的圖片存儲系統叫作HayStack,目前已存儲超過120PB的數據,用戶天天會上傳20億張圖片。fb圖片搜索峯值,須要提供每秒100-200萬張的圖片搜索。這些數據還再不斷地增長。微信
稍微分析下用戶使用場景,圖片寫入一次,頻繁讀取,從不修改,不多刪除。傳統的文件系統:每一個圖片都會有一些元數據,在咱們的需求中,這些信息無用,且浪費存儲空間,更大的性能消耗是文件的元數據須要從磁盤讀到內存中來定位圖片位置,在fb的量級上,元數據的吞吐量即是一個巨大的瓶頸。架構
高吞吐量,低延遲是HayStack所追求的,因此HayStack但願每一個圖片讀取操做至多須要一個磁盤,而且減小每一個圖片的必要元數據,並將它們保存至內存中。爲了作好容災,HayStack會將圖片複製多張並保存至不通數據中心,以確保不反回404,error給客戶。負載均衡
典型的設計方案框架
上圖爲典型的設計方案:分佈式
1.用戶經過瀏覽器發送圖片信息請求至web server;2.web server 構造一個url,引導瀏覽器到對應位置下載圖片;3.一般這個url指向一個CDN,若是CDN有緩存相關圖片的話,它會將圖片馬上返回給瀏覽器;4.不然,會解析url,並在Photo Storage中找到對應的圖片;5.6.返回給用戶。
NAS-NFS
在fb的服務中,只有CDN不足以解決所有需求,對於新圖片,熱門圖片CDN確實很高效。可是對於一些我的上傳的老圖片請求,CDN基本上會所有命中失敗,又沒有辦法將圖片所有緩存起來。因此這裏,能夠採用NAS-NFS來解決問題。
基本操做與上面相同,5.6.photo store server 解析url得出完整的卷和路徑信息,在NFS上讀取數據,而後返回給CDN。
這種設計的瓶頸:NFS卷的每一個目錄下存儲上千張圖片,致使讀取時產生了過多的磁盤操做。
HayStack
HayStack架構包含3個核心組件:HayStack Store,HayStack Directory和HayStack Cache。 Store是存儲系統,負責管理圖片的元數據。不一樣機器上的物理卷對應一個邏輯卷,HayStack將一個圖片保存至一個邏輯卷時,那麼圖片便對應寫入全部物理卷。Directory 維護了邏輯到物理卷的映射以及相應的元數據,例如說,某張圖片保存在哪一個物理卷裏,某個物理卷的存儲空間等。Cache的功能,相似內部的CDN,它幫Store擋住熱門搜索。
上圖描述了3個核心組件的相互做用。在HayStack架構中,瀏覽器的請求被引導至CDN中(或Cache上),Cache本質就是CDN,爲了不衝突,咱們使用CDN來表示外部系統,使用Cache表示內部系統。
1.當用戶發出請求給web server,2.web server 使用Directory來構建圖片的url,3.4.5.6.7.8.9.10.url包含一段信息,以下:
http(s)://CDN/Cache/machine_id/volume_ID_Photo
一目瞭然,url包含CDN地址信息,Cache信息,以及保存圖片的物理卷ID,以及圖片信息。
圖4,位用戶上傳圖片的流程,1.用戶發送請求至web server;2.web server請求Directory一個可用的邏輯卷,物理卷,並將圖片信息記錄下;3.將相關信息發送至web server;4.web server將圖片上傳至Store;5.返回成功信息。
Directory
主要有4個功能:
1.它提供了邏輯捲到物理卷的映射,web服務器上傳或讀取圖片時須要使用這個映射。
2.它在分配寫請求,讀請求到物理卷時,需保證負載均衡。
3.它決定一個圖片的請求,是發送至CDN或Cache,這個決定能夠動態調整是否依賴CDN。
4.它指定哪些卷是隻讀的。
當咱們增長Store的時候,那些卷都是可寫的,可寫的機器會收到上傳信息。當它們到達容量上限時,標記它們爲只讀。
Cache
Cache的實現能夠理解爲一個分佈式Hash Table,以圖片ID爲key,定位緩存的圖片數據。若是Cache未命中,那麼Cache則根據URL到指定的Store中,讀取圖片數據。
Store
很簡單,根據提供的一些元數據信息,包括圖片ID,邏輯卷ID,物理卷ID,找到對應的圖片,未找到則返回錯誤信息。
下面簡單描述一下物理卷與映射的結構,一個物理卷能夠理解爲一個大型文件,包含一系列的needle,每一個needle就是一張圖片。以下圖所示。
爲了快速索引needle,Store須要爲每一個卷提供一個內存中的key-value映射。
HayStack文件系統
HayStack能夠理解成基於Unix文件系統搭建的對象存儲架構。Store使用的文件系統是XFS,XFS有兩個優勢,首先,XFS中的臨近大型文件的blockmap很小,可放入內存存儲。再者,XFS提供高效的文件預分配,減小磁盤碎片問題。使用XFS,能夠徹底避免檢索文件系統致使的磁盤操做。
文末也給你們,分享主要有C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK技術,面試技巧方面的資料技術討論。
感興趣的朋友能夠加羣:812855908