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