沈磊 李凱 林云
摘 要:為了實現基于ceph的BlueStore存儲引擎在SSD和HDD混合模式場景下有更好的性能,本文提出了基于bcache提升ceph性能的解決方案。該方案是將bcache技術應用到BlueStore引擎解決方案中。通過實驗驗證,使用bcache可以讓BlueStore在混合模式下發揮更好的性能。
關鍵詞:CEPH;BlueStore;BCACHE
中圖分類號:TP333 文獻標識碼:A 文章編號:1671-2064(2018)16-0038-02
1 引言
在分布式存儲CEPH高速發展過程中誕生了filestore和bluestore存儲引擎,filestore一開始只是對于機械盤進行設計的,沒有專門針對ssd做優化考慮,因此誕生的bluestore初衷就是為了減少寫放大,并針對ssd做優化,而且直接管理裸盤,從理論上進一步減少文件系統如ext4/xfs等部分的開銷。然而,使用bluestore存儲引擎拋棄了原有的journal機制。因此,本文提出使用bcache技術來提升bluestore存儲引擎下SSD和HDD混合場景的最大性能。
2 BCACHE技術分析
bcache是linux內核塊層cache。它使用類似SSD來作為HDD硬盤的cache,從而起到加速作用。HDD硬盤便宜并且空間更大,SSD速度快但更貴。bcache設計目標是等同于SSD。最大程度上去最小化寫放大,并避免隨機寫。bcache將隨機寫轉換為順序寫,首先寫到SSD,然后回寫緩存使用SSD緩存大量的寫,最后將寫有序寫到磁盤或者陣列上。
bcache的優勢在于可以將SSD資源池化,一塊SSD可對應多塊HDD,形成一個緩存池。bcache還支持從緩存池中劃出瘦分配的純flash卷(thin-flash lun)單獨使用。一個cache pool包含一個journal,緩存所有未完成操作的連續日志。
bcache用B+樹來管理緩存數據與HDD上數據塊的對應關系,B+樹所索引的k-v結構在bcache中稱為bkey。
將一個緩存池中的多塊HDD空間編址為一個地址空間;以HDD的id + IO請求的LBA為索引建立B+樹;每個B+樹的節點對應一個btree bucket,這個bucket里存的就是一個個的bkey;為每個btree bucket申請一塊連續內存作為metadata緩存;利用Journal/WAL加速B+tree的修改, 寫完journal以及內存中的B+tree節點緩存后寫IO就可以返回了。
3 BlueStore技術分析
在BlueStore存儲引擎中,沒有了journal的機制,也拋開了文件系統層面,直接對裸盤進行讀寫;在默認的配置中將一個磁盤劃分為兩個分區,第一個分區100MB用于存儲METDATA;第二個分區存儲數據。
RocksDB:存儲預寫式日志、數據對象元數據、Ceph的omap數據信息、以及分配器的元數據。
BlueRocksEnv:與RocksDB交互的接口。
BlueFS:小文件系統,解決元數據、文件空間及磁盤空間的分配和管理,并實現了rocksdb::Env接口(存儲RocksDB日志和sst文件)。
HDD:物理塊設備,存儲實際的數據。
3.1 元數據
在之前的存儲引擎filestore里,對象的表現形式是對應到文件系統里的文件,默認4MB大小的文件,但是在bluestore里,已經沒有傳統的文件系統,而是自己管理裸盤,因此需要有元數據來管理對象,對應的就是Onode,Onode是常駐內存的數據結構,持久化的時候會以kv的形式存到rocksdb里。
在onode里又分為lextent,表示邏輯的數據塊,用一個map來記錄,一個onode里會存在多個lextent,lextent通過blob的id對應到blob(bluestore_blob_t),blob里通過pextent對應到實際物理盤上的區域(pextent里就是offset和length來定位物理盤的位置區域)。一個onode里的多個lextent可能在同一個blob里,而一個blob也可能對應到多個pextent。
另外還有Bnode這個元數據,它是用來表示多個object可能共享extent,目前在做了快照后寫I/O觸發的cow進行clone的時候會用到。
3.2 I/O處理
到達bluestore的I/O的offset和length都是對象內(onode)的,offset是相對于這個對象起始位置的偏移,在_do_write里首先就會根據最小分配單位min_alloc_size進行判斷,從而將I/O分為對齊和非對齊的。
當一個寫請求按照min_alloc_size進行拆分后,就會分為對齊寫,對應到do_write_big,非對齊寫(即落到某一個min_alloc_size區間的寫I/O(對應到do_write_small)。
do_write_big
對齊到min_alloc_size的寫請求處理起來比較簡單,有可能是多個min_alloc_size的大小,在處理時會根據實際大小新生成lextent和blob,這個lextent跨越的區域是min_alloc_size的整數倍,如果這段區間是之前寫過的,會將之前的lextent記錄下來便于后續的空間回收。
do_write_small
在處理落到某個min_alloc_size區間的寫請求時,會首先根據offset去查找有沒有可以復用的blob,因為最小分配單元是min_alloc_size,默認64KB,如果一個4KB的寫I/O就只會用到blob的一部分,blob里剩余的還能放其它的。
4 BlueStore與BCACHE應用
在使用Ceph BlueStore中使用SSD的方式主要有兩種:cache tiering與OSD cache,眾所周知,Ceph的cache tiering機制目前還不成熟,策略比較復雜,IO路徑較長,在有些IO場景下甚至還會導致性能下降,promotion的粒度較大也有較多的負面影響。所以在SSD的使用上,我們選擇了給OSD所在塊設備加速的方式。
下面將基于bcache完成對ceph bluestore的支持。具體實施步驟如下:
(1)內核實施步驟:
Step1.內核源碼開啟bcache的支持。
Step2.拷貝當前環境的Module.symvers。
Step3.生成bcache.ko。
Step4.創建目錄。
Mkdir /usr/lib/modules/$(uname -r)/kernel/drivers/md/bcache
Step5.拷貝ko。
cp /home/bcache.ko /usr/lib/modules/$(uname -r)/kernel/drivers/md/bcache
Step6.加載內核。
Step7.安裝bcache-tools。
(2)bluestore實施步驟:
Step1.配置磁盤(圖1)。
Step2.以manual形式部署ceph。如圖2所示。
5 測試結果分析
本節將通過實驗,主要針對混合磁盤采用bluestore存儲引擎和bcache進行測試,證明通過bcache可以提升存儲性能,比ceph自身的cache tier性能更優更穩定。
(1)實驗平臺配置。三臺戴爾R720服務器構成實驗的硬件平臺,每個服務上安裝Centos 7.3操作系統。服務器詳細配置信息為:Intel 24核 2000MHZ的Xeon E5-2620 CPU,物理內存為196584M。(2)實驗設計。3個節點通過千兆交換機連接,每個服務器既是計算節點也是存儲節點;每個節點配置4個千兆網卡,1個400GB SSD和3個1TB 7200rpm SATA磁盤。(3)實驗結果分析。使用fio測試bcache環境下三臺服務器組成的集群能提供的最大IOPS,如圖3所示。
使用fio測試使用cache tier模式下集群提供的最大IOPS,如圖4所示。
6 結語
本文的重點是通過bcache與bluestore結合在SSD和HDD下如何得到最佳性能的解決方案。通過實驗驗證,得到以下結論:使用bcache可以在混合磁盤場景下提升bluestore存儲引擎模式的整體性能,并且比ceoh自身提供的cache tier更優。
參考文獻
[1]陳莉君.深入分析Linux內核源碼[M].北京:人民郵電出版社,2002.
[2]楊洪波.高性能網絡虛擬化技術研究[D].上海:上海交通大學,2012.