百度網盤背后的存儲系統atlas
百度網盤免費提供2TB存儲, 它的存儲量一定是驚人的, 支持它的存儲系統atlas也是相當不錯的。 atlas是一個KV存儲, 支持GET/PUT/DELETE三個接口, 看起來接口簡單, 但要做好這么一個大規模系統非常不易, 我們來看看atlas到底長啥樣。
atlas基于如圖所示arm存儲機, 2U放6個機器, 每個機器4核、4GB內存、4個3T硬盤, 2U總共72TB存儲, 相比普通機架服務器,存儲密度提升1倍。arm存儲機的內存量過小, 而文件系統產生的元數據過大, 考慮性能原因不能把文件存儲成文件。 甚至也不能采用haystack存儲方式, haystack元數據雖然小, 但也超過ARM存儲機的內存量。
atlas架構如上圖所示, altas采用分布式元數據管理機制, 根據哈希策略將對象元數據切片成N個slice, 這些slice交由PIS(Patch and Index Server)集群管理, 每個PIS節點負責管理多個slice。 slice到PIS的映射表通過元數據服務器管理(圖中未畫出), 映射表較小,能被客戶端全量緩存。
PIS的結構如上圖所示, replication模塊以主從復制方式保證slice三副本一致性。 寫請求發往主節點, 主節點生成唯一請求ID之后將ID和請求轉發給從節點, 從節點接收到請求之后, 追加到patch模塊維護的log文件。 請求ID的作用是串行化寫, 即從節點按照ID排序串行化執行請求。 主節點至少收到一個從節點的響應后, 將KV寫入本地, 并告訴客戶端寫成功。 (如何保證一致性?)。 patch文件長度達到64MB時, PIS新開一個patch文件處理寫請求, 調用RBSClient將滿64MB的塊寫入到RBS系統中, 并將對象元數據(即對象的key,以及對象的存儲位置:RBS塊,偏移,長度)記錄到Index中。
RBS(RAID-like Block System), 是一個64MB大塊存儲系統, 支持隨機讀取, 整塊寫入和刪除, 不支持隨機寫。 PartServer負責數據存儲, RBS Master負責記錄塊的位置信息, 并負責集群管理和數據恢復工作, 而RBSClient是提供給應用的開發包。 RBS采用糾刪碼技術保障數據可靠性, 寫入數據時, RBSClient將64MB大塊切分為8個8MB part,用RS糾刪碼生成另外4個8MB 校驗part, 保存這12個part到PartServer。
對象讀取流程。 對象數據是先進patch后轉移到RBS, 所以讀也是要先讀patch, patch命中則直接返回, 若不命中則查index得到對象位置信息, 再根據位置信息從RBS讀取數據。
刪除和垃圾回收。 如果對象在patch中則直接刪除,反之若對象在RBS中,則從index中刪除對象元數據, 刪除對象空間不會馬上回收, 而是留在RBS中形成垃圾數據。 垃圾回收的思路是使用map-reduce掃描所有index數據, 計算RBS塊的空間率, 針對空閑率大于一定閾值的塊, 讀取有效數據,寫回到RBS, 更新index, 最后刪除塊。
atlas是優秀的KV存儲系統, 非常適合于網盤類應用。其最大的特色是軟硬件協同設計, 基于arm存儲和糾刪碼極大降低了存儲成本。 atlas垃圾回收的成本較高, 刪除較多的應用場景下效率可能會有問題。
文獻atlas: baidu’s key-value storage system