本文是基于Percona5.7.22的MyRocks存储引擎进行说明
本文描述MyRocks存储引擎数据结构
(备注:本文忽略了关于融入存储引擎中performance_schema监测点的代码)主要涉及:
文件: ha_rocksdb.cc
函数: rocksdb_init_func
2.1 DBOptions
2.1.1 结构描述
该结构是保存了MyRocks存储引擎的配置参数,如:读写速率,压缩线程数等配置参数,关于配置参数可以查看options.h。
文件:options.h options.cc
2.1.2 DBOptions类实例定义
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_seconds与rocksdb_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_roll与rocksdb_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实例中,如下:
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_数组的内存模型:
具体代码:
Core_idx为CPU逻辑核心的角标,tichkerType是枚举类型Tickers
Core_idx为CPU逻辑核心的角标,histogramType是枚举类型Histograms
2.1.5 扩展
本节结合上节提到的StatisticsData和CoreLocalArray,说明一下缓存行对齐
2.1.5.1 缓存行对齐
缓存行(Cache Line):是CPU缓存(Cache)中的数据块。
CPU缓存(Cache)与内存(RAM)交互数据,是以缓存行进行交互的,这也是为什么StatisticsData结构体要进行缓存行对齐,这样该结构被一次性读取64字节到CPU的缓存中,效率会很高。
计算机存储层次结构:
Cache Line可以简单的理解为CPU Cache中的最小缓存单位。目前主流的CPU Cache的Cache Line大小都是64Bytes。
下面是per_core_stats_数组与CPU Cache映射:假设per_core_stats_数组元素总大小为192字节
2.2 BlockBasedTableOptions
2.2.1 结构描述
该类保存了对BlockBasedTable操作,BlockBasedTable是SST(Sorted Sequence Table)文件的默认格式。
相关文件:table.h
2.2.2 BlockBasedTableOptions类实例定义
2.2.3 系统参数
2.2.3.1 sst文件index block参数
rocksdb_index_type此参数决定了sst中的index block中的index索引的结构。
取值:整形取值为0 1 2
这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与关键类关系
DBOptions类是作为DBImpl实现类的成员变量
2.3.1 BlockBasedTableOptions与关键类关系
BlockBasedTableOptions是与cf(列族)操作相关的