MyTopling 解決的 MyRocks Bug: create index 引發(fā)的內(nèi)存問題

背景

Snapshot 字面意思是“快照”,在數(shù)據(jù)庫中,指的就是數(shù)據(jù)庫在某個(gè)時(shí)刻全體數(shù)據(jù)的狀態(tài)。假定我們?cè)?T1 時(shí)刻創(chuàng)建了一個(gè)快照 A,那么通過快照 A 就只能看到 T1 時(shí)刻之前的數(shù)據(jù),看不到 T1 時(shí)刻之后的。

MyTopling 與 ToplingDB

MyTopling 是基于?ToplingDB?的 MySQL,分叉自 MyRocks,ToplingDB 則分叉自 RocksDB,兼容 RocksDB 接口,從而 MyTopling 可以復(fù)用 MyRocks 的大部分成果。

ToplingDB?早已開源,MyTopling 也會(huì)于近期開源,目前我們正處于緊張的內(nèi)部開發(fā)中

RocksDB 的快照

RocksDB 實(shí)現(xiàn)了 MVCC,在內(nèi)部存儲(chǔ)中,每條 KV 都附帶一個(gè) SeqNum。概念上,在 RocksDB 中,快照本質(zhì)上就是一個(gè) SeqNum,通過快照訪問 RocksDB,只要丟棄大于 SeqNum 的數(shù)據(jù),僅保留小于等于 SeqNum 的數(shù)據(jù)就可以了。

問題

我們開始用 sysbench 測(cè)試 MyTopling,prepare 的數(shù)據(jù)量很大時(shí),對(duì)于每個(gè)表,插完數(shù)據(jù)之后,就是創(chuàng)建索引的階段,這個(gè)階段會(huì)花費(fèi)很長(zhǎng)時(shí)間,花很長(zhǎng)時(shí)間這個(gè)問題我們已經(jīng)通過?MyTopling 的 AutoSort SST?解決。

但其實(shí)這里還有另一個(gè)問題:創(chuàng)建索引時(shí),需要遍歷 Table,這是通過 RocksDB 的 Iterator 實(shí)現(xiàn)的,而 Iterator 通過其直接持有的 Version 對(duì)象,間接持有了一組 MemTable 和 SST。創(chuàng)建索引時(shí),我們的數(shù)據(jù)插入仍在進(jìn)行,這時(shí)就出問題了,MemTable 滿了會(huì) Flush 到 SST,Iterator (間接)持有了 MemTable,從而即便 MemTable 已經(jīng) Flush 到 SST 了,但因?yàn)?Iterator 的(間接)引用,這些?MemTable 卻無法釋放。

不像 SST,MemTable 要占用內(nèi)存,如果 MemTable 無法釋放,相應(yīng)的內(nèi)存就無法釋放,如果時(shí)間繼續(xù)加長(zhǎng),無法釋放的 MemTable 就越多,最終就 OOM 了。

一邊創(chuàng)建索引,一邊持續(xù)高負(fù)載寫入,這樣的應(yīng)用場(chǎng)景不多,這是好事,也是壞事,說它是好事,是因?yàn)楸苊饬酥旅鼏栴},說它是壞事,是因?yàn)橹灰怀鍪?,這個(gè)問題就一直被掩蓋著,從 MyRocks 誕生一直掩蓋至今!

好在問題的解決并不難:我們只需要周期性地 Refresh Iterator 就可以了,最簡(jiǎn)單的方案就是,記住當(dāng)前 Key,釋放舊的 Iterator,用(跟舊Iterator相同的快照)創(chuàng)建一個(gè)新的 Iterator(但是會(huì)綁定新的 Version 對(duì)象),再 Seek 到記下的 Key 中,然后一切繼續(xù)。

這個(gè)簡(jiǎn)單的方案為什么能解決問題?釋放舊 Iterator 的時(shí)候,這個(gè) Iterator 持有的 Version 對(duì)象就會(huì)被 Unref,從而相應(yīng)的 MemTable 和 SST 就被釋放了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容