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

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

2.2 MiniOB的开发调试环境搭建

2.2.1 docker安装部署

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

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


image.png

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


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

f507042fab4f4c89b0d2d449bde92f64.png

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

7f121b85e5634dee8df48796f763eff7.png

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

到这里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


a0bc4ed35b4641ea9ec1417c5d512fd2.png

项目根目录下执行。

docker-compose up -d --build

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

88289d2b6fd34c508b85d701a55894d4.png

2.3.3 基于vscode远程ssh开发

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


d2999742e18049d1816b54be15ff4f56.png


安装remote-ssh插件。


1a681b2bf5104670b76260e8aefd3476.png

然后进项远程的ssh调试,

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

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

8a37f86c788f4bfcae728b91d2c4b22f.jpg

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

19112cd8e87942699646a6ba648fdd30.png

linux,不需要解释吧。

6a0da63c825c49d2a3e11fa3786592f7.png

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

e7af00b3baf54ed0aed08b6b9d5edd22.png

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


2e5a35408fe5476bb137c1029f4970f2.png

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

8b00915217c54d45adf7ec4d1407604d.png

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

cc82032a4af74536823824b039a0d2d3.png

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

c09d8d82bd5941caa7df43443031c1b0.png

安装如下插件:

C/C++

C/C++ Extension Pack

CMake

CMake Tools

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

07c97999026f4a6f924c6867335f09e0.png

build成功了。

7fcb108e4d0f40d9a3ba33470fabab51.png

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

9b3a3dcfc19f4c51ab7af7442dc919a4.png

create task.json …

cc238e62fcff4af8a83a4d54ab127960.png


others

60e574c6f55947a4a3e160cdf8e86bc2.png

3f85a52439ce41458234f6cb85f6b034.png

改下内容。

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

89f497e56eb6463eb0aff4dd29a82330.png

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

image.png

再启动客户端。在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即可。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
18天前
|
关系型数据库 Apache 流计算
手把手教你实现 OceanBase 数据到阿里云数据库 SelectDB 内核版 Apache Doris 的便捷迁移|实用指南
本文介绍了如何将数据从 OceanBase 迁移到阿里云数据库 SelectDB 内核版 Apache Doris。提供 3 种数据同步方法 1. 使用 DataX,下载 DataX 并编写配置文件,通过 OceanBaseReader 和 DorisWriter 进行数据迁移。 2. 利用 Apache Doris 的 Catalog功 能,将 OceanBase 表映射到 Doris 并插入数据。 3. 通过Flink CDC,设置 OceanBase 环境,配置 Flink 连接器,实现实时数据同步。
手把手教你实现 OceanBase 数据到阿里云数据库 SelectDB 内核版 Apache Doris 的便捷迁移|实用指南
|
17小时前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(五)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
|
17小时前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(三)
本篇文章重点在于SQL中的各种删除操作
|
3天前
|
关系型数据库 分布式数据库 数据库
|
5天前
|
存储 监控 Apache
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
网易的灵犀办公和云信利用 Apache Doris 改进了大规模日志和时序数据处理,取代了 Elasticsearch 和 InfluxDB。Doris 实现了更低的服务器资源消耗和更高的查询性能,相比 Elasticsearch,查询速度提升至少 11 倍,存储资源节省达 70%。Doris 的列式存储、高压缩比和倒排索引等功能,优化了日志和时序数据的存储与分析,降低了存储成本并提高了查询效率。在灵犀办公和云信的实际应用中,Doris 显示出显著的性能优势,成功应对了数据增长带来的挑战。
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
|
5天前
|
存储 NoSQL 关系型数据库
MongoDB非关系型数据库实战
【5月更文挑战第6天】MongoDB,流行的NoSQL数据库,以其灵活的数据模型和高性能备受青睐。本文介绍了MongoDB的基础,包括文档型数据库特性、安装配置、数据操作。通过电商订单管理的实战案例,展示了MongoDB在处理复杂数据结构和大规模数据时的优势,适用于电商、游戏、视频直播等场景。MongoDB的索引、全文搜索和地理空间功能进一步增强了其实用性。注意性能优化和扩展性以确保系统稳定性和可靠性。
|
10天前
|
缓存 关系型数据库 MySQL
MySQL数据库性能优化实战
【4月更文挑战第30天】本文探讨了MySQL性能优化实战技巧,包括硬件与配置优化(如使用SSD、增加内存和调整配置参数)、索引优化(创建合适索引、使用复合索引及定期维护)、查询优化(避免全表扫描、减少JOIN和使用LIMIT)、分区与分片(表分区和数据库分片),以及使用缓存、定期清理数据库和监控诊断。通过这些方法,可以提升数据库性能和响应速度。
|
11天前
|
存储 SQL Apache
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
|
13天前
|
存储 关系型数据库 MySQL
MySQL数据库实战:从入门到精通
本文介绍了MySQL的使用和优化,适合Web开发者阅读。首先,确保安装并配置好MySQL,熟悉SQL基础。接着,通过命令行客户端连接数据库,执行创建、查询、添加、修改和删除数据等操作。学习数据类型并创建表存储数据。最后,探讨了数据库优化,包括查询优化和索引使用,以提升性能。
24 2
|
17天前
|
SQL 人工智能 JSON
【AI大模型应用开发】2.2 Function Calling连接外部世界 - 【实战】查询数据库
【AI大模型应用开发】2.2 Function Calling连接外部世界 - 【实战】查询数据库
20 0