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...