聊聊和猜想下 Nutanix 對 RocksDB 的一些研究

Nutanix 是一家做超融合的云計算廠商,實話,我之前對這家公司是一無所知,但在 2018 年 RocksDB meetup 上面,他們做了一個如何在 RocksDB 支持 coroutine read 以及 async write 的 talk 之后,我突然對這家廠商有了興趣。佩服他們對 RocksDB 有非常深的研究,順帶在 Scholar 上面查了查,然后又發現了 TRIAD: Creating synergies between memory, disk and log in log structured key-value stores 這篇 Paper,覺得有必要整理下他們公司對 RocksDB 的研究了。

需要注意,下面的東西只是根據 Nutanix 公開的 talk 和 paper 做的一些調研以及猜想,具體他們怎么做的,我其實是不清楚的。

Filter + Async I/O

對于 RocksDB 來說,它的讀寫 I/O 都是同步的,大家都知道,一般同步的東西,代碼寫起來是挺簡單,但性能其實并不是特別的高效。所以 RocksDB 的 team 一直想引入 Async I/O,也有了一些討論,也有了一些 PR,但無奈改動太大了。

Nutanix 采用了另一種方案來支持 Async I/O,也就是使用 coroutine,而且對 RocksDB core 幾乎代碼沒有改動。

原理也比較簡單,因為 RocksDB 提供了比較好的抽象,對于文件的操作,都是使用一個 Env 對外提供的,所以只需要實習一個自己的 Env,就能控制 RocksDB 的文件讀寫了。

Nutanix 實現了一個自己的應用線程池,類似于 Folly 的 Fibers 庫,然后實現了一個 Async I/O 的 thread pool,用來提交和處理 RocksDB 的 I/O 請求,然后這個 AIO pool 再去跟底層真正的 AIO 交互。

因為他們沒有透漏更多,我猜想 Nutanix 的流程應該是:

  1. 操作跑在一個單線程上面,基于 Fibers
  2. RocksDB 需要讀取某個文件的數據
  3. RocksDB 將請求發給 AIO thread pool
  4. 掛起當前的 coroutine
  5. AIO pool 發給底層的 AIO
  6. 等 I/O 處理結束在重新 resume 掛起的 coroutine 繼續處理

其實這個跟通常的 coroutine 方式差不多,Nutanix 在 talk 里面說到對于單個線程,吞吐能提升 8 倍,還是很猛的一個數字了。

Async Write

上面提到的主要是 Nutanix 對于 Async I/O 的優化,在寫入上面,他們也做了優化。

對于 LSM 這種數據結構來說,一次 Write,我們會先將數據 append 到 WAL 上面,然后在寫入 memtable。RocksDB 支持多線程寫,雖然它提供了 lock-free 的 memtable,但在 append WAL 仍然是不可能做到多線程并發的。所以 RocksDB 做了一些優化。一個是會選出一個 leader 線程,收集其他所有線程的寫入,做個 batch,批量寫入 WAL。另外就是引入了 pipeline 機制,一個線程先寫 WAL,然后寫 memtable,這時候另外的線程可以寫 WAL 了。

雖然有這些優化,但對于 write 來說,仍然可以認為是同步的,Nutanix 這里引入了 async write,其實原理很簡單,就是在 write 的時候帶上一個 callback,內部啟動了一個新的 leader 線程用來收集數據,batch 寫入,然后等寫入成功之后調用 callback。這里,Nutanix 額外提到使用了 direct I/O 來操作 WAL,這個還是比較有意思的,因為我以前一直以為對于 append 這種 I/O 操作,direct I/O 其實沒啥太大的作用,所以也不知道他們是如何實現的。

基于這個優化,Nutanix 說寫入提升了 3 到 4 倍,latency 減少了 2 倍,這個已經很猛了。

TRIAD

最后再來聊聊 TRIAD 這篇論文,這里來個小插曲,Facebook 的技術大佬 Mark 也提到了這篇 Paper,他說到之前竟然沒看到這篇文章(畢竟是 2017 年發布的),我猜想他其實之前也沒怎么關注 Nutanix,然后也是因為 RocksDB meetup 知道了,然后在 Google 出來的。。。

TRIAD 的原理還是非常簡單的,對于一些熱點頻繁更新的數據,在 Memtable flush 到 Level 0 的時候,并不會 flush 到 Level 0,而是重新寫回到 memtable,當然為了保證數據安全,會額外將這些數據寫入到一個 log 里面。

在 Memtable 里面,每個 key 會有額外的 4 字節空間來統計 key 的頻率,然后在 flush 的時候統計出最 hot 的 k 個 key。現在的算法比較簡單,只要大于平均頻率的 key 就是 hot key,這個算法其實在多數場景下面都是有效的。

對于 Level 0 和 Level 1 compaction,TRIAD 采用了 Hyperloglog 來計算兩層之間的重疊情況,如果如果有足夠的重疊了,就觸發 compaction,否則則是延遲觸發。計算重疊的公式為 UniqueKeys(file-1, file-2, ... file-n) / sum( Keys( file-i ) ),其中 Keys( file-i ) 表明是第 I 個 SST 的總的 key 的個數,而 UniqueKeys 則是估算的所有 SST 的唯一 key 的個數。

對于 LSM 來說,一個被刷到 Level 0 的 memtable,通常數據其實也存在 WAL 里面,所以 TRIAD 做了一些改進,在 flush 到 Level 0 的時候,只是將一個 index(CL-SSTable) 刷到了 Level 0,這樣通過 index 就能在 WAL 找到對應的數據了。然后在 Level 0 compacted 到 Level 1 的時候,WAL 才會被刪除。

關于 TRIAD,大家可以直接去看源碼

總結

上面只是一些我自己的理解,直觀的感受就是 Nutanix 這家公司在 RocksDB 上面也做了很多東西,但網上能 Google 出來的東西挺少的。對于我們來說,這些優化如果 RocksDB 能引入那當然最好,如果不能,短期對我們意義不大,畢竟我們現在沒太多的人力去開發相關的東西,如果你對這塊感興趣,歡迎聯系我 tl@pingcap.com

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容

  • 最近項目中用到這個nb的玩意,所以就花時間研究了下,同時整理下助自己記憶。這個猛虎上山的logo就是rocksdb...
    小東_16d3閱讀 9,159評論 3 10
  • 1.整體流程 圖中展示了流程中的關鍵路徑及涉及到的線程與隊列。下面詳細闡述工作流程。 重點關注:狀態切換;kv存儲...
    620T閱讀 4,540評論 1 3
  • 最近比較關注 Nonvolatile Memory 相關的技術,也發現業界現在對這塊的研究越來越多了,剛好看到了一...
    siddontang閱讀 3,736評論 1 7
  • RocksDB——Put 涉及的數據結構概覽 相關class以及對應的源文件 調用關系圖 默認配置下的put流程 ...
    Glitter試做一號機閱讀 8,002評論 2 7
  • 今天一夜好眠,爍仔可聽話了,一宿就醒了兩次就天亮了,就是這個小家伙太能顧秋了,半夜一睜眼找不到人了,結果一看都到了...
    雪花_閱讀 135評論 0 0