前文我們創建了一個單節點的Ceph集羣,並且創建了2個基於BlueStore的OSD。同時,為了便於學習,這兩個OSD分別基於不同的佈局,也就是一個OSD是基於3中不同的存儲介質(這裡是模擬的,並非真的不同介質),另外一個OSD所有內容放在一個裸設備上。

什麼是BlueStore

在老版本的Ceph當中FileStore是默認的對象存儲引擎,但FileStore最大的問題是寫放大的問題。同時由於需要經過操作系統通用文件系統層(例如Ext4和XFS等),因此整體性能欠佳。因此,開發一種新的對象存儲引擎迫在眉睫,這個就是現在大家都在使用的BlueStore對象存儲引擎。BlueStore最大的特點是構建在裸磁碟設備之上,並且對諸如SSD等新的存儲設備做了很多優化工作。下圖來自Ceph官方,該圖是BlueStore的整體架構圖。

也就是說BlueStore主要目的是對性能進行優化,以提升Ceph集羣整體的性能。那麼BlueStore對Ceph集羣到底有多大的性能提升呢?我們看看官方給出的性能測試數據。如下是3副本情況下的性能測試對比數據,從測試結果可以看出大多數場景下有了將近1倍的性能提升。

那對於糾刪碼場景下的性能提升情況又是怎麼樣的呢?看看下面的測試結果。

性能提升確實是很明顯,接下來我們就要具體學習一下BlueStore的技術細節了。從圖1可以看出BlueStore最大的特點是OSD可以直接管理裸磁碟設備,並且將對象數據存儲在該設備當中。另外,我們知道對象有很多KV屬性信息,這些信息之前是存儲在文件的擴展屬性或者LevelDB當中的。而在BlueStore中,這些信息存儲在RocksDB當中。RocksDB本身是需要運行在文件系統之上的,因此為了使用RocksDB存儲這些元數據,需要開發一個簡單的文件系統(BlueFS)。 通過上面的整體架構可以看出,如果想徹底的瞭解BlueStore,對對象數據的分配管理和BlueFS的實現原理的理解是基礎。因此,我們這裡先分析上述2部分的內容。RocksDB是對元數據進行管理的子系統,因此我們先從RocksDB相關的內容講起。

BlueFS簡析

從圖1可以看出BlueFS是基礎,RocksDB通過中間層BlueRocksDB訪問文件系統的介面。這個文件系統與傳統的Linux文件系統(例如Ext4和XFS)是不同的,它不是在VFS下面的通用文件系統,而是一個用戶態的邏輯。BlueFS通過函數介面(API,非POSIX)的方式為BlueRocksDB提供類似文件系統的能力。 雖然BlueFS提供的介面方式不同,但起原理與通用文件系統是類似的。為了提高BlueFS文件系統的可靠性,BlueFS被設計成日誌文件系統,也就是數據在寫入之前會先寫上日誌中,這樣可以保證出現掉電等異常情況下可以通過日誌恢複數據。 雖然從官方配圖上(圖1)來看,BlueFS是基於裸設備的,實際上並非如此。BlueFS實際上基於BlueStore的磁碟空間分配器,也就是BlueFS使用的磁碟空間需要經過分配器來分配。BlueStore目前支持2種類型的磁碟空間分配器,分別是BitMapAllocator和StupidAllocator。

如圖4是BlueFS文件系統與分配器之間的關係,其中分配器(Allocator)作為BlueFS的成員,當文件系統需要磁碟空間時通過分配器的介面分配空間。整個類的內容非常豐富,本文僅僅給出它們之間的簡單關係,後續會詳細介紹內部的實現。 關於上文所說的BitMapAllocator和StupidAllocator分配器繼承自Allocator類,三者之間的關係如圖5所示。關於分配器的具體實現細節還是比較複雜的,限於篇幅問題本文暫時不做介紹。

BlueFS與傳統文件系統不同另外一個地方是並沒有設計單獨存儲fnode的存儲空間,而是將其存儲在WAL(Write Ahead Log)日誌當中。當文件系統掛載的時候通過回放該日誌實現內存數據結構的構建。這樣,在內存中就可以查到磁碟中的目錄和文件信息,從而可以實現對文件的讀寫。BlueFS本身就是一個功能閹割的,迷你文件系統。BlueFS可以這麼實現得益於其只服務於RocksDB,其文件數量非常有限,使用場景也非常有限。

創建文件流程

為了更加清晰的理解BlueFS的整體架構和原理,我們通過一個具體的實例介紹該文件系統是如何運行的。由於BlueFS只服務於RocksDB,因此創建文件的流程自然也是由RocksDB觸發的。因此,整個流程的分析也是從RocksDB的環境類作為入口進行介紹。在介紹具體流程之前,我們先看一下更加詳細的BlueFS類的類圖,這裡面比較重要的是其中的dir_mapfile_map兩個成員。這兩個成員其實就是存儲文件系統中的目錄和文件的一個映射。

創建文件的操作是由RocksDB觸發的,比如創建一個新的SSTable文件。具體函數調用過程如圖7左側流程所示。最終調用的是BlueFS的事務介面,用於構建一個向日誌文件寫數據的事務。

之後,上層會觸發一個刷寫數據的流程,具體如圖7右側所示,最終會將數據寫到日誌文件中。至此,一個新的文件就創建成功了。 今天我們非常粗略的介紹了一下BlueStore及BlueFS的整體架構和一些關鍵的數據結構,很多細節沒有介紹,大家可能有一些迷糊。後續我們將深入細節介紹每個特性的具體實現。有任何不明白的也請大家在下面留言,本號將儘力解釋清楚。

原文鏈接:

Ceph存儲引擎BlueStore簡析?

www.itworld123.com


推薦閱讀:
相關文章