OceanBase 数据库源码解读之模块结构

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文为《带你读源码系列》第一篇,主要为大家介绍 OceanBase 数据库代码的整体架构和模块构成,以及各模块的功能。

竹翁,OceanBase 内核研发总监

杨志丰,花名竹翁,毕业于北京大学,长期从事分布式系统和数据库的研发工作,现于阿里巴巴/蚂蚁金服自主研发的分布式关系数据库 OceanBase 团队负责研发工作,致力于把设计先进的 HTAP 数据库系统打造成技术业内标杆的核心基础设施。在 OceanBase 系统中,他先后负责研究 OceanBase 的 SQL 引擎、分布式主控模块、多模数据库方向以及 OceanBase 的数据库平台产品研发,并于近期开始负责内核创新研发工作。竹翁对 C++、分布式系统原理、SQL 查询处理、事务处理、编译技术、工程效率等方面具有深入的理解。


引言


在数据库 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 数据库代码的整体架构和模块构成,以及各模块的功能。

 

顶层目录

1.jpg

上图为顶层目录。主体代码在 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 目录

2.jpg

deps 目录比较特别,它包含 src 所依赖的东西。deps/3rd 目录包含一组工具,用来下载和编译第三方库,专门为社区版研制。deps/easy 是阿里的多隆大神早年间开发的一个基于 libev 的  rpc 框架,我们在此基础上做了一些修改。现在随着 OceanBase 的开源,OceanBase 的 rpc 框架是基于 easy 的。deps/oblib 是最核心的基础库。为什么放到这里呢?因为它经过多次与 OceanBase 代码仓库的分分合合。


oblib 目录

3.jpgimage.gif

一般情况下,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 表示一个包含类型信息的值。比如新增列类型就要改这个类。

4.jpg

接下来重点介绍 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 目录

5.jpg

终于轮到了 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 源码的目录架构做了一个整体概述,后续将会对具体内容进行层层拆解,希望对大家有所帮助。

 

在阅读过程中,如果您有任何疑问,可以通过以下方式与我们进行交流:

钉钉群:33254054

6.jpg

钉钉扫码入群


github:https://github.com/oceanbase/oceanbase

博客问答:https://open.oceanbase.com/answer

gitee:https://gitee.com/oceanbase

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
59 0
|
12天前
|
Oracle 关系型数据库 MySQL
OceanBase 与传统数据库的对比
【8月更文第31天】随着云计算和大数据技术的发展,分布式数据库因其高扩展性、高可用性和高性能而逐渐成为企业和开发者关注的焦点。在众多分布式数据库解决方案中,OceanBase作为一个由阿里巴巴集团自主研发的分布式数据库系统,以其独特的架构设计和卓越的性能表现脱颖而出。本文将深入探讨OceanBase与其他常见关系型数据库管理系统(如MySQL、Oracle)之间的关键差异,并通过具体的代码示例来展示这些差异。
48 1
|
20天前
|
安全 Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+jsp实现的健身房管理系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术实现的健身房管理系统。随着健康生活观念的普及,健身房成为日常锻炼的重要场所,高效管理会员信息、课程安排等变得尤为重要。该系统旨在通过简洁的操作界面帮助管理者轻松处理日常运营挑战。技术栈包括:JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Shiro、Spring Boot 2.0等。系统功能覆盖登录、会员管理(如会员列表、充值管理)、教练管理、课程管理、器材管理、物品遗失管理、商品管理及信息统计等多方面。
|
18天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
在数字化时代背景下,本文详细介绍了如何使用Spring Boot框架结合Vue.js技术栈,实现一个前后端分离的考试管理系统。该系统旨在提升考试管理效率,优化用户体验,确保数据安全及可维护性。技术选型包括:Spring Boot 2.0、Vue.js 2.0、Node.js 12.14.0、MySQL 8.0、Element-UI等。系统功能涵盖登录注册、学员考试(包括查看试卷、答题、成绩查询等)、管理员功能(题库管理、试题管理、试卷管理、系统设置等)。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
|
21天前
|
关系型数据库 OLAP 分布式数据库
揭秘Polardb与OceanBase:从OLTP到OLAP,你的业务选对数据库了吗?热点技术对比,激发你的选择好奇心!
【8月更文挑战第22天】在数据库领域,阿里巴巴的Polardb与OceanBase各具特色。Polardb采用共享存储架构,分离计算与存储,适配高并发OLTP场景,如电商交易;OceanBase利用灵活的分布式架构,优化数据分布与处理,擅长OLAP分析及大规模数据管理。选择时需考量业务特性——Polardb适合事务密集型应用,而OceanBase则为数据分析提供强大支持。
61 2
|
23天前
|
JavaScript Java Maven
毕设项目&课程设计&毕设项目:springboot+vue实现的在线求职管理平台(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和Vue.js实现的在线求职平台。该平台采用了前后端分离的架构,使用Spring Boot作为后端服务
毕设项目&课程设计&毕设项目:springboot+vue实现的在线求职管理平台(含教程&源码&数据库数据)
|
23天前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之如何处理在DI节点同步到OceanBase数据库时,出现SQLException: Not supported feature or function
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
1月前
|
Oracle 架构师 分布式数据库
OceanBase数据库的发展历程是什么?
【8月更文挑战第11天】OceanBase数据库的发展历程是什么?
134 63
|
1月前
|
Oracle 关系型数据库 MySQL
OceanBase数据库简介
【8月更文挑战第9天】OceanBase数据库简介
218 60
|
30天前
|
存储 SQL 数据库
OceanBase数据库的分区策略
【8月更文挑战第13天】OceanBase数据库的分区策略
98 5