购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 源码结构

OceanBase的代码完全采用C++语言编写而成。截至2022年2月6日,OceanBase数据库(不包括OBProxy、OBD等工具)大约包括6000个源码文件以及253万行源码。OceanBase数据库内核源码结构如图2.3所示。

图2.3 OceanBase数据库内核源码结构

2.2.1 依赖库

deps子目录比较特别,它包含OceanBase内核代码的依赖库,deps子目录的目的是尽可能让OceanBase源码包能够形成一个自包含的软件包,使用者只需要从OceanBase源码包编译部署就能让OceanBase集群运行起来,而不需要手工下载安装各种依赖库。

1)3rd子目录包含一组工具,用来下载和编译第三方库。这些第三方库以预编译的Linux软件包(RPM包)形式发布在阿里云的镜像仓库中,3rd用deps后缀的文本文件记录了该仓库的URL地址以及需要的第三方库名称。使用build.sh脚本进行OceanBase编译时会自动根据deps文件从镜像仓库中下载这些RPM包并且安装在编译环境中。

2)easy子目录实现的是名为libeasy 的RPC框架,它是在libev基础上修改形成,OceanBase集群的节点间交互完全依赖于这套RPC机制。

3)oblib子目录包括最核心的基础库,它没有外部依赖,包含了错误码定义、容器类、内存分配器等大量基础类,以及最基础的头文件ob_define.h。一般情况下,oblib子目录下的代码(特别是oblib/src/lib下的代码)是与OceanBase内核的业务代码无关的。此外,由于OceanBase的编码规范要求不使用STL容器,因此oblib中自行实现了很多STL容器提供的功能。

2.2.2 内核源码

src子目录中是OceanBase数据库内核代码:

1)election子目录实现的是分布式选举模块,典型的用途是在多个副本之间选举一个作为Leader,当Leader失效时同样需要从剩余的副本中选出新的Leader。其具体实现分析见第7章。

2)clog子目录包含事务日志的实现。clog的原意是指提交日志(Commit Log),由于历史原因现在实际表示的是事务的重做日志。OceanBase中用于副本同步的Paxos协议也实现在这个目录中。

3)archive子目录中是日志归档组件,事务日志接收的数据流量会很大,这会使得存放事务日志的存储空间承受很大的压力。因此这个存储位置上只保留最近一段时间的日志(活跃事务日志),更老旧的日志(归档事务日志)被归档组件转移到其他安全的存储位置。需要事务日志进行数据库恢复时,归档组件也负责将归档日志提供给恢复子系统。

4)rootserver子目录是OceanBase集群总控服务(Root Service)。如2.1节所述,准确来说,总控服务是运行在某个OBServer上的一组服务,这台OBServer就是RootServer。集群管理和自动容灾、系统自举、分区副本管理和负载均衡以及DDL的执行都由总控服务提供。

5)share子目录包括OceanBase中一些公共组件,例如线程池、各种“管理器”、系统配置参数操作等都位于这个目录中。

6)sql中实现有OceanBase的SQL引擎部分,其下用子目录清晰地组织了SQL引擎的各个组件,包括解析器、重写器、优化器、代码生成器、执行器等,具体见第5章。

7)storage子目录实现了存储引擎,负责数据在内存和外存中的组织和访问,事务管理也位于其transaction子目录下。

8)observer中实现的是OBServer的主干过程,OBServer作为一个守护进程运行,通过所支持的通信协议(MySQL协议)或RPC接收集群内外的请求,然后调动其他内核组件完成对请求的服务。

2.2.3 其他子目录

图2.3中的unittest目录包含有OceanBase的单元测试代码,其下各个子目录与src目录下的子目录一一对应,而每一个子目录中的源码文件也就是内核相应组件源码文件的单元测试。例如,src/sql/abc.cpp对应的单元测试文件是unittest/sql/test_abc.cpp。单元测试使用gtest和gmock框架实现,unittest中也包含一些重要组件的集成测试。

而test目录下是OceanBase的回归测试脚本,用来在对OceanBase系统进行修改后测试原有功能特性是否仍然正常。本质上,每一个回归测试脚本都由一个SQL文件和一个预期结果文件组成,通过执行SQL文件得到的实际结果与预期结果之间的对比来判断该功能是否正常。因此,回归测试的实施需要通过OBD工具发起,通过其test选项以及指定回归测试脚本所在路径的参数来执行SQL文件、截获输出结果并与预期结果进行比较形成测试报告。

最后,tools子目录中包含将操作系统中时区数据转换为SQL脚本的工具,所生成的SQL脚本被用于在数据库中导入时区信息,以支持数据库中的各种日期、时间相关数据类型的操作和转换。 icDrDtcB/kiXk6ccwayDT/UtNyGUqbIDdlzxrUJs3nlJQGDfsv1fxD2dL1Y1unfR

点击中间区域
呼出菜单
上一章
目录
下一章
×