HayStack是Fackbook用于存儲照片的系統,其存儲照片的數量在千億數量級,本文簡要分析HayStack的設計與實作原理。
圖檔存儲的幾個關鍵點:
1. Metadata資訊存儲。由于圖檔數量巨大,單機存放不了所有的Metadata資訊,假設每個圖檔檔案的Metadata占用100位元組,260 billion圖檔Metadata占用的空間為260G * 100 = 26000GB。
2. 減少圖檔讀取的IO次數。在普通的Linux檔案系統中,讀取一個檔案包括三次磁盤IO:讀取目錄中繼資料到記憶體,把檔案的inode節點裝載到記憶體,最後讀取實際的檔案内容。由于檔案數太多,無法将所有目錄及檔案的inode資訊緩存到記憶體,是以磁盤IO次數很難達到每個圖檔讀取隻需要一次磁盤IO的理想狀态。
3. 圖檔緩存。圖檔寫入以後就不再修改,是以,需要對圖檔進行緩存并且将緩存放到離使用者最近的位置,一般會使用CDN技術。
HayStack的主要目标:
1. High throughput and low latency(高吞吐量、低延時):簡化中繼資料結構與存儲模式,直接存儲檔案在實體卷上的位置,減小lookup時間。
2. Fault-tolerant(容錯性):在不同的機器上維護多個副本
3. Cost-effective(高效):提高存儲空間使用率、提高請求處理效率。
4. Simple(簡單):易于實作和維護,部署周期短。
HayStack的總體架構:

Haystack的寫請求(圖檔上傳)處理流程為:Web Server首先請求Haystack Directory擷取圖檔的id和可寫的邏輯卷軸,接着将資料寫入對應的每一個實體卷軸(備份數一般為3)。
Haystack圖檔讀取請求大緻流程為:使用者通路一個頁面時,Web Server請求Haystack Directory構造一個URL:http:// <CDN> / <Cache> / <Machine id> / <Logical volume, Photo>,後續根據各個部分的資訊依次通路CDN,Cache和後端的Haystack Store存儲節點。Haystack Directory構造URL時可以省略<CDN>部分進而使得使用者直接請求Haystack Cache而不必經過CDN。Haystack cache收到的請求包含兩個部分:使用者Browser的請求及CDN的請求,Haystack cache隻緩存使用者Browser發送的請求且要求請求的Haystack Store存儲節點是可寫的。一般來說,Haystack Store的存儲節點寫一段時間以後達到容量上限變為隻讀,是以,可寫節點的圖檔為最近增加的圖檔,是熱點資料。
Haystack 删除操作比較簡單,隻是在 Haystack 存儲的指針上設定一個已删除标志,已經删除的指針和索引的空間并不回收。可通過定期的對實體卷進行合并,以回收已删除的空間。
Haystack Directory的主要功能如下:
1, 提供邏輯卷軸到實體卷軸的映射,為寫請求配置設定圖檔id;
2, 提供負載均衡,為寫操作選擇邏輯卷軸,讀操作選擇實體卷軸;
3, 屏蔽CDN服務,可以選擇某些圖檔請求直接走HayStack Cache;
4, 标記某些邏輯卷軸為read-only;
HayStack中的圖檔順序的存放在實體卷中,擷取圖檔在實體卷中的偏移即可讀取圖檔,圖檔的存儲結構如下所示(每張圖檔稱為一個needle)。
其中,key為圖檔的唯一标示,alternate key為尺寸的标示,flag為删除标志,size為資料大小,data為實際的資料。
HayStack為每張圖檔在記憶體中維護圖檔與其位置的映射表,在圖檔被寫入時更新映射關系,每次系統啟動時可通過讀取實體卷并構造映射表,但這樣做很耗時間,但HayStack通過為每張圖檔構造index file來簡化了系統啟動時映射表的建構,index file的結構如下所示:(其主要包含key與對應圖檔位置的映射關系,系統啟動時,通過讀取index file便能很快的構造映射表。)
HayStack的設計與技術細節參考:
1. Doug Beaver,etc. Finding a needle in Haystack: Facebook’s photo storage.
2. http://www.nosqlnotes.net/archives/116
3. http://www.bookfm.com/discussion/discussionview.html?did=100145
HayStack的幾點優勢:
1. 采用輕量級的HayStack Directory維護邏輯卷到多個實體卷的映射關系,友善的實作了副本技術,以實作系統容錯。
2. 簡化檔案的中繼資料結構,以追加寫的方式往實體卷中存儲圖檔,效率高。同時将圖檔key與位置的映射關系全部保留在記憶體中,通過一次lookup即可擷取圖檔的位置。
3. 實體卷中所有的圖檔都對應有index檔案(固定大小,結構簡單),進而每次系統重新開機時,實體卷的映射資訊能快速的通過index檔案建構。
4. 引入delete flag、compaction、batch upload以及進一步提高存儲的效率。
轉載于:https://www.cnblogs.com/yunnotes/archive/2013/04/19/3032393.html