爲了減少對昂貴的存儲解決方案(諸如NetApp和Akamai,我所在的單位用了一套NetApp,性能和穩定性都不錯,價格當然也不菲),Facebook在2009年4月的時候推出了一套新的,名爲Haystack的圖片存儲系統,來一個對每個月85億次的圖片上傳(每天500G)。
Jason Sobel,NetApp的前工程師主持了這次改造,基本的架構來自於2008年的 Stanford ACM presentation by Jason Sobel。新的架構讓Facebook使用普通的服務器就能夠支撐圖片存儲的需求,減少了對CDN的依賴。
Facebook有兩種主要的圖片存儲類型,也是所有社交網站共同的特點:頭像和相冊。用戶上傳相冊,以檔案的形式存放,很少會刪除,也不會立即讀取。頭像則是每個人都會擁有,並且有不同的尺寸。過去,Facebook極度依賴CDN來保護自己的服務器遭受大量的訪問。
頭像則使用了 Cachr ,一個使用 evhttp 和 memcached 後臺的圖片服務器,能夠緩存那些被大量訪問的圖片。
不需要POSIX
Facebook的圖片被世界各地的人們瀏覽,圖片命名也包含了很多有用的信息。
/[pvid]_[key]_[magic]_[size].jpg
傳統的文件系統被POSIX標準通知,每個文件都需要有元數據和進入方法。這種文件系統是爲了權限管理而設計的,但是Internet中的文件系統則不需要這麼多額外的信息。
- File length
- Device ID
- Storage block pointers
- File owner
- Group owner
- Access rights on each assignment: read, write execute
- Change time
- Modification time
- Last access time
- Reference counts
Haystack 存儲10GB的數據只需要10Mb的元數據,這些原數據可以駐留在內存中,這樣讀取文件的時候就只需要一次磁盤尋道。Cachr仍然是第一道防線,快速的處理對於圖片的請求。