OceanBase 从0到1数据库内核实战教程学习笔记 - 2.MiniOB概述和环境搭建

今天的学习笔记是学习关于王运来老师分享的《MiniOB - 帮你从底层深入了解数据库实现》。

MiniOB 简介

首先 运来老师介绍了 MiniOB 的来历。由于数据库是软件行业的三驾马车之一,非常重要,但是很多相关从业人员,受限于数据库内核超级广的知识体系,并不了解数据库的底层实现原理,所以上手并不容易。另外国内数据库起步比较晚,教育、科研人才积累的比较少。

基于这些背景,OceanBase 社区希望通过 MiniOB 及其对应的系列课程,学习到很多数据库底层的原理。

当前 MiniOB 设计的比较简单,功能结构也比较清晰,可以通过下面的架构图形成一个整体的认识。下面我们跟着运来老师的思路,了解一下各个模块:
OceanBase 从0到1数据库内核实战教程学习笔记 - 2.MiniOB概述和环境搭建_第1张图片

  1. Client 向灰色框框里的服务端发起访问请求;
  2. NET 网络模块接受到请求以后,将请求交给 Parser 模块进行词法解析(LEX)和语法解析(YACC);
  3. 经过词法解析和语法解析后,转发给 Plan Cache 这个模块,当前的 Plan Cache 不做任何特殊处理,直接丢给 Resolver 模块
  4. Resolver 模块会将 Parser 模块解析出来的语法树进行细化,比如把里面表的名字转换成某一个对象、比如把 SELECT * 中的 * 转换为表中的各个字段;当然在这个阶段还会进行一些预检,比如查看该表是否存在;
  5. 接下来会传给优化阶段的 Transformer 和 Optimizer,这两个部分像前一篇文章纪老师提到的一样,会不断的迭代,尽量找到一个低成本的执行计划;Transformer 会根据一些 SQL 规则进行一些优化;Optimizer 会根据一些统计数据找到一个更好的查询路径;
  6. 然后会传给后面的 Executor 执行模块,按照执行计划执行查询,把执行结果返回给 NET 网络模块;
  7. NET 模块通过 Socket 返回给客户端。

MiniOB 开发调试环境搭建

当前已经确认没问题的环境是 Mac 和 Linux 机器,如果是 Windows 机器的话,可以尝试 Linux 子系统、虚拟机 Linux 或 Docker 来做。

环境搭建大概需要如下几个步骤:

  1. 安装 CMAKE,版本建议 3.20 以上的版本
  2. 安装 GCC,版本建议 8.3 以上的版本
  3. 下载代码
  4. 安装依赖库
  5. 编译 MiniOB

依赖库和MiniOB的编译,可以参考文章:https://github.com/oceanbase/miniob/blob/main/docs/how_to_build.md 进行。如果有遇到问题,可以在我的帖子中搜索 MiniOB 编译问题解决的那个帖子。

注意:在编译时为了方便调试,建议将 DEBUG选项加上,比如:cmake … -DDEBUG=ON

如果大家希望采用 Docker,可以参考一下 Docker Hub 的位置下载已经准备好的环境:
OceanBase 从0到1数据库内核实战教程学习笔记 - 2.MiniOB概述和环境搭建_第2张图片

上手调试环境演示

上面的开发调试环境搭建好了以后,接下来我们跟着运来老师一起来看一下如何使用和调试 MiniOB。

  1. 编译好以后,在 MiniOB 目录的 build 文件夹下,会生成 bin 文件夹,可执行的 server 和 client 文件都在此处
  2. 下面我们通过指定 sock 和 配置文件 的方式启动 observer,指定 & 符号启动后台运行
    $ ./bin/observer -s miniob.sock -f ../etc/observer.ini &
    [1] 13072
    Successfully load ../etc/observer.ini
    
  3. 启动后,会在本地生成一个日志文件,如果平时我们使用 gdb 比较麻烦,可以通过查看日志来进行一些问题定位操作
    -rw-r--r--   1 chris  staff  47085 10  2 14:27 observer.log.20221002
    
  4. 接着,我们可以使用客户端连接到 observer 进行一些操作
    $ ./bin/obclient -s miniob.sock
    miniob > show tables;
    t1
    miniob > create table t2(id int);
    SUCCESS
    miniob > insert into t2(id) values(1);
    Failed to parse sql
    miniob > insert into t2 values(1);
    SUCCESS
    miniob > select * from t2;
    id
    1
    miniob >
    

今天的内容大概就这些~

最后的最后,如果大家感兴趣,可以多关注和参与 OB 的活动:https://ask.oceanbase.com/t/topic/35601006。

你可能感兴趣的:(OceanBase,oceanbase,数据库,学习)