MyRocks儲存引擎資料結構解析

京東發表於2019-01-05

本文是基於Percona5.7.22的MyRocks儲存引擎進行說明

1.   前言

1.1 概述

本文描述MyRocks儲存引擎資料結構

(備註:本文忽略了關於融入儲存引擎中performance_schema監測點的程式碼)主要涉及:

檔案: ha_rocksdb.cc

函式: rocksdb_init_func

2.   資料結構

2.1 DBOptions

2.1.1 結構描述

該結構是儲存了MyRocks儲存引擎的配置引數,如:讀寫速率,壓縮執行緒數等配置引數,關於配置引數可以檢視options.h。

檔案:options.h options.cc

2.1.2 DBOptions類例項定義            

MyRocks儲存引擎資料結構解析2.1.3 系統引數

本節主要描述與DBOptions相關的MyRocks配置引數

2.1.3.1 互斥引數

(1) 互斥引數一:這2個引數不能同時設定為true,預設值為false

rocksdb_allow_mmap_reads: 表示在讀取sst檔案時,是否使用mmap進行檔案與記憶體的對映

rocksdb_use_direct_reads: 是否使用直接 I/O模式即direct I/O mode用於讀寫,作業系統檔案操作巨集需要設定為: O_DIRECT

(2) 互斥引數二:這2個引數不能同時設定為true,預設值為false

rocksdb_allow_mmap_write: 表示在寫入sst檔案時,是否使用mmap進行檔案與記憶體的對映

rocksdb_use_direct_io_for_flush_and_compaction:在寫入sst檔案或是在合併場景下,是否使用直接 I/O模式即direct I/O mode用於讀寫,作業系統檔案操作巨集需要設定為: O_DIRECT。

(3) 互斥引數三: rocksdb_flush_log_at_trx_commit預設為1

 rocksdb_flush_log_at_trx_commit:該引數表示rocksdb在事務提交時,重新整理log的方式,取值如下:

FLUSH_LOG_NEVER:0

FLUSH_LOG_SYNC:1

FLUSH_LOG_BACKGROUND:3

rocksdb_allow_mmap_writes為true時,該引數只能取值為0。

2.1.3.2MyRocks配置引數與MySQL系統引數

rocksdb_max_open_files與MySQL系統引數open_files_limit有關,rocksdb_max_open_files值為open_files_limit的一半

2.1.3.3 關聯引數

(1) 關聯引數一:

rocksdb_wal_ttl_secondsrocksdb_wal_size_limit_mb

1. 如果兩者都設定為0,日誌將被儘快刪除,不會進入存檔。

2. 如果WAL_ttl_seconds為0,而WAL_size_limit_MB為0,那麼每10分鐘檢查一次WAL檔案,如果總大小大於WAL_size_limit_MB,則從最早的值開始刪除,直到size_limit滿足。所有空檔案將被刪除。

3. 如果WAL_ttl_seconds不是0,WAL_size_limit_MB是0,那麼每個WAL_ttl_secondsi / 2都會檢查WAL檔案,超過WAL_ttl_seconds的檔案將被刪除。

4. 如果兩個都不是0,那麼每10分鐘將檢查一次WAL檔案,首先檢查ttl再檢查limit_mb。

2.1.3.4 關於sst檔案合併的引數

1. rocksdb_max_subcompactions:此引數主要用於指定level0 與 level1合併的執行緒數。

2. rocksdb_max_background_jobs:引數指定後臺合併和重新整理日誌的執行緒數的總和的最大值RocksDB會自動分配重新整理日誌和後臺合併的任務數

2.1.3.5 關於日誌引數

(1) rocksdb_log_file_time_to_rollrocksdb_max_log_file_size

如上2個引數其中有一個不為0,log日誌型別為AutoRollLogger,會依據  rocksdb_max_log_file_size設定的大小,或是rocksdb_log_file_time_to_roll時間(秒)滾動輸出日誌。

2.1.4 註冊例項

本節主要講解在DBOptions註冊的類例項

2.1.4.1 Env類

Env類是作為Rocksd能夠跨平臺的建立的類,它作為rocksdb與系統之間的抽象,其包含了需要訪問作業系統的介面,其內部預設實現了env_hdfs/env_posix兩種平臺。

Env類介面定義了:檔案與目錄相關的操作(建立/刪除/修改),檔案鎖,獲取系統時間戳,不同優先順序的後臺執行緒池排程管理。

env_posix類繼承自Env類,並實現了上述介面,RocksDB的後臺合併和重新整理日誌操作執行緒排程都是由該類實現的。通過呼叫Default()函式,將env_posix類的例項註冊到DBOptions中。

2.1.4.2 Statistics類

該類作為RocksDB效能統計的工具註冊到DBOptions例項中,如下:

MyRocks儲存引擎資料結構解析

Statistics的實現類為: StatisticsImpl

實現類StatisticsImpl定義了:一個與CPU核數相等的本地核心陣列:

CoreLocalArray<StatisticsData> per_core_stats_,該陣列數目與所在物理機器的CPU的邏輯核心相同,每個CPU邏輯核心讀取自己對應的陣列,使用者獲取的資料是這些陣列分量的總和。

統計資料結構體為: StatisticsData,此資料結構包括2個陣列:

tickers_陣列:型別是原子的64位無符號整形atomic_uint_fast64_t,tickers_陣列大小與列舉型別Tickers相關,列舉型別Tickers定義了Statistics類效能統計項,列舉型別Tickers的統計項為125項,陣列大小為127.

 stograms_陣列:型別是HistogramImpl,統計資料的統計分佈,包括最大值、最小值、平均值、中位數、標準差,histograms_陣列大小與列舉型別Histograms相關

padding:字元型陣列,該陣列主要用於補齊主要為了快取行對齊(cache line),現在流行的快取行大小是64位元組對齊。

per_core_stats_陣列的記憶體模型:

MyRocks儲存引擎資料結構解析具體程式碼:  

MyRocks儲存引擎資料結構解析

Core_idx為CPU邏輯核心的角標,tichkerType是列舉型別Tickers  

MyRocks儲存引擎資料結構解析

Core_idx為CPU邏輯核心的角標,histogramType是列舉型別Histograms 

2.1.5 擴充套件

本節結合上節提到的StatisticsData和CoreLocalArray,說明一下快取行對齊

2.1.5.1 快取行對齊

快取行(Cache Line):是CPU快取(Cache)中的資料塊。

CPU快取(Cache)與記憶體(RAM)互動資料,是以快取行進行互動的,這也是為什麼StatisticsData結構體要進行快取行對齊,這樣該結構被一次性讀取64位元組到CPU的緩存中,效率會很高。

計算機儲存層次結構:

MyRocks儲存引擎資料結構解析

Cache Line可以簡單的理解為CPU Cache中的最小快取單位。目前主流的CPU Cache的Cache Line大小都是64Bytes。

下面是per_core_stats_陣列與CPU Cache對映:假設per_core_stats_陣列元素總大小為192位元組

MyRocks儲存引擎資料結構解析

2.2 BlockBasedTableOptions

2.2.1 結構描述

該類儲存了對BlockBasedTable操作,BlockBasedTable是SST(Sorted Sequence Table)檔案的預設格式。

相關檔案:table.h

2.2.2 BlockBasedTableOptions類例項定義

MyRocks儲存引擎資料結構解析

2.2.3 系統引數

2.2.3.1 sst檔案index block引數

rocksdb_index_type引數決定了sst中的index block中的index索引的結構。

取值:整形取值為0 1 2

MyRocks儲存引擎資料結構解析

這3個型別實際上對應了3個類:

ShortenedIndexBuilder: kBinarySearch

HashIndexBuilder: kHashSearch

PartitionedIndexBuilder: kTwoLevelIndexSearch

2.2.3.2 cache相關引數

(1) rocksdb_no_block_cache:該引數是個布林型別,當該引數設定了ON即1時,會建立LRUcache。

(2) rocksdb_block_cache_size:此引數與上面相關,表示LRUcahe的大小,單位MB,預設值為512MB。

(3) rocksdb_persistent_cache_size_mb:預設值為0,當設定的數值大於0時,會建立型別為BlockCacheTier的快取。

2.3 操作與類的關係

2.3.1 DBOptions與關鍵類關係

MyRocks儲存引擎資料結構解析

DBOptions類是作為DBImpl實現類的成員變數

2.3.1 BlockBasedTableOptions與關鍵類關係

BlockBasedTableOptions是與cf(列族)操作相關的

MyRocks儲存引擎資料結構解析

相關文章