Skip to content

OB编译部署过程及遇到的问题

watch2bear edited this page Mar 18, 2024 · 34 revisions

第一步:构建docker容器

  • 创建容器 docker run -itd --name basic -d centos:7 --privileged=true
  • 进入容器 docker exec -it base /bin/bash
  • 安装常用工具 net-tools, vim, openssh-server, iproute, zip, unzip
  • 安装编译工具 git wget rpm* cpio make glibc-devel glibc-headers binutils m4
  • 下载gcc yum install -y gcc gcc-c++ make automake
  • 下载cmake yum install cmake
  • 下载OB 开发依赖

on centos 7

yum install git wget rpm* cpio make glibc-devel glibc-headers binutils m4 libaio-devel.x86_64

on ubuntu 20.04

sudo apt-get install git wget rpm rpm2cpio cpio make build-essential binutils m4 libtinfo5 libaio1

第二步:编译python

  • 下载python3.11源码并传输到容器内 wget https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz
  • 解压 tar -zxvf Python-3.11.4.tgz
  • 切换目录cd Python-3.11.4
  • 配置编译选项
./configure --prefix=/usr/local/python311 --enable-shared --enable-optimizations

指定安装路径 --enable-shared 创建动态链接库(必须有)--enable-optimizations(可选,加速运行及构建速度)

不能使用 --with-openssl编译选项,会造成OB内存释放异常,因此安装外部库(numpy, sklearn等)需要手动下载.whl文件,再通过pip进行本地安装。

  • 编译 make -j
  • 安装 make install
  • 创建软链接 ln -s /usr/local/python311/bin/python3 /usr/bin/python3 ln -s /usr/local/python311/bin/pip3 /usr/bin/pip3
  • 更改动态链接库的搜索路径 vim /etc/ld.so.conf,添加 /usr/local/python311/lib
  • 安装numpy库 python3 -m pip install numpy

第三步:部署ob

参考文档:OceanBase官方文档

  • 下载all-in-one安装包(出于兼容性,建议v4.1.0_CE_BP2版本),传输到容器中
  • 解压并安装
    tar -xzf oceanbase-all-in-one-*.tar.gz
    cd oceanbase-all-in-one/bin/
    ./install.sh
    source ~/.oceanbase-all-in-one/bin/env.sh
  • 部署 oceanbase 数据库
    obd cluster deploy obtest -c new.yaml
    -c参数选择合适的配置文件(所有配置文件在~/.oceanbase-all-in-one/conf目录下) 这里创建了一个新的适合环境的配置文件 new.yaml
  • 启动 oceanbase 数据库 obd cluster start obtest
  • 查看 OBD 管理的集群列表 obd cluster list
  • 查看 obtest 集群状态 obd cluster display obtest
  • 连接 oceanbase 数据库
    obclient -h<IP> -P<PORT> -uroot@sys -p (这条命令会在启动数据库后提供)
    进入sql命令行,则连接成功
  • 停止运行中的集群obd cluster stop obtest

第四步:编译ob源码

  • 下载oceanbase4.1源代码并传输到容器中,解压(这里使用git clone时要添加 --recursive 参数,以便将所有依赖的submodule都拉下来)
  • 编译bash build.sh debug --init --make -j N (注:-j N中N为编译过程中启用的线程数,应cpu核数较多时应加以限制,否则可能因内存不足导致编译失败)
  • 进入生成的debug构建目录cd build_debug
  • 进行构建make -j observer
  • 查看构建产物stat src/observer/observer
  • 替换observer(替换前最好先备份原版的observer)

cp ${ob source dir}/build_debug/src/observer/observer /root/.obd/repository/oceanbase-ce/${version}/${sequence}/bin/observer

  • 重新启动oceanbase数据库obd cluster start obtest
  • 连接数据库obclient -h<IP> -P<PORT> -uroot@sys -p
  • (注:可以将ob devtools目录下的开发工具加入环境变量中,可供centos7等低版本的linux系统使用,节省配置环境的时间) export PATH=$PATH:/ob/oceanbase_PyUdf-OB4.1_PyUdf/deps/3rd/usr/local/oceanbase/devtools/bin
  • (注:目前在OB目录下的replaceOb.sh脚本可以自动化运行第四步,命令为./replaceOb.sh {debug/release} 。替换observer的位置可以在脚本内进行修改。)
  • (注:在首次部署并替换OceanBase后,推理查询所需系统表_all_python_udf尚不存在,因此需要destroy并重新deploy原有cluster。)

第五步:准备VScode开发环境

参考文档:VScode远程连接docker容器

  • 提交镜像docker commit basic ob:basic_v0.1
  • 保存镜像docker save ob:basic_v0.1 -o basic_v0.1.tar.gz
  • 导入镜像docker load -i basic_v0.1.tar.gz
  • 启动进行端口映射的容器
    docker run -d -p 3022:22 --name ob4.1 -m 64G --privileged=true ob:basic_v0.1 /sbin/init "while true;do echo hello world;sleep 10;done"
    对外暴露的端口为3022
  • 进入容器docker exec -it ob4.1 /bin/bash
  • 修改配置文件vim /etc/ssh/sshd_config
    添加一行 PermitRootLogin yes
  • 设置root密码 passwd
  • 重启ssh服务 service sshd restart / systemctl restart sshd
  • 查看ssh服务状态 service sshd status
  • 在VScode中安装拓展程序Remote-SSH,修改config文件,连接docker

可能遇到的问题

  1. python编译时openssl模块失败->numpy库下载失败 (暂时不可用,需要手动下载numpy包) 1690894000263-2fbdd4ba-0f04-4b85-b988-d4d3c52ab265 解决方案:可能需要手动下载并编译更新版本的openssl,可参考 https://www.cnblogs.com/lemon-le/p/13419429.html
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz --no-check-certificate  
tar -zxvf openssl-1.1.1g.tar.gz  
cd openssl-1.1.1g/  
./config --prefix=/usr/local/openssl  
make  
make install  
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl  
ln -s /usr/local/openssl/include/openssl /usr/include/openssl  
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf  
ldconfig

注:目前版本不能使用 --with-openssl编译选项,会造成OB内存释放异常,因此安装外部库(numpy, sklearn等)需要手动下载.whl文件,再通过pip进行本地安装。

  1. 更换observer后启动obtest实例失败&python3 pip install numpy失败
    参考文档:error while loading shared libraries: libpython3.7m.so.1.0: cannot open shared object file 1690894089046-6b51476b-9aea-414c-951b-df0c1c44f2cd 原因:编译安装完成后,没有将python311/lib下的文件放入默认库/usr/lib或/lib中,导致初始化时无法加载库文件。
    解决方案:
    添加库的配置信息,将python/lib的绝对路径(/usr/local/python311/lib),添加至conf文件中。
    切换至/etc/ld.so.conf.d目录下,打开python3.conf文件:
    cd /etc/ld.so.conf.d
    vim python3.conf
    进入vim,将/usr/local/python311/lib作为一行插入,保存退出。
    运行ldconfig命令:ldconfig

  2. 编译python源码时导入site module失败
    参考文档:https://github.com/python/cpython/issues/94825 image 原因:gcc version过低(4.8.5)
    解决方案:升级gcc到8+

yum install centos-release-scl -y
yum install devtoolset-9-gcc* -y
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >> ~/.bash_profile
source /opt/rh/devtoolset-9/enable
  1. 编译python源码时显示zlib ffi.h不可用

image 解决方案:安装libffi-devel zlib-devel

yum install -y libffi-devel zlib-devel

  1. 在debian/ubuntu环境下编译部署OceanBase后,使用obclient键入命令时backspace异常问题

closed issue: https://github.com/oceanbase/oceanbase/issues/1787

解决方案:参考 https://zhuanlan.zhihu.com/p/678874871 ,重新编译并替换原有obclient