360自研分散式海量小檔案儲存系統的設計與實現

360技術發表於2019-06-11

背景

近年來,公司業務發展迅猛,為數眾多的業務場景產生了大量的圖片,文件,音訊,視訊等非結構化資料,尤其是隨著移動網際網路、AI、IoT技術的成熟和應用市場的全面爆發,大量智慧硬體裝置將會生成更大規模的非結構化多媒體資料。如此大量的小檔案如何儲存,問題應運而生。傳統儲存廠商出售的儲存服務價格昂貴,公有云廠商對具體業務場景的定製化改造略有欠缺,因此,我們決定自研小檔案儲存服務。

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論文,我們在介面服務、分散式架構方面做了更多的優化,主要體現在以下方面:

一、提供給使用者使用的服務介面簡單、輕量、通用

NebulasFs提供給使用者Http Restful介面,協議更簡單,使用更方便,使用者可以通過簡單的PUT,GET等操作上傳和下載檔案。使用者無需使用定製的客戶端,更加輕量級。

二、使用者請求全代理、自動路由

我們知道,Datanode具有資料儲存的功能,可是對於數量眾多的Datanode來說,使用者要想知道哪些資料儲存在哪個Datanode上是需要先從Master 拿到資料路由的後設資料才知道,這增加了使用者請求的複雜度。我們在Datanode上增加了請求代理、路由模組把使用者的請求自動代理、路由到正確的Datanode上,使得使用者一次請求既能獲取資料。

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

一個叢集提供的服務可能有多個使用者來使用,為了避免互相影響,NebulasFs抽象出了資源池的概念,不同的資源池物理上是分佈在不同的硬體之上,資源池在機器維度上不交叉,可以有效的做到資源的隔離。不同的使用者可以分佈在不同的資源池也可以共享資源池,這需要管理員提前做好規劃。資源池型別是多樣的,它的範圍可能是跨資料中心的,也可能是跨機櫃,也可能是在一個機櫃之內的。根據不同的物理硬體效能和資料副本儲存冗餘需求,對不同型別的資料儲存需求也需要提前規劃。

四、可定製的資料多副本儲存方案,資料無丟失、多種故障域組合

為了提供可用性,保證寫入資料不丟失,檔案資料一般都會做容災儲存大於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)。

五、自動化擴容和再平衡

擴容分為儲存容量不足進行擴容和請求流量過載進行的擴容。由於容量不足的擴容後無需再平衡,只有請求流量大擴容後需要做資料再平衡。再平衡是按照容災副本數等策略進行的,按照策略新增的Datanode會自動註冊到Master上,Master按照預定的規則進行協調再平衡。

兩種擴容情況如下:

六、自動化副本修復補齊

一定規模的叢集故障可能會變的比較頻繁,在我們的系統中故障很大程度上意味著資料副本的丟失,人工補齊資料副本工作量較大,因此自動化補齊副本就成了一個比較重要的功能。自動化補齊副本是靠Master發現副本缺失和協調補齊的。在補齊的過程中資料副本都會變成只讀。過程如下圖:

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

由於硬碟故障,資料節點 2 和 3 上的Volume 3 和 6 副本丟失,自動補齊自動把這兩個副本補齊到資料節點 4  和 5 上,並加入到叢集中。

小 結

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

伴隨著業務的不斷接入,NebulasFs也會不斷完善,為業務增長提供更好的保障。

推薦閱讀

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

關於360技術

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

更多技術資訊歡迎關注“360技術”微信公眾號

相關文章