【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑

前 言
作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端、数据库内核及生态开发
☕专栏简介:相当硬核,讲解数据库内核开发的理论、实战,带你深入解读数据库源码,剖析内核原理,实战手撸数据库内核
文章简介:一篇文章快速上手数据库内核开发,从0到1部署开源数据库(MinoOB),引爆你的数据库学习热情,挑战数据库领域最强大脑,成为开源社区的contributor
文章对应视频教程:https://open.oceanbase.com/activities/4921877?id=4921929
github仓库:https://github.com/oceanbase/miniob

文章目录

  • 1、数据库系统概述
    • 1.1 给入门小白洗洗脑
      • 1.1.1 为什么学习数据库内核
      • 1.1.2 数据库开发入门难吗
      • 1.1.3 这篇文章教你什么内容
    • 1.2 数据库的那些事儿
      • 1.2.1 没有数据库真的让开发头大
      • 1.2.2 数据库要解决什么问题
      • 1.2.3 早期的数据库系统
      • 1.2.4 现代主流数据库系统
      • 1.2.5 数据库简史
      • 1.2.6 数据库架构
  • 2 MiniOB——从底层深入了解数据库实现
    • 2.1 MiniOB介绍
      • 2.1.1 数据库系统学习的难点
      • 2.1.2 MiniOB架构
    • 2.2 MiniOB的开发调试环境搭建
      • 2.2.1 docker安装部署
      • 2.2.2 源码部署与配置
      • 2.3.3 基于vscode远程ssh开发

1、数据库系统概述

1.1 给入门小白洗洗脑

1.1.1 为什么学习数据库内核

  • 了解底层
  • 出故障救火
  • 数据库开发不吃青春饭,越老越吃香
  • 未来趋势,国家要防止数据库被老美卡脖子

1.1.2 数据库开发入门难吗

不难。可以从简单的MiniOB的开始,

MiniOB只有几万行,
SQLLite只有二十多万行源码,
还有大神早就写了经典教材
《数据库系统实践》
《数据库系统概念》

而且你们还有我帮你们踩坑。

1.1.3 这篇文章教你什么内容

课程分为两部分。入门与进阶。这篇先带大家入门,该专栏后续还有很多文章带大家深入。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第1张图片
进阶超级超级硬核的~
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第2张图片
点击关注不迷路。

1.2 数据库的那些事儿

1.2.1 没有数据库真的让开发头大

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第3张图片

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第4张图片

1.2.2 数据库要解决什么问题

最大的问题归根结是没有进行抽象。

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第5张图片

1.2.3 早期的数据库系统

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第6张图片
淘汰原因:描述的世界,结构太死板,不灵活。不够简单,无法提供抽象简单数据库语言,根本原因!

1.2.4 现代主流数据库系统

关系型数据库
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第7张图片
关系间可以相互转化,不会丢失语义。
逻辑层关系代数,物理层用关系存储清晰。

NoSQL
解决存储容量不能线性扩展的痛点:提出分布式支持数据库无限线性
底层数据模型:K-V,不需要预定义结构
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第8张图片

1.2.5 数据库简史

数据库是图灵奖最多的领域,膜拜数据库之神
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第9张图片
数据库简史
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第10张图片
MongoDB:在文档上解决特别好

OceanBase:NewSql + HTAP

Amazon Aurora:云上数据库系统

1.2.6 数据库架构

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第11张图片

parser:词法分析、语法分析(生成语法树)。
Query result cache:直接对SQL进行硬解析。
resolver:对部分变量进行替换,生成语法树。
plan chache:命中plan chache成功则将其丢到物理执行器Executor中,否则扔到优化器里去
Transformer:进行逻辑优化,比如索引下推。
Optimizer:进行代价优化,从众多物理执行计划选出最优。工业中与transformer进行混杂,选择相对优的执行计划(为了节约时间、不一定会选最优)。
code generator:将多个算子merge,生成更加高效的算子。
日志恢复分为物理日志和逻辑日志。

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第12张图片

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第13张图片
B+树,平衡二叉树,读写性能均衡算法

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第14张图片

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第15张图片

2 MiniOB——从底层深入了解数据库实现

2.1 MiniOB介绍

2.1.1 数据库系统学习的难点

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第16张图片

2.1.2 MiniOB架构

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第17张图片

2.2 MiniOB的开发调试环境搭建

2.2.1 docker安装部署

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第18张图片
顺带一提,本教程相关的材料方法都可以从这里获取:https://github.com/oceanbase/miniob,

本部分获得了大佬:徐文昊的碎碎念 的鼎立相助,https://www.xuwh.top,欢迎关注。

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第19张图片

环境搭建有多种方式,可以参考源码中的docs文件,我个人经过踩坑,采用了下面这个方式,docker+vscode开发调试环境。docker官方建议在Ubuntu环境安装。这里我们在windows的wsl子系统使用docker搭建开发调试环境

看看自己电脑有没有开启虚拟化,没有的话自行百度解决。

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第20张图片

https://hub.docker.com/,下一个docker

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第21张图片
会提示下载linux子系统,这样性能更加出色,否则会使用虚拟机方式,参考官方链接配置即可。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第22张图片
到这里docker就装好了

2.2.2 源码部署与配置

在wsl中把代码clone下来。

 sudo git clone https://github.com/oceanbase/miniob.git --depth 1

将dockerfile替换下,改了下官方的镜像文件 build出来的docker container加了 openssh-server 可以远程ssh到容器里,装了个zsh好用点,然后挂载了下本地目录。

# how to use
# docker build -t miniob .
# make sure docker has been installed
# FROM rockylinux:8
FROM openanolis/anolisos:8.6

ARG HOME_DIR=/root
ARG GIT_SOURCE=github

ENV LANG=en_US.UTF-8

# install rpm
# note: gcc-c++ in rockylinux 8 and gcc-g++ in rockylinux 9. use `dnf groupinfo "Development Tools"` to list the tools
RUN dnf install -y make cmake git wget which flex gdb gcc gcc-c++ diffutils readline-devel texinfo
# rockylinux:9 RUN dnf --enablerepo=crb install -y texinfo
# rockylinux:8
# RUN dnf --enablerepo=powertools install -y texinfo

# prepare env
WORKDIR ${HOME_DIR}
RUN echo alias ls="ls --color=auto" >> .bashrc
RUN echo "export LD_LIBRARY_PATH=/usr/local/lib64:\$LD_LIBRARY_PATH" >> .bashrc

# clone deps and compile deps
RUN mkdir -p ${HOME_DIR}/deps
WORKDIR ${HOME_DIR}/deps

RUN git clone https://gitee.com/mirrors/libevent.git  -b release-2.1.12-stable  \
    && mkdir -p ${HOME_DIR}/deps/libevent/build  \
    && cmake -DEVENT__DISABLE_OPENSSL=ON -B ${HOME_DIR}/deps/libevent/build ${HOME_DIR}/deps/libevent \
    && make -C ${HOME_DIR}/deps/libevent/build -j install \
    && rm -rf ${HOME_DIR}/deps/*

RUN git clone https://gitee.com/mirrors/jsoncpp.git \
    && mkdir -p ${HOME_DIR}/deps/jsoncpp/build \
    && cmake -DJSONCPP_WITH_TESTS=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF -B ${HOME_DIR}/deps/jsoncpp/build ${HOME_DIR}/deps/jsoncpp/ \
    && make -C ${HOME_DIR}/deps/jsoncpp/build -j install \
    && rm -rf ${HOME_DIR}/deps/*

RUN git clone  https://gitee.com/mirrors/googletest.git \
    && mkdir -p ${HOME_DIR}/deps/googletest/build  \
    && cmake -B ${HOME_DIR}/deps/googletest/build ${HOME_DIR}/deps/googletest \
    && make -C ${HOME_DIR}/deps/googletest/build -j install \
    && rm -rf ${HOME_DIR}/deps/*

RUN wget http://ftp.gnu.org/gnu/bison/bison-3.7.tar.gz \
    && tar xzvf bison-3.7.tar.gz \
    && cd bison-3.7 \
    && ./configure --prefix=/usr/local \
    && make -j install \
    && rm -rf ${HOME_DIR}/deps/*

# install openssh
RUN yum -y install openssh openssh-clients openssh-server

RUN echo "root:root" | chpasswd #修改root密码
RUN mkdir /var/run/sshd
RUN ssh-keygen -A
RUN yum install -y zsh \
    && git clone https://gitee.com/mirrors/ohmyzsh.git ~/.oh-my-zsh \
    && cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc \
    && sed -i "s/robbyrussell/bira/" ~/.zshrc \
    && usermod --shell /bin/zsh root \
    && echo "export LD_LIBRARY_PATH=/usr/local/lib64:\$LD_LIBRARY_PATH" >> ~/.zshrc

# clone miniob code
RUN mkdir -p ${HOME_DIR}/source
# WORKDIR ${HOME_DIR}/source
# RUN git clone https://${GIT_SOURCE}.com/oceanbase/miniob
# RUN echo "mkdir -p build && cd build && cmake .. -DDEBUG=ON -DCMAKE_C_COMPILER=`which gcc` -DCMAKE_CXX_COMPILER=`which g++` && make -j4" > ${HOME_DIR}/source/miniob/build.sh && chmod +x ${HOME_DIR}/source/miniob/build.sh
# RUN mkdir -p ${HOME_DIR}/source/miniob/build
# WORKDIR ${HOME_DIR}/source/miniob/build
# RUN cmake -B ${HOME_DIR}/source/miniob/build -DDEBUG=ON -DCMAKE_C_COMPILER=`which gcc` -DCMAKE_CXX_COMPILER=`which g++` ${HOME_DIR}/source/miniob/ \
#     && make -j4 \
#     && rm -rf ${HOME_DIR}/source/miniob/build

WORKDIR ${HOME_DIR}

RUN echo -e "#!/bin/bash\n/usr/sbin/sshd -D\ntail -f /dev/null" > ${HOME_DIR}/docker-starter.sh && chmod +x ${HOME_DIR}/docker-starter.sh

ENTRYPOINT ./${HOME_DIR}/docker-starter.sh
# ENTRYPOINT ["/usr/sbin/sshd", "-D", "tail", "-f", "/dev/null"]

将docker-compose.yml改下,图中标红的前部分地址换成自己wsl中项目的根目录地址(pwd命令就可以获得)

version: "3.9"
services:
  miniob:
    build: .
    privileged: true
    ports:
      - "10000:22"
    volumes:
      - /home/huawei-pc/miniob/miniob:/root/source/miniob # host:container
    restart: unless-stopped

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第23张图片
项目根目录下执行。

docker-compose up -d --build

检查下容器有没有起来。图中跑的就是。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第24张图片

2.3.3 基于vscode远程ssh开发

官网下载、安装vscode,https://code.visualstudio.com/docs/?dv=win
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第25张图片

安装remote-ssh插件。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第26张图片
然后进项远程的ssh调试,

Ctrl + Shift + p, 输入 >Remote-SSH:Connect to Host. 回车.

输入:ssh root@localhost -p 10000,如果要选config任意选个就行,我选的第一个

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第27张图片

右下角会弹出下面的框框,选择connect

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第28张图片
linux,不需要解释吧。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第29张图片
continue,回车,输密码回车,密码是 root
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第30张图片
控制台输出了一大堆,总之是好了。

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第31张图片
打开文件夹,/root/source/miniob,回车
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第32张图片
输入密码root,回车,信任。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第33张图片
文件就愉快的导入进来了。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第34张图片

安装如下插件:
C/C++
C/C++ Extension Pack
CMake
CMake Tools

CMake 装完配置一下, 点下方蓝色条子里的 Kit 选 GCC 8.5.0, 然后点旁边的build.
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第35张图片
build成功了。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第36张图片
Ctrl+shift+p,然后输入task,点击第一个选项即可配置。在工程的 .vscode 目录下新建 tasks.json
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第37张图片

create task.json …
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第38张图片
others
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第39张图片
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第40张图片
改下内容。

{
    "options": {
        "cwd": "${workspaceFolder}/build"
    },
    "tasks": [
        {
            "label": "cmake",
            "command": "cmake",
            "args": [
                "-DDEBUG=ON",
                ".."
            ]
        },
        {
            "label": "make",
            "command": "make"
        },
        {
            "label": "CMake Build",
            "dependsOn": [
                "cmake",
                "make"
            ]
        }
    ],
    "version": "2.0.0"
}

注意:

  • options:cmake临时文件的目录
  • args:cmake需要的参数

在工程的 .vscode 目录下新建 launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) for wangzhou",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/bin/observer",
            "args": ["-f", "../../etc/observer.ini"],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "enable pretty printing",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "gdb-set disassembly-flavor intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "CMake Build"
        }
    ]
}
 

注意:

  • program:编译出来的可执行文件
  • args:运行参数
  • preLaunchTask:"label": "CMake Build" 对应

启动miniob的服务端,打开 /src/observer/main.cpp,按F5就能执行了,断点也正常用,下图输出就说明服务端启动成功咯。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第41张图片

还可以看到生成的日志文件。
【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑_第42张图片
再启动客户端。在vscode的底部打开一个新的terminal窗口。

./build/bin/obclient

跑两个玩玩。

miniob > help;
show tables;
desc `table name`;
create table `table name` (`column name` `column type`, ...);
create index `index name` on `table` (`column`);
insert into `table` values(`value1`,`value2`);
update `table` set column=value [where `column`=`value`];
delete from `table` [where `column`=`value`];
select [ * | `columns` ] from `table`;
miniob > show tables;
No table

更多参考下docs文件中的how_to_dev_miniob_by_vscode.md即可。

你可能感兴趣的:(MiniOB,数据库,开源,java,数据库开发,大数据)