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 是一个叫做 libeasy 的 rpc 框架,它是基于 libev 的,是阿里的多隆大神早年间开发的,我们做了一些修改,现在随着 OceanBase 开源了。OceanBase 的 rpc 框架是基于 easy 的。deps/oblib 是最核心的基础库。为什么放到这里呢?因为它经过多次与 OceanBase 代码仓库的分分合合。

oblib 目录

一般情况下,oblib 库不依赖于 OceanBase src,只被依赖。rpc 是 OceanBase 业务代码所使用的内部 rpc 框架,它依赖于 libeasy,提供了一组方便的宏来快捷定义 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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容