mariadb的壓縮引擎MyRocks

官方文檔:

https://mariadb.com/kb/en/getting-started-with-myrocks/

 

TokuDB引擎已停止維護,現在使用MyRocks引擎

默認沒有引用,可在[mysqld]下面加以下參數來啓動。

[mysqld]
plugin_load_add = ha_rocksdb


 

MyRocks優於InnoDB

InnoDB是通用的,非常強大的,是世界上使用最廣泛的開源關係數據庫。InnoDB在大多數工作負載上運行良好,但有一些用例MyRocks可以勝過。 對於所有工作負載類型,MyRocks不打算擊敗InnoDB。在這個頁面中,我描述了與InnoDB相比的MyRocks優勢。

MyRocks比InnoDB需要更少的存儲空間

如果在磁盤上運行數據庫,則空間無關緊要,但是如果你在閃存上運行,減少空間非常重要,因爲每GB成本遠高於硬盤。

當你試圖減少空間時,InnoDB有一些問題。首先,InnoDB使用B+Tree索引。如果沒有順序插入,B+Tree索引會碎片化。碎片增加30%-50%的額外空間並不罕見。
第二個問題是InnoDB壓縮有空間開銷,InnoDB每頁壓縮。默認情況下,未壓縮的頁面大小爲16KB。壓縮後,頁面大小在MySQL 5.7之前對齊爲4KB單位,
在5.7之後對齊OS/設備扇區大小單位(如果使用Punch-Hole壓縮),在現代閃存設備上,扇區大小爲4KB。
這意味着InnoDB僅壓縮到25%,50%或100%(和5.7%中的75%)
例如,即使InnoDB壓縮可以將數據從16KB壓縮到5KB(減少68.75%),它實際上使用8KB,因此壓縮效率從68.75%降低到50%。    

圖1:InnoDB中的空間放大(圖片資源/一、概覽/3.MyRocks優於InnoDB/圖1.png)

另一方面,RocksDB是LSM數據庫,非常適合減少空間。
RocksDB按照頁面壓縮,與InnoDB相同,但壓縮頁面未與OS扇區對齊。如果頁面可以壓縮到30%,它恰好使用30%的存儲空間,而不是對齊到50%
RocksDB將數據存儲到SST(排序字符串表)文件中。RocksDB有塊(可以通過rocksdb_block_size配置,默認爲4KB) 但塊不與OS扇區大小對齊,
但SST文件與OS扇區大小對齊,但SST大小遠大於頁面大小(默認爲2MB),因此對齊開銷可忽略不計。

副作用,單塊讀取I/O請求可能最終讀取兩個連續塊,如果仔細查看iostat r/s 與 rMB/s,您會發現I/O單元的大小略大於塊大小,希望這不會導致HDD和Flash的性能問題

圖2:MyRocks中的壓縮(圖片資源/一、概覽/3.MyRocks優於InnoDB/圖2.png)

除了可忽略的對齊開銷之外,RocksDB還實現了兩個主要功能來減少空間.
 
* 前綴祕鑰編碼
  索引條目在RocksDB中排序(與許多其他數據庫一樣)。使用多列索引時,通常前N個字節與先前的索引條目相同。然後RocksDB通過不存儲重複的前綴字節流來優化空間。

  圖3:RocksDB中的前綴鍵編碼(圖片資源/一、概覽/3.MyRocks優於InnoDB/圖3.png)
  
* 零填充行元數據
  InnoDB和MyRocks每行都有一些空間開銷。InnoDB每行存儲6字節事務id和7字節回滾指針。他們存儲在主鍵中,但不存儲在二級索引中。即使使用壓縮格式,它們也不會被壓縮。
  因此,無論壓縮設置如何,總開銷爲每行13個字節。

  MyRocks每行存儲7字節序列id和1字節操作類型,他們存儲在主鍵索引和輔助索引上。如果您有一個主鍵索引和兩個輔助索引,則總開銷爲每行24個字節。這聽起來很大,
  但在實踐中,空間開銷要小的多。當在最底層寫入SST文件時,RocksDB會對零填充序列ID進行特殊優化,該文件有90%的數據。零填充序列ID壓縮後使用非常小的空間。
  
  圖4:零填充行元數據(圖片資源/一、概覽/3.MyRocks優於InnoDB/圖4.png)

寫放大比InnoDB小得多

在純閃存上,減少寫入量(寫入放大)很重要,因爲如果寫入太多的數據,閃存會燒壞。降低寫入量還有助於提高閃存的整體吞吐量。

InnoDB採用"就地更新"架構,即使僅更新1條記錄,行所屬的整個頁面也會變髒,而且必須將髒頁寫回存儲區。
在典型的OLTP系統上,修改單元(行)大小遠小於I/O單元(頁面)大小。這使得寫入放大非常高。

圖5: InnoDB中的寫入放大(圖片資源/一、概覽/3.MyRocks優於InnoDB/圖5.png)

另一方面,RocksDB(LSM)數據庫使用"僅追加"模型,編輯寫入WAL(預寫日誌),然後定期與SST文件合併。

圖6: MyRocks中的寫入放大(圖片資源/一、概覽/3.MyRocks優於InnoDB/圖6.png)

Linkbench結果

* 1.5B IDs,32個查詢線程,48小時運行,閃存
* 空間:
       InnoDB 1172GB 
       MyRocks 574GB (49%)
* QPS:
       InnoDB  22227/s
       MyRocks 33094/s
* 寫 KB/s:
       InnoDB 152,422
       MyRocks 66,932 (44%)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章