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