前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑

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

作者头像
用户10127530
发布2022-10-26 17:15:20
1.7K0
发布2022-10-26 17:15:20
举报
文章被收录于专栏:半旧的技术栈半旧的技术栈

前 言 🍉 作者简介:半旧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 数据库开发入门难吗

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

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

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

1.1.3 这篇文章教你什么内容

课程分为两部分。入门与进阶。这篇先带大家入门,该专栏后续还有很多文章带大家深入。

在这里插入图片描述
在这里插入图片描述

进阶超级超级硬核的~

在这里插入图片描述
在这里插入图片描述

点击关注不迷路。

1.2 数据库的那些事儿

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.2 数据库要解决什么问题

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

在这里插入图片描述
在这里插入图片描述

1.2.3 早期的数据库系统

在这里插入图片描述
在这里插入图片描述

淘汰原因:描述的世界,结构太死板,不灵活。不够简单,无法提供抽象简单数据库语言,根本原因!

1.2.4 现代主流数据库系统

关系型数据库

在这里插入图片描述
在这里插入图片描述

关系间可以相互转化,不会丢失语义。 逻辑层关系代数,物理层用关系存储清晰。

NoSQL 解决存储容量不能线性扩展的痛点:提出分布式支持数据库无限线性 底层数据模型:K-V,不需要预定义结构

在这里插入图片描述
在这里插入图片描述

1.2.5 数据库简史

数据库是图灵奖最多的领域,膜拜数据库之神

在这里插入图片描述
在这里插入图片描述

数据库简史

在这里插入图片描述
在这里插入图片描述

MongoDB:在文档上解决特别好

OceanBase:NewSql + HTAP

Amazon Aurora:云上数据库系统

1.2.6 数据库架构

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

B+树,平衡二叉树,读写性能均衡算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

2.1 MiniOB介绍

2.1.1 数据库系统学习的难点

在这里插入图片描述
在这里插入图片描述

2.1.2 MiniOB架构

在这里插入图片描述
在这里插入图片描述

2.2 MiniOB的开发调试环境搭建

2.2.1 docker安装部署

在这里插入图片描述
在这里插入图片描述

顺带一提,本教程相关的材料方法都可以从这里获取:https://github.com/oceanbase/miniob,

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

在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

会提示下载linux子系统,这样性能更加出色,否则会使用虚拟机方式,参考官方链接配置即可。

在这里插入图片描述
在这里插入图片描述

到这里docker就装好了

2.2.2 源码部署与配置

在wsl中把代码clone下来。

代码语言:javascript
复制
 sudo git clone https://github.com/oceanbase/miniob.git --depth 1

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

代码语言:javascript
复制
# 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命令就可以获得)

代码语言:javascript
复制
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
在这里插入图片描述
在这里插入图片描述

项目根目录下执行。

代码语言:javascript
复制
docker-compose up -d --build

检查下容器有没有起来。图中跑的就是。

在这里插入图片描述
在这里插入图片描述

2.3.3 基于vscode远程ssh开发

官网下载、安装vscode,https://code.visualstudio.com/docs/?dv=win

在这里插入图片描述
在这里插入图片描述

安装remote-ssh插件。

在这里插入图片描述
在这里插入图片描述

然后进项远程的ssh调试,

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

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

linux,不需要解释吧。

请添加图片描述
请添加图片描述

continue,回车,输密码回车,密码是 root

在这里插入图片描述
在这里插入图片描述

控制台输出了一大堆,总之是好了。

在这里插入图片描述
在这里插入图片描述

打开文件夹,/root/source/miniob,回车

在这里插入图片描述
在这里插入图片描述

输入密码root,回车,信任。

在这里插入图片描述
在这里插入图片描述

文件就愉快的导入进来了。

在这里插入图片描述
在这里插入图片描述

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

CMake 装完配置一下, 点下方蓝色条子里的 Kit 选 GCC 8.5.0, 然后点旁边的build.

在这里插入图片描述
在这里插入图片描述

build成功了。

在这里插入图片描述
在这里插入图片描述

Ctrl+shift+p,然后输入task,点击第一个选项即可配置。在工程的 .vscode 目录下新建 tasks.json

在这里插入图片描述
在这里插入图片描述

create task.json …

在这里插入图片描述
在这里插入图片描述

others

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

改下内容。

代码语言:javascript
复制
{
    "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

代码语言:javascript
复制
{
    "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就能执行了,断点也正常用,下图输出就说明服务端启动成功咯。

在这里插入图片描述
在这里插入图片描述

还可以看到生成的日志文件。

在这里插入图片描述
在这里插入图片描述

再启动客户端。在vscode的底部打开一个新的terminal窗口。

代码语言:javascript
复制
./build/bin/obclient

跑两个玩玩。

代码语言:javascript
复制
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即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 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开发
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档