OceanBase代码导览

介绍

OceanBase 是蚂蚁集团/阿里巴巴完全自主研发的一款分布式关系型数据库,在今年 6 月 1 号,OceanBase 开源了 3.1 版本的源代码,称为 OceanBase 社区版(下文简称 OceanBase)。OceanBase 是一款开源分布式 HTAP(Hybrid Transactional/Analytical Processing)数据库管理系统,具有原生分布式架构,支持金融级高可用、透明水平扩展、分布式事务、多租户和语法兼容等企业级特性。本文先简单地介绍 OceanBase 的架构,然后描述 OceanBase 的源代码的整体结构。

OceanBase 社区版架构

集群架构

OceanBase 社区版的一个集群通常由多个 Zone 组成,一个 Zone 由一个或多个 ObServer 组成的,每个 ObServer 都具有计算和存储的功能。在 ObServer 中有一个较为特殊,负责总控服务的节点称为 RootService,负责管理集群的元数据和路由信息,其中,元数据是按照多版本方式管理的。OceanBase 按照分区的方式管理数据,一张表包含一个或多个分区,每个分区的数据会存储在多个 Zone 中,每个 Zone 都是一份完整的数据拷贝(副本)。每个分区的副本中会有一个 Leader 副本,负责处理该分区的读写请求。如下图所示,该 OceanBase 集群中有 3 个 Zone,每个 Zone 内有 3 个 ObServer,每个 Zone 内各自有一个 RootService 节点,每个分区在每个 Zone 里都有一个分区,总共 3 个副本,通过一致性算法 PAXOS 来保证三个副本数据的一致性。

ObServer 架构

在每个 ObServer 中都包含 SQL 引擎、存储引擎两个部分,其中 SQL 引擎负责 SQL 的解析和执行,存储引擎主要包括事务处理、分布式环境数据一致性处理以及基于 LSM-Tree 架构的数据存储。

SQL 引擎

跟单机数据库类似,OceanBase 的 SQL 引擎也主要分为三个部分,包括解析器、优化器和执行器。当 SQL 引擎接受到了 SQL 请求后,经过语法解析、语义分析、查询重写、查询优化等一系列过程后,再由执行器来负责执行。所不同的是,在分布式数据库里,查询优化器会依据数据的分布信息生成分布式的执行计划。如果查询涉及的数据在多台服务器,需要走分布式计划,这是分布式数据库 SQL 引擎的一个重要特点,也是十分考验查询优化器能力的场景。OceanBase 数据库查询优化器做了很多优化,诸如算子下推、智能连接、分区裁剪等。如果 SQL 语句涉及的数据量很大,OceanBase 数据库的查询执行引擎也做了并行处理、任务拆分、动态分区、流水调度、任务裁剪、子任务结果合并、并发限制等优化技术。

存储引擎

OceanBase 的存储引擎主要提供事务执行、多副本数据一致性处理和 LSM-Tree 存储引擎三方面能力。在事务执行方面,OceanBase 需要保证在分布式环境下事务的 ACID 特性;在多副本数据一致性处理方面,OceanBase 采用了 PAXOS 一致性算法来保证数据在正常以及容灾场景下多副本数据的一致性;在数据存储方面,OceanBase 提供了 LSM-Tree 架构的存储引擎,具有高压缩比等特点。

OceanBase 源代码结构

OceanBase 源代码可以从OceanBase 开源项目链接下载,所有内核相关的源代码都在 src 目录下,它下面主要有 rootserver、sql、storage、observer、election 和 clog 目录,下面将分别介绍这些子目录的代码结构。

sql 目录

sql 里有 parser、resolver、rewrite、optimizer、executor、dtl、code_generator、engine、plan_cache、session 等。

  • parser:SQL 语法解析
  • resolver:SQL 语义解析
  • rewrite:SQL 重写
  • optimizer:优化器
  • execuctor:执行器
  • dtl:数据传输层
  • code_generator:由逻辑执行计划生成物理执行计划
  • engine:各种物理算子的实现
  • plan_cache:物理执行计划缓存
  • session:数据库会话管理

storage 目录

storage 里有 blocksstable、compaction、gts、memtable、replayengine、transaction 以及 storage 目录本身的代码文件。

  • blocksstable:包括存储格式、各种缓存等
  • compaction:LSM-Tree 存储中 compaction 相关的逻辑
  • gts:全局时间戳实现,主要用于提供全局事务版本号
  • memtable:LSM-Tree 引擎中 memtable 的实现
  • replayengine:redo 日志回放的实现
  • transaction:事务处理相关
  • storage 目录本身的代码:基于上述代码提供读写等服务

rootserver 目录

rootserver 目录包括 backup、restore、virtual_table 和 rootserver 目录本身的代码

  • backup:备份中 RootService 管理部分
  • restore:恢复中 RootService 管理部分
  • virtual_table:RootService 相关的虚拟表,是 OceanBase 中将内存中信息通过数据库表格方式展示的手段
  • rootserver:包含了 Schema 元数据管理、路由信息管理、负载均衡、机器管理、资源规格管理等

observer 目录

observer 目录包括 omt、virtual_table、observer 目录本身的代码

  • omt:ObServer 单机租户管理
  • virtual_table:ObServer 级别的虚拟表
  • observer 目录本身的代码:一些 ObServer 级别的服务,例如 ObServer 的启动,路由表的汇报等

election 目录

包含了 PAXOS 选主相关的实现。

clog 目录

包含了 PAXOS 相关的实现。

本文主要是对 OceanBase 代码做了概览,希望能帮助大家对 OceanBase 整体代码结构有大概的认识。后续还将结合 OceanBase 的设计、代码对各个模块相应的解读。