360自研分佈式海量小文件存儲系統的設計與實現

背景

近年來,公司業務發展迅猛,爲數衆多的業務場景產生了大量的圖片,文檔,音頻,視頻等非結構化數據,尤爲是隨着移動互聯網、AI、IoT技術的成熟和應用市場的全面爆發,大量智能硬件設備將會生成更大規模的非結構化多媒體數據。如此大量的小文件如何存儲,問題應運而生。傳統存儲廠商出售的存儲服務價格昂貴,公有云廠商對具體業務場景的定製化改造略有欠缺,所以,咱們決定自研小文件存儲服務。node

NebulasFs簡介

曾經關注小文件存儲技術的同窗可能閱讀過Facebook發表的那篇關於海量小圖片存儲系統Haystack的論文(Finding a needle in Haystack: Facebook’s photo storage),Haystack經過合併多個小文件成一個大文件、以減小文件數量的方式解決了普通文件系統在存儲數量巨大的小文件時的問題:獲取一次文件屢次讀取元數據信息、文件訪問的「長尾」效應致使大量文件元數據不容易緩存等。基於在Haystack的論文中獲得的借鑑和參考,咱們研發了本身的分佈式小文件存儲系統——NebulasFs。它是一個分佈式、高可用、高可靠、持久化小文件存儲系統,能夠存儲數以百億的小文件。數據庫

架構設計

從分佈式角色上劃分,能夠分爲MasterDatanode兩個大的角色。後端

其中,Master負責集羣的元數據存儲、集羣管理、任務調度等工做,它的數據一致性目前由外部一致性工具(ETCD等)實現。Master是一個主多個備。緩存

Datanode是面向用戶的,它主要負責數據存儲和用戶請求的路由、分發。Datanode節點包括存儲Volume文件和Proxy模塊。以下圖所示:安全

用戶的請求能夠請求任意一個Datanode節點,節點的Proxy模塊會代理用戶請求到正確的數據存儲節點,並返回給用戶結構。對於多個副本的寫請求,Proxy模塊會按照副本的一致順序並行寫入直至所有成功後返回。對於讀請求只讀取第一個副本。服務器

NebulasFs功能

爲了在存儲容量、一致性、可用性等方面有更好的提高來知足海量小文件存儲的需求,相對於Haystack論文,咱們在接口服務、分佈式架構方面作了更多的優化,主要體如今如下方面:微信

1、提供給用戶使用的服務接口簡單、輕量、通用

NebulasFs提供給用戶Http Restful接口,協議更簡單,使用更方便,用戶能夠經過簡單的PUT,GET等操做上傳和下載文件。用戶無需使用定製的客戶端,更加輕量級。架構

2、用戶請求全代理、自動路由

咱們知道,Datanode具備數據存儲的功能,但是對於數量衆多的Datanode來講,用戶要想知道哪些數據存儲在哪一個Datanode上是須要先從Master 拿到數據路由的元數據才知道,這增長了用戶請求的複雜度。咱們在Datanode上增長了請求代理、路由模塊把用戶的請求自動代理、路由到正確的Datanode上,使得用戶一次請求既能獲取數據。運維

3、多租戶,提供租戶資源隔離機制,避免相互影響

一個集羣提供的服務可能有多個用戶來使用,爲了不互相影響,NebulasFs抽象出了資源池的概念,不一樣的資源池物理上是分佈在不一樣的硬件之上,資源池在機器維度上不交叉,能夠有效的作到資源的隔離。不一樣的用戶能夠分佈在不一樣的資源池也能夠共享資源池,這須要管理員提早作好規劃。資源池類型是多樣的,它的範圍多是跨數據中心的,也多是跨機櫃,也多是在一個機櫃以內的。根據不一樣的物理硬件性能和數據副本存儲冗餘需求,對不一樣類型的數據存儲需求也須要提早規劃。分佈式

4、可定製的數據多副本存儲方案,數據無丟失、多種故障域組合

爲了提供可用性,保證寫入數據不丟失,文件數據通常都會作容災存儲大於1的副本數量,以便在發生不可恢復的硬件故障時保證數據可用性以及用做以後的自動補齊副本數量。不一樣重要級別的數據和不一樣級別故障類型決定了使用不一樣級別的存儲方案。NebulasFs預先定義了5個級別的故障域,分別是:數據中心、機櫃列、機櫃、機器、磁盤。要求可用性較高的數據存儲時使用跨數據中心作容災副本,以便在整個數據中心不可用時使用另一個數據中心的數據。要求沒那麼高的數據能夠在作容災副本策略的時候選擇跨機櫃存儲便可,使得即使在邊沿交換機故障後也可用。

NebulasFs故障域和資源隔離池之間的關係以下:

S表明服務器,R-1, R-2是屬於數據中心DC-1的兩個機櫃,R-3, R42是屬於數據中心DC-2的兩個機櫃。Pool-1是跨機櫃故障域的資源隔離池,Pool-2是跨數據中心故障域的資源池,Pool-3是跨服務器故障域的資源池。

NebulasFs 故障域邏輯和物理概念對應以下:

其中上半部分是邏輯概念,下半部分是物理概念。用戶及請求均與邏輯概念相關,管理運維涉及物理概念相關。一個用戶能夠對應一個或者多個Collection, 一個Collection對應多個Volume, 每一個Volume是存儲在DataNode上的文件(有幾個副本就有幾個文件)。通常一個DataNode對應服務器上的一塊硬盤。一臺服務器上有多個DataNode。服務器(Server)的上層是機櫃(Rack)、一排機櫃(Row)和數據中心(DataCenter)。

5、自動化擴容和再平衡

擴容分爲存儲容量不足進行擴容和請求流量過載進行的擴容。因爲容量不足的擴容後無需再平衡,只有請求流量大擴容後須要作數據再平衡。再平衡是按照容災副本數等策略進行的,按照策略添加的Datanode會自動註冊到Master上,Master按照預約的規則進行協調再平衡。

兩種擴容狀況以下:

6、自動化副本修復補齊

必定規模的集羣故障可能會變的比較頻繁,在咱們的系統中故障很大程度上意味着數據副本的丟失,人工補齊數據副本工做量較大,所以自動化補齊副本就成了一個比較重要的功能。自動化補齊副本是靠Master發現副本缺失和協調補齊的。在補齊的過程當中數據副本都會變成只讀。過程以下圖:

整個自動化副本補齊以下圖所示:

因爲硬盤故障,數據節點 2 和 3 上的Volume 3 和 6 副本丟失,自動補齊自動把這兩個副本補齊到數據節點 4  和 5 上,並加入到集羣中。

小 結

到目前爲止,NebulasFs在內部已經使用了近一年的時間。除此以外NebulasFs還作爲後端存儲爲另外一個對象存儲(AWS S3協議)提供服務以存儲大文件。

伴隨着業務的不斷接入,NebulasFs也會不斷完善,爲業務增加提供更好的保障。

推薦閱讀

(360技術原創內容,轉載請務必保留文末二維碼,謝謝~)

關於360技術

360技術是360技術團隊打造的技術分享公衆號,天天推送技術乾貨內容

更多技術信息歡迎關注「360技術」微信公衆號

相關文章
相關標籤/搜索