关于oceanbase:OceanBase-数据库源码解读之模块结构

21次阅读

共计 2908 个字符,预计需要花费 8 分钟才能阅读完成。

引言
在数据库 OceanBase 3.0 峰会上,OceanBase 发表正式开源,并成立 OceanBase 开源社区 https://open.oceanbase.com/,300 万行外围代码向社区凋谢。开源的 OceanBase 社区版代码因为通过多年的迭代与变动,新人上手殊为不易。为了帮忙大家理清脉络欢快上手,自己将利用碎片工夫围绕“源码解读”写个系列介绍。将通过一系列文章进行论述,帮您理清数据库的外在实质。

本系列将从以下六大模块进行介绍:

一、数据库的整体架构:梳理 OceanBase 数据库代码的整体架构和模块形成,以及各模块的各自性能。

二、SQL 的毕生:介绍 OceanBase 数据库中任意一条 SQL 的执行流程,包含接管、解决、返回后果给客户端的过程。

三、分区的毕生:解说 OceanBase 数据库存储层的相干常识。

四、事务的毕生:解析 OceanBase 数据库事务的内部接口。

五、租户的毕生:论述 OceanBase 数据库多租户的个性。

六、虚构表:拆解 OceanBase 数据库虚构表的实质。

(注:各位看官,本系列是代码导读,不是设计解读,肯定要联合代码来看,并且最好配上入手实际,否则就是把辅导手册当教材看了。)

通过本系列的源码解读文章,您首先能够理解 OceanBase 数据库的基本原理,轻松 get 数据库的实现步骤。推而广之,您也能够把 OceanBase 的实现原理利用到其余数据库,这对您学习其余的数据库也将带来帮忙。其次,在相熟了 OceanBase 的代码之后,如果有须要,您能够间接在后续工作中应用咱们的代码,或者为 OceanBase 社区奉献您的代码。

注释

本文为《带你读源码系列》第一篇,次要为大家介绍 OceanBase 数据库代码的整体架构和模块形成,以及各模块的性能。

顶层目录

上图为顶层目录。主体代码在 src 目录下,单元测试代码在 unittest 目录下。unittest 目录下单测的目录构造与 src 目录下的构造和命名形式雷同。例如,src/sql/abc.cpp 对应的单测文件是 unittest/sql/test_abc.cpp,单测应用 gtest 和 gmock 框架。unittest 目录下也蕴含一些重要组件的集成测试。

test 目录下则是零碎测试,这里的测试对象是残缺启动的 observer。其中 test/mysql_test 目录下蕴含的各种测试用例是利用批改后的 mysql_test 框架运行的测试用例。它次要用 SQL 来测试零碎性能正确性。

cmake 目录和 build.sh 脚本编译相干,咱们将在当前的文章中具体介绍。

deps 目录

deps 目录比拟特地,它蕴含 src 所依赖的货色。deps/3rd 目录蕴含一组工具,用来下载和编译第三方库,专门为社区版研制。deps/easy 是阿里的多隆大神早年间开发的一个基于 libev 的 rpc 框架,咱们在此基础上做了一些批改。当初随着 OceanBase 的开源,OceanBase 的 rpc 框架是基于 easy 的。deps/oblib 是最外围的根底库。为什么放到这里呢?因为它通过屡次与 OceanBase 代码仓库的分分合合。

oblib 目录

个别状况下,oblib 库不依赖于 OceanBase src,只被依赖。rpc 是 OceanBase 业务代码所应用的外部 rpc 框架,它依赖于 libeasy;rpc 模块也提供了一组不便的宏来快捷定义 rpc。lib 目录是依赖的最底层,它没有内部依赖,蕴含了错误码定义、容器类、内存分配器等大量根底类,以及最根底的头文件 ob_define.h(想喝咖啡时你能够改一下这个文件而后执行 make 进行编译)。个别状况下,oblib 目录下的代码,特地是 oblib/src/lib 下的代码是与 OceanBase 业务代码无关的。也就是说,如果你在做一个其余的 C++ 我的项目,也能够间接应用这个库。留神,OceanBase 的编码标准要求不应用 STL 容器,所以这里有大量的“轮子”。common 目录下的代码依赖于 lib,然而比顶层 src 又更业务无关一些。如果你做一个存储系统(即便不是数据库),可能用的到这里的公共类。这外面最重要的类是 ob_object.h 中的 ObObj 示意一个蕴含类型信息的值。比方新增列类型就要改这个类。

接下来重点介绍 deps/oblib/src/common 目录下的几个子目录。object 目录下是最重要的数据类型 ObObj 的定义,OceanBase 反对的列数据类型,这从枚举类型 ObObjType 中能够看进去。能够看出 36 当前是 Oracle 租户类型下的数据类型。ObObj 是存储和数据处理的“原子”。rowkey 目录下定义的 ObRowkey 是每一行记录的主键。OceanBase 在底层存储只有索引组织表,每一行必须有主键;用户可见的无主键表是通过一个暗藏的自增列做 rowkey 的,算是一个模仿。存储引擎的 memtable 和 sstable 中都是用 rowkey 索引的。row 目录下定义了一行记录的示意 ObNewRow(你找不到 ObRow:),他是数据处理的“分子”,基于它定义的 ObRowIterator 是很多操作类的接口。

log 目录定义了一组很好用的日志宏。OceanBase 代码外面到处都有的 LOG_WARN 等宏就是在 ob_log.h 提供的。它的接口综合了 printf 和 cout 的长处,没有 cout 那么简洁,又是强类型的,且限定了对立的 key-value 格调。为了在 C++ 老版实现这组接口,咱们用了很多模板和宏的绝妙小技巧。如果你先相熟这组接口,再尝试奉献代码,你会爱上他们(这可是调试分布式系统的“小米加步枪”)。

src 目录

终于轮到了 src 目录。

election 是分布式选举模块,它是比拟独立的,因为在运行时如果选举不出 1 号 leader,零碎所有组件就都不工作。它独立于 Paxos 协定。该选举协定要求各节点时钟同步。clog 最后的意思是 commitlog,当初成了专有词汇,特指 OceanBase 的事务 redo 日志。Paxos 的实现也在这个目录下。archive 是日志归档组件,备份复原依赖该组件。

rootserver 目录是 OceanBase 集群总控服务。这个命名不够精确,精确的名字应该是 rootservice,它不是独立过程,而是某些 observer 外部启动的一组服务,感兴趣的读者能够看看 OceanBase 0.4 的开源代码。集群治理和主动容灾、零碎自举、分区正本治理和负载平衡,以及 DDL 的执行都在这个组件中。

share 目录是被强行从“母体”oblib/src/common 中剥离进去的公共类,所以它们的 namespace 是 common 而不是 share。

sql 就是 SQL。storage 就是存储引擎。事务管理位于 storage/transaction 下。

observer 是所有组件的“总装车间”,入口是 ob_server.h 和 ob_service.h。MySQL 协定层的命令解决入口位于 observer/mysql。

结语
数据库的源码内容博大精深。本文对 OceanBase 源码的目录架构做了一个整体概述,后续将会对具体内容进行层层拆解,心愿对大家有所帮忙。

正文完
 0