MyRocks寫入分析

2021-09-30 21:50:05 字數 3268 閱讀 6868

title: mysql · myrocks · myrocks寫入分析

myrocks的寫入流程可以簡單的分為以下幾步來完成

將解析後的記錄(ktypevalue/ktypedeletion)寫入到writebatch中

將wal日誌寫入log檔案

將writebatch中的內容寫到memtable中,事務完成

其中第2,3步在提交時完成

writebatch與myrocks事務處理密切相關,事務中的記錄提交前都以字串的形式儲存在writebatch->rep_中,要麼都提交,要麼都回滾。 回滾的邏輯比較簡單,只需要清理writebatch->rep_即可。詳見transactionimpl::rollback

乙個簡單的insert 寫入writebatch堆疊如下

#0  rocksdb::writebatchinternal::put

#1 rocksdb::writebatch::put

#2 myrocks::ha_rocksdb::update_pk

#3 myrocks::ha_rocksdb::update_indexes

#4 myrocks::ha_rocksdb::update_write_row

#5 myrocks::ha_rocksdb::write_row

#6 handler::ha_write_row

#7 write_record

#8 mysql_insert

#9 mysql_execute_command

#10 mysql_parse

#11 dispatch_command

#12 do_command

#13 do_handle_one_connection

乙個簡單的insert commit堆疊如下

#0  rocksdb::inlineskiplist::insert

#1 rocksdb::(anonymous namespace)::skiplistrep::insert

#2 rocksdb::memtable::add

#3 rocksdb::memtableinserter::putcf

#4 rocksdb::writebatch::iterate

#5 rocksdb::writebatch::iterate

#6 rocksdb::writebatchinternal::insertinto

#7 rocksdb::dbimpl::writeimpl

#8 rocksdb::dbimpl::write

#9 rocksdb::transactionimpl::commit

#10 myrocks::rdb_transaction_impl::commit_no_binlog

#11 myrocks::rdb_transaction::commit

#12 myrocks::rocksdb_commit

#13 ha_commit_low

#14 tc_log_mmap::commit

#15 ha_commit_trans

#16 trans_commit_stmt

#17 mysql_execute_command

#18 mysql_parse

#19 dispatch_command

#20 do_command

#21 do_handle_one_connection

這裡只分析rocksdb引擎的提交流程,實際myrocks提交時還需先寫binlog(binlog開啟的情況).

rocksdb引擎提交時就完成兩個事情

寫wal日誌(wal開啟的情況下rocksdb_write_disable_wal=off)

將之前的writebatch寫入到memtable中

然而,寫wal是乙個序列操作。為了提高提交的效率, rocksdb引入了group commit機制。

待提交的事務都依次加入到提交的writer佇列中,這個writer佇列被劃分為乙個乙個group. 每個group有乙個leader, 其他為follower,leader負責批量寫wal。每個group由雙向鍊錶link_older, link_newer鏈結。如下圖所示

每個writer可能的狀態如下

writer的狀態變遷跟group是否併發寫memtable有關

當開啟併發寫memtable(rocksdb_allow_concurrent_memtable_write=on)且group中的writer至少有兩個時,group才會併發寫。

group併發寫時writer的狀態變遷圖如下:

group非併發寫時writer的狀態變遷圖如下:

原始碼結構圖如下(來自林青)

上面的圖是在group內writer併發寫memtable的情形。

非併發寫memtable時,沒有launchparallelfollowers/completeparallelworker, insertmemtable是由leader序列寫入的。

這裡group commit有以下要點

同一時刻只有乙個leader, leader完成操作後,才設定下乙個leader

需要等乙個group都完成後,才會進行下乙個group

group中最後乙個完成的writer負責完成提交和設定下乙個leader

leader 負責批量寫wal

只有leader才會去調整雙向鍊錶link_older,link_newer.

注意這裡2,3 應該可以優化改進為

rocksdb在提交寫入時,需考慮以下幾種情況,詳見preprocesswrite

某些條件會觸發停寫

具體可參考recalculatewritestallconditions

rocksdb寫入流程還有優化空間,facebook也有相關的優化。

MyRocks事務鎖分析

myrocks中rocksdb作為基於快照的事務引擎,其在事務支援上有別於innodb,有其自身的特點。在早期的月報 myrocks之事務處理 中,我們對鎖的實現有過簡單的分析,本文會以一些例子來介紹myrocks是如果來加鎖解鎖的。myrocks早期只支援排他鎖,支援selec.in share ...

myrocks記錄格式分析

title mysql myrocks myrocks記錄格式分析 rocksdb作為kv儲存引擎,那麼myrocks記錄最終會以kv的形式儲存在rocksdb中。mysql中的表一般由若干索引組成,在innodb儲存引擎中,每個索引對應一顆b樹,而在rocksdb儲存引擎中,索引對應於rocksd...

MySQL 特性分析 MyRocks簡介

rocksdb是facebook基於leveldb實現的,目前為facebook內部大量業務提供服務。經過facebook大量工作,將rocksdb作為mysql的乙個儲存引擎移植到mysql,稱之為myrocks。經過兩年的發展,myrocks已經比較成熟 rc階段 現已進入了facebook m...