MyRocks存储引擎数据结构解析

本文是基于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类实例定义            

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实例中,如下:

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(列族)操作相关的

京东
京东

京东是全球最大零售商之一,业务涵盖零售、数科、物流、保险和健康等,公司目标是基于海量数据的挖掘和计算,持续驱动业务增长

专栏二维码
理论操作系统MyRocks
相关数据
调度技术

调度在计算机中是分配工作所需资源的方法。资源可以指虚拟的计算资源,如线程、进程或数据流;也可以指硬件资源,如处理器、网络连接或扩展卡。 进行调度工作的程序叫做调度器。调度器通常的实现使得所有计算资源都处于忙碌状态,允许多位用户有效地同时共享系统资源,或达到指定的服务质量。 see planning for more details

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

L系统技术

L-系统是匈牙利生物学家Aristid LinderMayer于1968年提出的。.L-系统的本质是一个重写系统,通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂的分形图形。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

操作系统技术

操作系统(英语:operating system,缩写作 OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

暂无评论
暂无评论~