上海2020年5月13日 /美通社/ -- 以鍵值對(duì)(Key-Value,簡(jiǎn)稱(chēng)KV)作為數(shù)據(jù)的存儲(chǔ)方式,已經(jīng)在很多場(chǎng)合得到了成功的應(yīng)用。KV存儲(chǔ)以其直觀性,降低了很多應(yīng)用程序調(diào)用數(shù)據(jù)的復(fù)雜度,可以獲得更高數(shù)據(jù)的存取效率,但也有其局限性。寶存科技的Open-Channel SSD 定義了一種通用的,高效率的主機(jī)端直接訪問(wèn) FLASH 的標(biāo)準(zhǔn)接口,百度基于此開(kāi)發(fā)出一套高性能KV存儲(chǔ)引擎,有效減少寫(xiě)放大對(duì)設(shè)備性能的影響。
當(dāng)前KV的不足之處
目前KV的成熟應(yīng)用場(chǎng)合有:
- 內(nèi)存數(shù)據(jù)庫(kù)及其持久化,如Redis、Pika;
- 分布式文件存儲(chǔ)系統(tǒng)底層存儲(chǔ)接口,如Ceph中使用Bluestore;
- 關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)引擎,如MySQL中的MyRocks引擎。
由于單機(jī)內(nèi)存總量的限制,內(nèi)存KV有持久化到硬盤(pán)的需求,而基于硬盤(pán)的KV數(shù)據(jù)庫(kù)多使用LSM Tree的方式在文件系統(tǒng)中實(shí)現(xiàn)(如RocksDB),在實(shí)際應(yīng)用中會(huì)出現(xiàn)以下問(wèn)題:
- 極高的寫(xiě)放大。由于WAL的機(jī)制,一份數(shù)據(jù)落盤(pán)即出現(xiàn)“雙寫(xiě)”的效果,產(chǎn)生1倍寫(xiě)放大。WAL(Write-ahead logging)記錄了數(shù)據(jù)持久寫(xiě)入DB之前的變更,是傳統(tǒng)數(shù)據(jù)庫(kù)保證數(shù)據(jù)安全性的必要?jiǎng)幼?。由于compaction機(jī)制的存在,新數(shù)據(jù)的寫(xiě)入會(huì)導(dǎo)致舊數(shù)據(jù)被反復(fù)合并,最終一份數(shù)據(jù)的寫(xiě)入實(shí)際會(huì)造成2倍以上的寫(xiě)入量。業(yè)界存儲(chǔ)設(shè)備已經(jīng)全面轉(zhuǎn)向SSD,而SSD的壽命是有限的,類(lèi)似RocksDB的KV數(shù)據(jù)庫(kù)在SSD上會(huì)將SSD的預(yù)期壽命大幅縮短到原本的三分之一。
- 緩存未命中時(shí)的讀放大。傳統(tǒng)KV數(shù)據(jù)庫(kù)將數(shù)據(jù)按冷熱分層存儲(chǔ),在讀取時(shí)分層檢索。如果讀取的數(shù)據(jù)沒(méi)有在緩存中,那么至少需要一次硬盤(pán)讀取操作,多則需要5次以上讀盤(pán)操作才能取到數(shù)據(jù)。
- 與設(shè)備性能不匹配的業(yè)務(wù)性能。對(duì)于單個(gè)硬盤(pán)來(lái)講,其總的IO能力是有限的,有限的IO能力被應(yīng)用IO和KV數(shù)據(jù)庫(kù)的compaction共同占用。由于compaction同時(shí)占用硬盤(pán)的讀寫(xiě)帶寬,大量的compaction操作使得上層業(yè)務(wù)可得的IO能力被大幅擠壓。
- 極低的空間使用率。以上情形同時(shí)存在,整個(gè)存儲(chǔ)設(shè)備一直處在compaction操作和compaction觸發(fā)之前有大量失效數(shù)據(jù)未標(biāo)記的情況下,此時(shí)如果有一定的業(yè)務(wù)性能要求,用戶將不得不使用空間換性能,存儲(chǔ)設(shè)備內(nèi)的有效數(shù)據(jù)總量相對(duì)設(shè)備的實(shí)際容量比例必然過(guò)小。
盡管很多業(yè)務(wù)已經(jīng)從KV的使用中受益,但當(dāng)前KV的不足限制了KV本該發(fā)揮的作用。
百度在Open-Channel SSD上的KV實(shí)現(xiàn)
搜索引擎及相關(guān)業(yè)務(wù)對(duì)KV有很強(qiáng)的需求。結(jié)合對(duì)KV的深入理解以及SSD的發(fā)展方向,百度選擇在Open-Channel SSD平臺(tái)上實(shí)現(xiàn)一套高性能KV,以移除當(dāng)前KV存在的不足,充分發(fā)揮KV在SSD上應(yīng)有的性能。
Open-Channel SSD是白盒化的NVMe SSD。SSD的底層介質(zhì)NAND Flash具有先擦后寫(xiě)、壽命有限的特點(diǎn),因此將NAND Flash組織成主機(jī)可見(jiàn)的硬盤(pán)需要實(shí)現(xiàn)地址映射、垃圾回收、磨損均衡、錯(cuò)誤處理等主要邏輯。Open-Channel SSD將實(shí)現(xiàn)這些邏輯的基本接口傳遞到主機(jī)層,用戶可以將業(yè)務(wù)邏輯和SSD邏輯結(jié)合實(shí)現(xiàn),使用軟硬件深度捆綁優(yōu)化的方式實(shí)現(xiàn)同樣硬件上的收益大幅度提升。
在百度的Open-Channel KV實(shí)現(xiàn)中,SSD不再以塊設(shè)備形式存在,而是以KV服務(wù)的形式呈現(xiàn)給上層業(yè)務(wù),KV邏輯向上層提供KV接口。KV接口接收到的鍵值對(duì)將被一步寫(xiě)到物理介質(zhì)NAND的某個(gè)地址上并在內(nèi)存中記錄映射關(guān)系,無(wú)需經(jīng)過(guò)文件系統(tǒng)/虛擬內(nèi)存/塊設(shè)備的層層轉(zhuǎn)換,讀取時(shí)同理。數(shù)據(jù)的傳輸獲得的是軟件層面最短的路徑,因而延遲大幅度縮短。
按照這種方法實(shí)現(xiàn)的KV可以解決傳統(tǒng)KV存在的問(wèn)題:
- 極小的寫(xiě)放大。如同寫(xiě)入傳統(tǒng)SSD時(shí)SSD內(nèi)部邏輯的動(dòng)作一樣,每一個(gè)新的鍵值對(duì)永遠(yuǎn)寫(xiě)在新的物理地址上,舊值自然失效。由于沒(méi)有文件系統(tǒng),從SSD角度等效OP會(huì)變得非常大,垃圾回收線程總是可以找到全臟或接近全臟的塊進(jìn)行回收,實(shí)際寫(xiě)放大僅為1.05。
- 沒(méi)有讀放大。所有key都可以在內(nèi)存中找到,key中包含了value的物理地址,讀取任何值都只需要一次讀盤(pán)。
- 充分使用硬件性能。由于沒(méi)有compaction操作存在,SSD的所有性能都用于實(shí)際的業(yè)務(wù)讀寫(xiě),使得可用帶寬大幅提高。Open-Channel KV較原有方案的可用帶寬提高一倍。
- 巨幅提升的QoS水平。由于寫(xiě)操作的重復(fù)機(jī)制和讀操作的等待機(jī)制被去除,QoS水平得到極大優(yōu)化。
- 更高的空間使用率。業(yè)務(wù)對(duì)單盤(pán)輸出能力有極高的要求,原方案下滿足業(yè)務(wù)要求的性能時(shí),SSD實(shí)際存儲(chǔ)的有效數(shù)據(jù)量?jī)H占盤(pán)容量的30%,剩余空間被無(wú)效數(shù)據(jù)占據(jù)或存入數(shù)據(jù)也沒(méi)有額外的帶寬用于業(yè)務(wù)IO。Open-Channel KV方案在保證輸出能力的情況下,將單盤(pán)實(shí)際有效數(shù)據(jù)量提升到盤(pán)容量的70%。
性能對(duì)比實(shí)測(cè):
Open-Channel平臺(tái)提供的助力
Open-Channel SSD作為軟硬件優(yōu)化的基礎(chǔ),目前已經(jīng)有穩(wěn)定的開(kāi)發(fā)平臺(tái),Linux內(nèi)核也已內(nèi)置支持。百度Open-Channel KV使用的硬件平臺(tái)具有以下特點(diǎn):
- 使用標(biāo)準(zhǔn)NVMe控制芯片,定制化Open-Channel固件。硬件無(wú)需定制,作為客戶可以獲得標(biāo)準(zhǔn)品的供貨優(yōu)勢(shì)。
- 高效的讀/寫(xiě)/擦接口,完備的錯(cuò)誤回報(bào)機(jī)制。開(kāi)發(fā)端可以獲得硬件的極限性能和對(duì)硬件的完全控制。
- Controller Memory Buffer(CMB)。CMB作為無(wú)掉電風(fēng)險(xiǎn)的高速緩沖區(qū)可以用在很多方面實(shí)現(xiàn)應(yīng)用加速和優(yōu)化,如存放log避免雙寫(xiě)、合并小value寫(xiě)入避免塊設(shè)備模式每一筆IO都必須按block size下發(fā)產(chǎn)生的寫(xiě)放大和寫(xiě)延遲。使用CMB后,小于4k byte的KV寫(xiě)入獲得數(shù)倍性能提升。
- 自動(dòng)數(shù)據(jù)保護(hù)。企業(yè)級(jí)SSD產(chǎn)品除NAND ECC外,還需要page/block層面的保護(hù)。當(dāng)前Open-Channel平臺(tái)提供底層自動(dòng)數(shù)據(jù)保護(hù)功能,開(kāi)發(fā)端只需要關(guān)注業(yè)務(wù)邏輯的編程即可。
總結(jié)
作為一個(gè)獨(dú)立的存儲(chǔ)引擎,百度Open-Channel KV項(xiàng)目已成功接入多個(gè)重要業(yè)務(wù),實(shí)現(xiàn)了同等級(jí)產(chǎn)品中單獨(dú)提升存儲(chǔ)性能和單獨(dú)優(yōu)化軟件邏輯都無(wú)法達(dá)到的業(yè)務(wù)性能提升幅度。此次Open-Channel應(yīng)用的成功實(shí)踐,證明了存儲(chǔ)類(lèi)應(yīng)用在Open-Channel SSD上獲得大幅度性能提升的可能性,也驗(yàn)證了Open-Channel平臺(tái)的可靠性。寶存科技基于Open-Channel的更多創(chuàng)新項(xiàng)目已經(jīng)在孵化中,未來(lái)我們可以看到Open-Channel SSD在更廣泛的范圍內(nèi)的成功應(yīng)用,為高可靠性、高效率、高性?xún)r(jià)比的IT基礎(chǔ)設(shè)施帶來(lái)獨(dú)特的價(jià)值。