暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第 3 章:OceanBase 存储引擎 3.4 存储格式介绍

302

3.4 存储格式介绍

存储分层结构

从 OceanBase 数据库的存储视角来看,存储结构里最上层是 Partition Group,对应一个分区组,很多时候我们也将其简称为 PG。OceanBase 保证了同一个 PG 中的多个 Partition 始终绑定在一起,那么对于同一个 PG 的事务操作就会被优化为单机事务,写入性能会更好。同一个 PG 中的多个 Partition 的分区键和分区规则要完全相同,每个 Partition 包含与之对应的多个版本的 Table Store,每个 Table Store 相当于一个快照点的数据集合,包含特定时间数据快照。当历史版本的 Table Store 没有被访问时,会通过 GC 线程回收掉。

存储分层结构

Table Store 内部,数据按照热、温、冷的顺序,依次分布在 MemTable、Mini/Minor SSTable、Major SSTable 中。最新数据写入 Active MemTable,当 MemTable 达到一定大小后,会冻结不再写入,创建新的 Active MemTable 提供写入。

为了节省内存,冻结 MemTable 会转储写到磁盘文件上,生成 Mini SSTable。当 Mini SSTable 个数增多时,各个 SSTable 间主键交叉的概率会增大,影响查询效率,这时会触发 Mini/Minor SSTable 之间的合并,将多个多版本 SSTable 合并成 Minor SSTable。

OceanBase 采用 LSM-Tree 的数据组织形式,数据只能以追加的方式写入。每次插入、更新、删除都是一条写入记录,MemTable 和 Mini/Minor SSTable 保留了数据的多版本信息,包含比较多的冗余信息。而现实业务中,一般较少更新历史数据,并且只需要读取数据的最新版本,这样对于历史冷数据存储,有比较多的优化方案。

OceanBase 系统运行时,在满足一定条件时,会选取某个历史快照点,读取数据最新版本,写入 Major SSTable 中。Major SSTable 只保留主键在快照中的最新完整行,采用了行列混存的模式,对数据进行分段编码和压缩,减少数据存储成本的同时极大地提高了查询性能。


内存数据格式

OceanBase 数据库的内存存储引擎 MemTable 由 BTree 和 Hash Table 组成,在 Hash Table 和 BTree 中存储的均为指向对应数据的指针。

内存数据格式

Hash Table 比较适合按主键查找,适用于 DML 时主键校验或者其它按主键查找;BTree 中数据都是按主键有序的,比较适合按主键范围查找。


磁盘文件格式

OceanBase 的磁盘存储文件叫作 SSTable,分为多版本 SSTable 和基线 SSTable。其中,Mini SSTable 和 Minor SSTable 都是多版本 SSTable,它包含一段连续时间内写入的数据;Major SSTable 是基线 SSTable,它包含某个快照点内的所有完整提交数据。

为了兼顾写和读的性能,SSTable 内部又按数据大小分为宏块和微块。宏块是数据写 I/O 的基本单位,是大小为 2M 的定长数据块;微块是数据读 I/O 的基本单位,为变长数据块,微块内部数据可以按照行存或者列式编码存储,每个宏块包含多个微块,如下图所示。

磁盘文件格式

在宏块的最前面的是宏块头,记录宏块内部微块个数,微块数据起始位置等信息;后面跟着的就是一个个长度不固定的微块,存储用户数据;在微块之后,存储微块索引信息(Micro Block Index),记录每个微块在宏块内的相对偏移 Offset、每个微块的 EndRowKey 等信息。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论