前 言
作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端、数据库内核及生态开发
☕专栏简介:相当硬核,讲解数据库内核开发的理论、实战,带你深入解读数据库源码,剖析内核原理,实战手撸数据库内核
文章简介:一篇文章快速上手数据库内核开发,从0到1部署开源数据库(MinoOB),引爆你的数据库学习热情,挑战数据库领域最强大脑,成为开源社区的contributor
文章对应视频教程:https://open.oceanbase.com/activities/4921877?id=4921929
github仓库:https://github.com/oceanbase/miniob
不难。可以从简单的MiniOB的开始,
MiniOB只有几万行,
SQLLite只有二十多万行源码,
还有大神早就写了经典教材
《数据库系统实践》
《数据库系统概念》
而且你们还有我帮你们踩坑。
课程分为两部分。入门与进阶。这篇先带大家入门,该专栏后续还有很多文章带大家深入。
进阶超级超级硬核的~
点击关注不迷路。
最大的问题归根结是没有进行抽象。
淘汰原因:描述的世界,结构太死板,不灵活。不够简单,无法提供抽象简单数据库语言,根本原因!
关系型数据库
关系间可以相互转化,不会丢失语义。
逻辑层关系代数,物理层用关系存储清晰。
NoSQL
解决存储容量不能线性扩展的痛点:提出分布式支持数据库无限线性
底层数据模型:K-V,不需要预定义结构
数据库是图灵奖最多的领域,膜拜数据库之神
数据库简史
MongoDB:在文档上解决特别好
OceanBase:NewSql + HTAP
Amazon Aurora:云上数据库系统
parser:词法分析、语法分析(生成语法树)。
Query result cache:直接对SQL进行硬解析。
resolver:对部分变量进行替换,生成语法树。
plan chache:命中plan chache成功则将其丢到物理执行器Executor中,否则扔到优化器里去
Transformer:进行逻辑优化,比如索引下推。
Optimizer:进行代价优化,从众多物理执行计划选出最优。工业中与transformer进行混杂,选择相对优的执行计划(为了节约时间、不一定会选最优)。
code generator:将多个算子merge,生成更加高效的算子。
日志恢复分为物理日志和逻辑日志。
顺带一提,本教程相关的材料方法都可以从这里获取:https://github.com/oceanbase/miniob,
本部分获得了大佬:徐文昊的碎碎念 的鼎立相助,https://www.xuwh.top,欢迎关注。
环境搭建有多种方式,可以参考源码中的docs文件,我个人经过踩坑,采用了下面这个方式,docker+vscode开发调试环境。docker官方建议在Ubuntu环境安装。这里我们在windows的wsl子系统使用docker搭建开发调试环境
看看自己电脑有没有开启虚拟化,没有的话自行百度解决。
https://hub.docker.com/,下一个docker
会提示下载linux子系统,这样性能更加出色,否则会使用虚拟机方式,参考官方链接配置即可。
到这里docker就装好了
在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
docker-compose up -d --build
官网下载、安装vscode,https://code.visualstudio.com/docs/?dv=win
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
改下内容。
{
"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"
}
注意:
在工程的 .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"
}
]
}
注意:
"label": "CMake Build"
对应启动miniob的服务端,打开 /src/observer/main.cpp,按F5就能执行了,断点也正常用,下图输出就说明服务端启动成功咯。
还可以看到生成的日志文件。
再启动客户端。在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即可。