引言
因为 Oceanbase 代码规模较大,并且需要 Linux 环境,所以通常需要在大规格开发机上进行远程开发,对普通个人开发者有一定门槛。本文分享一种利用 Docker 在 M1 芯片 MacBook Pro 笔记本电脑上搭建 observer 本地开发环境的方法,原则上该方法也适用于其他 Mac 电脑和 Windows 电脑,仅需支持 Docker 即可,欢迎各位开发者尝试并反馈意见。
Step by Step 搭建开发环境
首先我们先一步一步来搭建开发环境,之后根据操作步骤编写 Dockerfile 并构建镜像,再使用 vscode 连接容器进行开发。
克隆代码
首先建立文件夹并从 GitHub 拉取代码,存储位置可以按需选择
mkdir -p ~/ob_ce_dev
cd ~/ob_ce_dev
git clone https://github.com/oceanbase/oceanbase.git
安装 Docker
在 Docker 官网下载并安装 Docker Desktop: https://www.docker.com/products/docker-desktop/
我所使用的 Docker Desktop 版本是 4.16.2
调整 Docker 资源限制
因为编译和运行 observer 都比较吃资源,需要在 Docker Desktop 设置中将资源限制提升到至少 4 CPU、8G 内存。在我的实际使用中,CPU 并不是瓶颈,内存才是,因此在条件允许的情况下尽量增大内存。
拉取操作系统镜像
在这里选用经典的 CentOS 7 作为基础镜像,启动 Docker Desktop 后,在命令行输入 docker pull centos:centos7
拉取镜像。
启动容器
使用命令 docker run -id -v ~/ob_ce_dev/oceanbase:/oceanbase -p 2222:22 --name ob_dev centos:centos7
启动我们的开发容器,-v
选项将克隆的 observer 代码挂载到容器的/oceanbase
目录,-p
将容器的22端口映射到本机的2222端口,方便使用 vscode 连接。
安装依赖
安装 observer 的编译依赖和 openssh
# 进入容器
docker exec -it ob_dev /bin/bash
# 编译依赖
yum install -y git wget rpm* cpio make glibc-devel glibc-headers binutils m4
# obd.sh 依赖
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum install -y libtool libaio obclient
# openssh
yum install -y openssh-*
ssh-keygen -A
# run sshd
/sbin/sshd
# 设置 root 密码
echo "my_password" | passwd root --stdin
使用 vscode 连接开发容器
在 vscode 中 安装 Remote - SSH 插件后,点击左下角><
图标,选择 Connect to Host...
, Add New SSH Host...
, 输入ssh root@localhost:2222
,按回车保存。之后再点击左下角><
图标,选择 Connect to Host...
,此时选择刚才添加的 localhost 选项,输入 root 密码(本文中使用的是 my_password,可以根据实际情况更改),vscode 会自动打开新的窗口,在新的窗口就可以在容器内进行开发。
左下角为该图标即表示已经成功连接到容器。按 cmd + o
并输入/oceanbase
在 vscode 中打开代码目录,可以看到如下内容:
这样就可以使用 vscode 进行开发。可以根据自己的开发习惯配置 vscode 进行开发,由于每个人习惯不同,本文不再赘述。
编译 observer
在已经连接到开发容器的 vscode 中打开终端,输入./build.sh debug --init
以 debug 模式初始化编译目录,之后cd build_debug
进入编译目录。
一般 Docker 分配到的内存有限,直接运行 make -j
会因为内存不足被 Kill,因此编译时建议多尝试几次并发数,直到编译可以正常进行。本人在编译时记录到的内存使用峰值为约 5.5G,因此编译并发数建议设置为内存/5或内存/6,例如 Docker 分配到 16G 内存时可以考虑 make -j 3
或 make -j 2
,如果没有问题再尝试增大并发数,需要多尝试几次确定。如果只分配 8G 内存,只能使用 make
串行编译,在 M1 Pro 芯片上一边看剧一边编译大致需要 50 分钟(别问我是怎么知道的)。
本地部署 observer 进行测试
编译成功之后cd /oceanbase/tools/deploy
进入部署工具目录,首先使用./obd.sh prepare
拷贝编译好的二进制文件并生成默认配置。再使用./obd.sh deploy -c single.yaml
进行单机部署。部署成功后使用./obd.sh sys
连接到数据库进行操作。这部分内容还可以参考 Deploy_CN · oceanbase/oceanbase Wiki · GitHub
整合成 Dockerfile
如果上述过程都没有问题,为了避免每次 Docker 重启后环境丢失,我们可以打包好 Docker 镜像以供后续使用。如果只想保存当前容器,可以使用docker commit ob_dev
打包当前容器镜像。也可以编写 Dockerfile 供二次使用。这里提供一个简单的 Dockerfile 版本。该版本仅供本地开发测试使用,建议使用环境变量ROOT_PASS
配置复杂密码(默认为my_password)。推荐修改 Dockerfile 配置无密码登陆更加方便,方法可以参考其他资料,在此不再赘述。
FROM centos:centos7
RUN yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
RUN yum install -y git wget rpm* cpio make glibc-devel glibc-headers binutils m4 libtool libaio obclient openssh-*
RUN ssh-keygen -A
RUN echo "${ROOT_PASS:-my_password}" | passwd root --stdin
# for sshd
EXPOSE 22
# for observer
EXPOSE 10000 10001
CMD ["/sbin/sshd", "-D"]
保存为 Dockerfile 后使用 docker build . -t ob_dev
构建名为 ob_dev 的镜像。
启动容器
如果有之前的容器需要先使用docker stop ob_dev
停止。之后使用docker run -d -v ~/ob_ce_dev/oceanbase:/oceanbase -p 2222:22 -p 10000:10000 --name ob_dev ob_dev
启动开发容器。之后再使用 vscode 连接。如果连接失败可能是因为更换容器导致 host 指纹更改,使用rm ~/.ssh/known_hosts
重置已知指纹后重试即可。
之后每次重启 Docker 服务或宿主机,只需要重新运行容器即可。
总结
本文提供了一种利用 Docker 在 M1 芯片 Mac 上搭建 Oceanbase 开发环境的方法,理论上该方法也适用于其他支持 Docker 的系统,包含 macOS 和 Windows,如果出现问题可以回贴交流。该方法需要为 Docker 至少分配 4 CPU 和 8G 内存,分配的内存越多在编译时可以容许更大的并发度。
现在搭建好开发环境后就可以修改 observer 源码进行开发了,得益于 unity 编译和增量编译,再次编译的速度会大幅提升。
Happy Hacking!