OB有问必答 | OceanBase存储引擎基于LSM Tree的理论做了哪些创新和实践?

简介: OceanBase存储引擎基于LSM Tree的实践

OceanBase数据库采用了基于 LSM Tree 结构作为数据库的存储引擎,数据被分为基线数据(SSTable)和增量数据(MemTable)两部分,基线数据被保存在磁盘中,当需要读取的时候会被加载到数据库的缓存中,当数据被不断插入(或者修改时)在内存中缓存增量数据,当增量数据达到一定阀值时,就把增量数据刷新到磁盘上,当磁盘上的增量数据达到一定阀值时再把磁盘上的增量数据和基线数据进行合并。

3B3CA800-1E5F-4a31-87EE-373060CE6500.png


对于 LSM Tree 结构,如果保存多个层次的 MemTable 的话,会带来很大的空间存储问题,OceanBase 对 LSM Tree 结构进行了简化,只保留了C0层和C1层(参考上期有问必答内容),也就是说,内存中的增量数据会被以MemTable的方式保存在磁盘中,这个过程被称之为转储(compaction),当转储了一定的次数之后,就需要把磁盘上的MemTable与基线数据进行合并(merge)。以下是转储与合并的详细解释:

转储:由于内存中对数据的修改会持续发生,所以在内存中的 MemTable 就会越来越多,为了释放内存空间,OceanBase 会定义一个 MemTable 占用内存比例的阀值,当到达这个阀值的时候,就要把一些最旧的 MemTable 中的信息进行归并排序,并保存到磁盘上,形成C0级别的数据,这个过程称之为转储,OceanBase 把这个过程称之为转储(Minor Freeze)。

合并:合并操作(Major Freeze)是将动静态数据做归并,也就是产生新的C1层的数据,会比较费时。当转储产生的增量数据积累到一定程度时通过 Major Freeze 实现大版本的合并。由于在合并的过程中为了保证数据的一致性,就需要在合并的过程中暂停正在被合并的数据上的事务,这对性能来说是会有影响的,OceanBase 对合并操作进行了细化,分为增量合并,轮转合并和全量合并。

下面的表格描述了转储与合并的区别:

7FFEED8F-C153-4346-975A-180EFEA569DC.png

OceanBase同时也结合了传统的关系型数据库的特点,也存在数据库块的概念。在 OceanBase 中,数据文件分配空间的单位称为宏块(marco block),如果大家对Oracle比较熟悉的话,可以简单的认为宏块对应了Oracle中的extent;每个宏块又分成了若干个16k大小的微块,它是每次数据库IO的最小单位(相当于传统数据库的块),数据库中的各种数据就保存在微块当中。由于宏块的大小是2M,而且 OceanBase 采用了LSM Tree 结构来保存数据,数据是按照表的主键排序的。所以,OceanBase 的宏块是可以分裂的,而如果数据被删除了,相邻的宏块也可以进行合并

由于 SSTable 中的数据是基线数据,绝大部分情况下,这部分数据是静态的,所以 OceanBase 默认会对这些数据在进行合并时进行分析,并根据各个列的数据分布情况对数据进行编码,目前支持的编码方式有:字典编码、RLE编码、常量编码、差值编码、前缀编码、列间编码等。在对数据进行编码之后,再通过通用的压缩算法对数据进行压缩,就可以实现很好的数据压缩比,同时对于读取性能基本没有影响,而且使合并时的写入性能更好。下面的图片展示了使用字典方式对列rate_id进行编码的基本过程。

相关文章
|
6月前
|
SQL 流计算 OceanBase
OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
【2月更文挑战第25天】OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
173 3
|
6月前
|
SQL 数据库 Docker
OBCP实践 - OceanBase Docker 体验
开发者和技术爱好者可以在无需复杂安装配置的情况下迅速搭建OceanBase数据库环境,从而方便地进行功能测试、性能评估或者开发调试等实践活动。同时,由于Docker的便捷性,此方法也支持跨平台部署,使得OceanBase数据库能够在不同的操作系统(如Linux、Windows、macOS)上轻松体验。
287 2
|
6月前
|
SQL Java Shell
OBCP实践 - OceanBase 执行计划
在OceanBase数据库管理系统中,执行计划(Execution Plan)是数据库优化器基于SQL查询语句生成的一种逻辑表示,它详细说明了数据库如何执行SQL查询,包括选择合适的索引、连接顺序、临时数据处理方式、排序算法等一系列操作步骤,最终目的是为了最有效地获取所需数据并返回给客户端。
156 0
|
4月前
|
DataWorks API 数据库
DataWorks操作报错合集之在使用 OceanBase (OB) 作为数据源进行数据集成时遇到报错,该如何排查
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
存储 关系型数据库 数据处理
OceanBase数据库常见问题之start ob出错如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
4月前
|
DataWorks 关系型数据库 MySQL
DataWorks操作报错合集之从OceanBase(OB)数据库调度数据到MySQL数据库时遇到连接报错,该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
SQL 关系型数据库 MySQL
OBCP实践 - 迁移 MySQL 数据到 OceanBase 集群
OBCP实践 - 迁移MySQL数据到OceanBase集群,这是一个涉及到将现有MySQL数据库的数据和表结构迁移到OceanBase分布式数据库集群的实际操作过程。OceanBase是一款高度兼容MySQL协议的分布式数据库产品,支持在线平滑迁移,以便企业用户可以从传统的MySQL数据库平滑迁移到OceanBase,以实现更高的可用性、扩展性和性能。
126 0
|
6月前
|
运维 安全 网络安全
OBCP实践 - 手动部署 OceanBase 集群
手动部署OceanBase集群是一项专业且细致的工作,需要深入理解OceanBase的架构原理和部署流程,同时也需具备丰富的数据库管理和运维经验。对于初次接触OceanBase的用户,建议先从简单的单节点或通过Docker部署开始体验,然后再逐步过渡到复杂集群环境的部署和运维。
113 0
|
存储 调度 数据库
OceanBase存储引擎高级技术——内存数据落盘策略-合并和转储
OceanBase存储引擎高级技术——内存数据落盘策略-合并和转储
1081 0
|
容灾 Cloud Native 新金融
与客户手拉手|OceanBase客户实践精选Top 10
这个假期不像大风刮来的,却像大风刮走的......(开心吗?调休换的🥰)已经在收拾行李,准备开始新一年的“奋斗”生活了! 继<春节系列回顾>为大家带来的“技术文章”和“专访观点”后,最后来盘点一下 2022 年 OceanBase 客户实践精选 Top 10,希望为您带来一些启发与思考,也欢迎收藏或分享(点击下方图片直达原文🤩)。
317 0
与客户手拉手|OceanBase客户实践精选Top 10