OceanBase

来自智得网
跳转至: 导航、​ 搜索

简介

OceanBase是阿里巴巴开源的一款NewSQL数据库。

原理

存储引擎

数据库存储引擎一般有两种实现

  • 原地更新(update-in-place ):较常见于传统关系型数据库( MySQL 、Oracle ),这些数据库一般采用的 B+Tree 的结构,有较好的数据局部性,对扫描比较友好。update-in-place 更新记录时直接覆盖原有的数据,会产生大量的随机写,写的过程中会存在并发问题,一定程度上会影响写入性能。
  • 日志更新(log-structure storage): LevelDB 、RocksDB 、HBase 、BigTable 等数据库采用的 LSMTree 结构都是基于日志的。日志更新都采用追加写的模式,过程中不需要锁,不存在并发问题,而且不会有空间碎片,写入性能较高,基于日志的存储一般需要通过异步 compaction 进行GC以及合并各个层级的数据。但是基于日志的存储读路径较长,例如 LSMTree 结构在扫描时需要读取 memtable 、L0层及其余层的数据。

OceanBase 的存储引擎采用日志更新的模式,通过 LSMTree 实现,OceanBase 将数据分为基线数据和增量数据等两部分。

基线数据是指磁盘上已经持久化的数据(SSTable),因为 LSMTree 使用追加写的方式,所以 SSTable 一旦持久化之后,数据一般不再发生变化。

增量数据是指存放在内存的数据(MemTable),所有写入操作都会将数据先存放在增量数据,通过 Redo Log 来保证数据不会发生丢失,MemTable 的数据会在存储容量达到一定阈值时会触发冻结操作( Frozen MemTable ),冻结之后的 MemTable 不再发生变化,会被转存到 SSTable ,并且会重新开启一个新的 MemTable ( Active MemTable )进行数据的存储。转存到外存的SSTable 后续会在合并( LSMTree 结构特有的 compaction 动作 )时将数据合并入基线 SSTable,生成新的 SSTable 。

在查询时,需要将 MemTable 和 SSTable 的数据进行归并,才能得到最终的查询结果。

SQL 引擎

为了兼容传统的关系性数据库,OceanBase实现了 SQL 引擎,SQL 引擎可以处理 SQL 语法的读写请求。

OceanBase 的 SQL 引擎作为整个数据库的计算模块,实现方案和传统数据库非常类似,同样分为解析器、优化器、执行器三部分。经过语法解析、语义分析、查询重写、查询优化等过程后,最终由执行器来负责执行。作为分布式数据库,OceanBase 的数据可能存放在集群不同的存储节点上,所以查询优化器会根据数据的分布信息生成分布式的执行计划,这是分布式数据库 SQL 引擎的重要特点。

优化器

优化器的主要功能是负责 SQL 的优化,为 SQL 请求生成最佳的执行计划。在优化过程中,优化器需要综合考虑 SQL 请求的语义、对象数据特征、对象物理分布等多方面因素,解决访问路径选择、连接顺序选择、连接算法选择、分布式计划生成等多个核心问题,最终选择一个对应该 SQL 的最佳执行计划。SQL 的执行计划是一棵由多个操作符构成的“执行树”。

OceanBase 数据库的查询优化器做了很多优化,诸如算子下推、智能连接、分区裁剪等。

执行器

OceanBase 数据库的查询执行引擎也做了并行处理、任务拆分、动态分区、流水调度、任务裁剪、子任务结果合并、并发限制等优化技术。