百度網盤背后的存儲系統atlas

er74 9年前發布 | 20K 次閱讀 百度網盤 分布式/云計算/大數據
 

百度網盤免費提供2TB存儲, 它的存儲量一定是驚人的, 支持它的存儲系統atlas也是相當不錯的。 atlas是一個KV存儲, 支持GET/PUT/DELETE三個接口, 看起來接口簡單, 但要做好這么一個大規模系統非常不易, 我們來看看atlas到底長啥樣。

百度網盤背后的存儲系統atlas

atlas基于如圖所示arm存儲機, 2U放6個機器, 每個機器4核、4GB內存、4個3T硬盤, 2U總共72TB存儲, 相比普通機架服務器,存儲密度提升1倍。arm存儲機的內存量過小, 而文件系統產生的元數據過大, 考慮性能原因不能把文件存儲成文件。 甚至也不能采用haystack存儲方式, haystack元數據雖然小, 但也超過ARM存儲機的內存量。

百度網盤背后的存儲系統atlas

atlas架構如上圖所示, altas采用分布式元數據管理機制, 根據哈希策略將對象元數據切片成N個slice, 這些slice交由PIS(Patch and Index Server)集群管理, 每個PIS節點負責管理多個slice。 slice到PIS的映射表通過元數據服務器管理(圖中未畫出), 映射表較小,能被客戶端全量緩存。

百度網盤背后的存儲系統atlas

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

 本文由用戶 er74 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!