在openGauss数据库源码解析系列文章——openGauss开发快速入门(中),介绍了openGauss基本使用,本篇将从openGauss的开发和编译、参与openGauss社区开源项目两方面展开具体介绍。
三、 开发和编译
作为openGauss数据库开发者,在基于openGauss开源产品进行二次开发后,往往需要编译openGauss对所开发的功能的实现情况进行验证。本篇向读者简要介绍openGauss的编译方法,详细的内容参见openGauss官网(https://opengauss.org/zh/docs/1.1.0/docs/Compilationguide/Compilation.html)。
(一) 搭建开发环境
搭建开发环境之前需要在码云(https://gitee.com/)上完成注册Gitee账号、签署CLA协议(贡献者许可协议),详情请参见2.4.2社区环境准备。
1. 在社区拉取个人分支
(1) 进入docs(文档)或者openGauss-server(代码)仓库。此处以docs仓库举例。如图1所示。
|图1 docs仓库|
(2) 单击右上角“Forked”按钮,Fork(复刻)个人分支。如图2所示。 |图2 Fork个人分支|
2. 安装并配置Git环境
(1) 安装Git环境。
下载Git客户端并按默认设置安装,Git下载地址:https://git-scm.com/download/win,根据操作系统位数(32位/64位),下载安装相应的Git(命令行工具),也可以下载TortoiseGit(可视化工具)。
(2) 配置Git环境。
① 全局配置Git用户名。
git config --global user.name "Your Name"
"Your Name"为Gitee账号名称。您可以在Gitee个人主页获取。
② 全局配置Git邮箱。
git config --global user.email "email@example.com"
邮箱为注册的Gitee的主邮箱,可通过Gitee个人设置中的“多邮箱管理”获取。
③ 生成ssh密钥。
ssh-keygen -t rsa -C "email@example.com"
cat ~/.ssh/id_rsa.pub
登录远程仓库网站Gitee账户https://gitee.com/profile/sshkeys并添加生成的公钥。
④ 在本地创建openGauss-server文件夹,将远程仓库克隆至本地。
cd openGauss-server
git clone https://gitee.com/Your Name/openGauss-server.git
Your Name为全局配置的Git用户名。
⑤ 设置本地工作目录的upstream源。
git remote add upstream https://gitee.com/opengauss/ openGauss-server.git
⑥ 设置同步方式。
git remote set-url --push upstream no_push
3. 安装开发工具
openGauss内核开发以C/C++语言为主,本节以安装VScode(visual studio code)工具为例进行介绍。
(1)登录https://code.visualstudio.com/download下载VScode软件。如图3所示。请根据操作系统选择相应的版本,本节以64位Windows操作系统为例。
|图3 VScode下载页面|
(2)单击完成下载的软件执行安装,选择“我同意此协议”后单击“下一步”,如图4所示。
|图4 安装初始页面| (3)确认安装位置后单击“下一步”,如图5所示。
|图5 确认安装位置| (4)配置环境变量。
选中“添加到PATH(重启后生效)”复选框,勾选此选项后可不再配置环境变量直接使用,如图6所示。
|图6 配置环境变量|
(5) 单击“完成”,结束安装,如图7所示。 |图7 安装完成|
(6) 安装openGauss所需的开发语言,如图8所示。
|图8 安装C/C++开发语言|
4. 提交代码
修改完openGauss代码后需要将修改后的代码提交至开源社区,本节介绍如何提交代码。 (1) 将所有修改的文件添加到Git的缓存区。
git add .
(2) 提交缓存区到自己的远端仓库。
git commit -m "message"
(3) 提交修改至自己的远端仓库。
git push origin master
5. 提交合并需求
通过新建Pull Request提交合并需求至openGauss社区。社区上详细操作请参见“2.4.4 贡献代码和文档”。
(二) 搭建编译环境
本篇介绍openGauss的编译环境要求。
1. 操作系统环境要求
X86架构:
(1)CentOS 7.6。
(2)openEuler 20.3LTS。
ARM架构:
(1)openEuler 20.3LTS。
(2)麒麟V10。
2. 软件依赖要求
openGauss的软件依赖要求如表1所示。
依赖软件建议使用“1. 操作系统环境要求”中操作系统安装光盘或者源中的默认安装包。如果不存在默认安装包时,请参见表1查看软件对应的建议版本。
表1 软件依赖要求 |所需软件 | 建议版本 | |--|--| |libaio-devel | 建议版本:0.3.109-13 | | flex | 要求版本:2.5.31 以上 | | bison | 建议版本:2.7-4 | | ncurses-devel | 建议版本:5.9-13.20130511 | | glibc-devel | 建议版本:2.17-111 | |patch | 建议版本:2.7.1-10 | |lsb_release | 建议版本:4.1 | | readline-devel | 建议版本:7.0-13 |
(三) 版本编译
openGauss的编译过程和生成安装包的过程已经写成了一键式脚本build.sh,可以方便地通过build.sh脚本进行编译操作。也可以自行配置环境变量,通过命令进行编译。本节介绍openGauss编译需要满足的前提条件,编译的操作步骤等,编译流程如图9所示。
|图9 编译流程图|
1. 编译前准备
1) 代码下载
本文以CentOS 7.6环境为例进行介绍。代码下载需要在本地安装并配置git。
(1) 执行如下命令下载代码和开源第三方软件仓库等。
[user@linux sda]$ git clone [git ssh address] openGauss-server
[user@linux sda]$ git clone [git ssh address] openGauss-third_party
[user@linux sda]$ # mkdir binarylibs
上述命令中:
① [git ssh address]表示实际代码下载地址,可在openGauss社区获取这些地址。
② openGauss-server:openGauss的代码仓库。
③ openGauss-third_party:openGauss依赖的开源第三方软件仓库。
④ binarylibs:存放编译构建好的开源第三方软件的文件夹,用户可通过开源软件编译构建获取。由于开源软件编译构建耗时长,建议使用openGauss-third_party参数编译构建出了一份binarylibs(二进制库)并压缩上传到了网上,用户可以直接下载获取。下载地址是“https://opengauss.obs.cn-south-1.myhuaweicloud.com/2.0.0/openGauss-third_party_binarylibs.tar.gz”,下载完毕后请解压,重命名文件夹为“binarylibs”。
(2)下载项进度均显示为100%时表示下载成功。
2) 开源软件编译构建
openGauss的编译需要提前把所依赖的开源第三方软件进行编译和构建。这些开源第三方软件存放在代码openGauss-third_party代码仓中,用户下载完毕之后应使用git lfs pull命令获取代码仓中的大文件,并且用户通常只需要构建一次。若存在开源软件版本更新,则需要重新构建。
由于此步骤耗时较长,使用openGauss-third_party编译构建出了一份binarylibs,用户可以直接下载获取。
开源三方件编译前置软件要求如表2所示。
表2 openGauss开源三方件编译前置软件要求 | 所需软件 | 建议版本| |--|--| | python3 | 建议版本:3.6| | python3-dev |建议版本:3 | |setuptools | 建议版本:36.6.1 | |libaio-devel | 建议版本:0.3.109-13 | |flex | 要求版本:2.5.31 以上 | |ncurses-devel | 建议版本:5.9-13.20130511 | | lsb_release |建议版本:4.1 | | pam-devl | 建议版本:1.1.8-1.3.1 | |ncurses-devel | 建议版本:5.9-13.20130511 | | libffi-dev | 建议版本:3.1 | | patch | 建议版本:2.7.1-10 | | golang | 建议版本:1.13.3及以上 | |autoconf |建议版本:2.69 | | automake | 建议版本:1.13.4 | |byacc |建议版本:1.9 | |cmake | 建议版本:3.19.2 | |diffutils | 建议版本:3.7 | | openssl-devel | 建议版本:1.1.1 | | libtool |建议版本:2.4.2及以上 | | libtool-devel | 建议版本:2.4.2及以上 |
在开始编译第三方库之前,请自行准备好gcc7.3。建议用已发布的编译好的第三方库中gcc,并配置好环境变量。
在安装完表2开源软件编译前置要求中的软件后,请将python默认版本指向python3.x并执行如下操作。
(1) 执行如下命令进入内核依赖的开源第三方软件目录,进行开源第三方软件的编译和构建,产生相应的二进制程序或库文件。“/sda/openGauss-third_party”为开源第三方软件下载目录。
[user@linux sda]$ cd /sda/openGauss-third_party/build
[user@linux build]$ sh build_all.sh
(2) 用户执行以上命令之后,可以自动生成数据库编译所需的开源第三方软件,如果想单独的生成某个开源三方软件,可以进入对应的目录,执行build.sh脚本,如下所示即可编译生成openssl。
[user@linux sda]$ cd /sda/openGauss-third_party/dependency/openssl
[user@linux openssl]$ sh build.sh
(3) 执行上述脚本,最终编译构建出的结果会存放在openGauss-third_party同级的binarylibs目录。这些文件会在后面编译openGauss-server时使用到。
3) 编译脚本build.sh介绍
“openGauss-server/build.sh”是编译过程中的重要脚本工具。其集成了软件安装编译、产品安装包编译两种功能,可快速进行代码编译和打包。
详细参数选项如表3所示。
表3 build.sh功能选项介绍 |功能选项 |缺省值 | 参数 | 说明 |
|--|--| --| --| |-h | 不使用此选项 | - | 帮助菜单 |
| -m | release | [debug release memcheck] | 选择编译目标版本。有三个目标版本可以选择:release:生成release版本的二进制程序。此版本编译时,通过配置GCC(GNU compiler collection,GNU编译器集)高级优化选项,去除内核调试代码。此选项通常在生产环境或性能测试环境中使用、debug:表示生成debug版本的二进制程序。此版本编译时,增加了内核代码调试功能,一般用于开发自测环境、memcheck:表示生成memcheck版本的二进制程序。此版本编译时,在debug版本的基础上增加了ASAN功能,用于定位内存问题 |
|-3rd | ${代码路径}/binarylibs |[binarylibs path] | 指定binarylibs的路径,需绝对路径。默认设置为当前代码文件夹下存在binarylibs,因此如果binarylibs被移至openGauss-server中,或者在openGauss-server中创建了到binarylibs的软链接,则不需要指定此参数 |
|-pkg |不使用此功能 | - | 将代码编译结果压缩封装成安装包 |
-nopt |不使用此功能 | - | 如果使用此功能,则对鲲鹏平台的相关CPU不进行优化 |
该脚本中的每个选项都有一个默认值。选项数量少,依赖简单。因此,该脚本易于使用。如果实际需要的参数值与默认值不同,请根据实际情况配置。
- 软件安装编译
软件安装编译即将代码编译生成软件,并将软件安装到机器上。openGauss提供一键式编译脚本build.sh进行操作,也可以自己配置环境变量手动操作。两种方式将在本章节的一键式脚本操作步骤、手动编译操作步骤中进行讲解。
1) 前提条件
(1)已按照搭建编译环境的要求准备好相关软硬件,并且已经下载了代码。
(2)已完成开源软件编译构建,并将gcc7.3按已发布的编译好的第三方库目录结构放置在output目录中。
(3)了解 build.sh脚本的参数选项和功能。
(4)代码环境干净,没有以前编译生成的文件。
2)产品安装包编译
安装包编译即将代码编译生成软件安装包,安装包的编译打包过程集成在build.sh之中。
(1)执行如下命令进入到软件代码编译脚本目录。
[user@linux sda]$ cd /sda/openGauss-server
(2)执行如下命令,编译安装openGauss。
[user@linux openGauss-server]$ sh build.sh -m [debug | release | memcheck] -3rd [binarylibs path] –pkg
(3) 显示如下内容,表示安装包编译成功。
success!
生成的安装包存放在“./output”目录下,编译日志为“./build/script/makemppdb_pkg.log”,安装包打包日志为“./build/script/make_package.log”。
3) 手动编译
(1)执行如下命令进入到软件代码编译脚本目录。
[user@linux sda]$ cd /sda/openGauss-server
(2)执行脚本获取当前操作系统版本。
[user@linux openGauss-server]$ sh src/get_PlatForm_str.sh
如果结果显示为Failed或者其他版本,表示openGauss不支持当前操作系统。
(3)配置环境变量,根据自己的代码下载位置补充两处"____",将步骤2获取到的结果替换下面的***。
export CODE_BASE=________ # openGauss-server的路径
export BINARYLIBS=________ # binarylibs的路径
export GAUSSHOME=$CODE_BASE/dest/
export GCC_PATH=$BINARYLIBS/buildtools/***/gcc8.2 /
export CC=$GCC_PATH/gcc/bin/gcc
export CXX=$GCC_PATH/gcc/bin/g++
export LD_LIBRARY_PATH=$GAUSSHOME/lib:$GCC_PATH/gcc/lib64:$GCC_PATH/isl/lib:$GCC_PATH/mpc/lib/:$GCC_PATH/mpfr/lib/:$GCC_PATH/gmp/lib/:$LD_LIBRARY_PATH
export PATH=$GAUSSHOME/bin:$GCC_PATH/gcc/bin:$PATH
(4) 选择版本进行configure。
① debug版本:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境。
./configure --gcc-version=8.2.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib
② release版本:代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生产环境或性能测试环境。
./configure --gcc-version=8.2.0 CC=g++ CFLAGS="-O2 -g3" --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-thread-safety --without-readline --without-zlib
③ memcheck版本:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN(addresssanitizer,地址消毒剂。一个开源编程工具,它可以检测内存损坏错误)功能,通常用于定位内存问题。
./configure --gcc-version=8.2.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --without-readline --without-zlib --enable-memory-check
在ARM平台上,“CFLAGS”参数需要添加“-D__USE_NUMA”参数。在ARMv8.1或者更高的平台上(例如鲲鹏920),“CFLAGS”参数需要添加“-D__ARM_LSE”参数。 若将binarylibs移动到openGauss-server下,或在openGauss-server下创建了指向binarylibs的软链接,可不指定“--3rd”参数。但这样做的话需要注意其容易被git clean等操作删除。
(5) 执行如下命令编译安装。
[user@linux openGauss-server]$ make -sj[user@linux openGauss-server]$ make install -sj
(6) 显示如下内容,表示编译安装成功。
openGauss installation complete.
编译后软件安装路径为:$GAUSSHOME,编译后的二进制放置路径为:$GAUSSHOME/bin。
四、 参与openGauss社区开源项目
openGauss已经开放数据库源代码,社区官网为“http://opengauss.org”。openGauss鼓励用户进行社区贡献、合作,希望能共同构建一个能够融合多元化技术架构的企业级开源数据库社区。本篇介绍如何参与openGauss社区开源项目。
(一) 开源社区概述
openGauss社区按照不同的SIGs(special interest groups)来组织,以便于更好的管理和改善工作流程。SIG是开放的,欢迎任何人加入并参与贡献。每一个SIG在码云(gitee)上拥有一个或多个代码仓库。您可以在SIG对应的代码仓库上提交Issue(问题),参与Issue讨论,提交“Pull Request”(PR,拉取请求),参与代码检视等。您可以从表4中找到您感兴趣的SIG。
表4 SIG说明
SIG名称 | 职责范围 |
---|---|
SQLEngine | 负责openGauss社区SQL引擎的开发和维护 |
StorageEngine | 负责openGauss社区存储引擎的开发和维护 |
Connectors | 负责openGauss社区Connectors的开发和维护 |
Tools | 负责openGauss社区工具的开发和维护 |
Docs | 负责openGauss社区文档的开发和维护 |
Infra | 负责openGauss社区基础设施的开发和维护 |
Security | 负责openGauss社区安全的开发和维护 |
(二) 社区环境准备
用户需要完成码云账号注册、绑定主邮箱以及签署CLA(contribution license agreement,贡献许可协议)之后,才能参与社区贡献。
1. 注册码云账号
(1) 登录码云官网(https://gitee.com/),单击页面右上角的“注册”按钮注册账号。
(2) 在注册页面填写相关信息并勾选阅读和同意相关条款,完成码云注册。如图10所示。
|图10 注册信息|
必填信息如下。
(1)姓名:码云账号名称。
(2)个人空间地址:注册账号主页地址,可用作推拉代码或者登录Gitee的用户名。
(3)手机或者邮箱:验证需要。建议使用邮箱注册,默认为主邮箱,无须执行绑定主邮箱操作。
(4)密码:密码不少于6位。建议为字母、符号和数字的组合,以提升安全性。
2. 绑定主邮箱
(1) 在“个人主页”页面,单击“设置”按钮进入“个人信息”设置页面。如图11所示。
|图11 “设置”按钮|
(2) 在左侧导航栏单击“多邮箱管理”,修改或者绑定主邮箱。主邮箱默认为注册时使用的邮箱。如图12所示。
|图12 多邮箱管理|
3. 签署CLA贡献者协议
进入CLA签署页面(https://opengauss.org/en/cla.html),填写相关信息,完成CLA签署。如图13所示。 |图13 CLA签署|
(三) 提交issue
如果您准备向社区上报Bug或者提交需求,请在openGauss社区对应的仓库上提交Issue。您也可以以Issue的方式为openGauss社区贡献自己的意见或建议。
(1)确认问题所属的仓库,进入所属仓库的repository(仓库)。
(2)在repository的工具栏内单击“Issue”,再单击创建“+新建Issue”按钮新建issue。如图14所示。
|图14 新建issue|
(3)输入issue的标题名称并选择对应的issue类型。issue的标题名称中请简要的描述问题现象和影响。如图15所示。
|图15 issue信息|
(4)在详细描述框中,请按照模板说明问题发生的细节。
(5)填写完成后,输入验证码并单击“创建”。
Issue创建后将会有社区参与者进行解答。您也可以执行如下命令将issue分配给指定的人。
/assign 账号
(四) 贡献代码和文档
您可以自行修改代码和文档,并通过提交PR将修改合入主干版本。
1. 拉取个人分支
(1) 进入docs(文档)或者openGauss-server(代码)仓库。此处以docs仓库举例。如图16所示。 |图16 docs仓库| (2) 单击右上角“Forked”按钮,Fork(复刻)个人分支。如图17所示。 |图17 Fork个人分支|
2. 修改代码和文档
目前有两种修改代码和文档的方式,Git(分布式版本管理软件)方式修改以及WEB((World Wide Web,即全球广域网,这里指的是在网页上操作)方式修改。
1) Git方式修改
Git方式修改,即在本地通过Git工具将修改一次性提交至远端个人仓库。此方法适用于大量以及批量修改,例如特性更新等场景。
(1)安装Git。下载Git并按默认设置安装。Git下载地址:https://git-scm.com/downloads。
(2) 配置Git。
① 配置Git上的user为您的gitee个人名称。
git config --global user.name "your gitee name"
② 配置Git邮箱为您的gitee注册邮箱。
git config --global user.email "your Gitee email"
your Gitee email 为gitee注册邮箱。您可以在gitee个人主页获取。
③ 生成SSH公钥。
ssh-keygen -t rsa -C "your Gitee email"
④ 执行如下命令获取公钥。
cat ~/.ssh/id_rsa.pub
“.ssh/id_rsa.pub”为公钥文件保存地址。“id_rsa.pub”为自定义的pub文件名称。
⑤ 在个人Gitee账户中添加您的SSH公钥。如图18所示。
|图18 SSH公钥三方件编译|
(3) 复制远程个人仓库至本地。
① 在个人电脑本地创建文件夹openGauss,存放远程仓库文件。
② 在Git工具中执行如下命令复制远程仓库至本地。
# 进入存放个人远程仓库的本地目录openGauss
cd D:\openGauss
# 把远程仓库复制到本地
git clone https://gitee.com/"your Gitee Name"/repository_name #个人远程仓库地址
# 设置本地工作目录的upstream(上行)源
git remote add upstream https://gitee.com/opengauss/docs.git #openGauss远程地址
# 设置同步方式
git remote set-url --push upstream no_push
(4) 修改内容并将本地修改提交至远程个人仓库。
① (可选)如果非首次修改本地文件,建议您执行如下操作,使远程仓库与本地仓库保持一致。
在个人仓库页面,单击如下图标将主仓库的内容更新至个人远程仓库。如图19所示。
|图19 更新个人仓库|
在本地Git工具执行如下命令,将个人远程仓库内容更新至本地仓库。
git fetch upstream
git merge upstream/master
② 进入本地文件夹,修改本地文件。 ③ 在文件所在目录下打开Git工具,在Git工具中执行如下命令,提交本地修改至个人远程仓库。
如果修改了多个文件夹下的文件,建议依次进入每个子文件夹下面,执行提交操作。
git add .
git commit -m "提交原因"
git push origin master
2) WEB方式修改
WEB方式修改,即直接在web网页上修改md文件,适用于内容较少的修改。例如维护版本的日常问题处理。
(1) 进入个人Fork路径,单击“Web IDE(integrated development environment,集成开发环境)”。如图20所示。
|图20 Web IDE|
(2) 在左侧导航栏找到对应文件进行编辑。
(3) 修改完成后,单击顶部“Markdown预览”检查修改内容。
(4) 提交。先单击保存修改,填写修改原因后提交到当前分支。如图21所示。
|图21 提交|
3. 提交PR
提交PR可以将远程个人仓库的修改合并至主干中。
(1) 进入个人Fork路径,检查修改的内容是否已合入。如图22所示。
|图22 合入信息|
(2) 在“Pull Requests”页面单击“+新建Pull Request”。
(3) 输入修改的详细信息,并单击“创建”。如图23所示。
|图23 创建|
(4) 提交完成等待commiter审核后合入。
(五) Git使用
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
1. 下载
Git下载地址:https://git-scm.com/downloads。
2. 常见命令
(1) 仓库。
在当前目录新建一个Git代码库。
git init
(2) 配置。
设置提交代码时的用户信息。
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
(3) 增加、删除文件。
添加指定文件到暂存区。
git add [file1] [file2] ...
(4) 代码提交。
提交暂存区到仓库区。
git commit -m [message]
提交暂存区的指定文件到仓库区。
git commit [file1] [file2] ... -m [message]
(5) 分支。
列出所有本地分支。
git branch
列出所有本地分支和远程分支。
git branch -a
(6) 查看信息。
显示有变更的文件。
git status
显示当前分支的版本历史。
git log
(7) 远程同步。
下载远程仓库的所有变动。
git fetch [remote]
取回远程仓库的变化,并与本地分支合并。
git pull [remote] [branch]
上传本地指定分支到远程仓库。
git push [remote] [branch]
五、 小结
本章介绍了数据库的安装部署,以便开发者能熟悉openGauss数据库的功能特点。接着介绍了如何连接、如何进行数据库基本操作,包括:创建数据库、创建表及向表中插入数据和查询表中数据等数据管理和基础权限管理操作等。接着介绍了如何搭建开发、编译环境以及版本编译。最后,介绍了如何参与开源社区的开发。
Gauss松鼠会是汇集数据库爱好者和关注者的大本营,
大家共同学习、探索、分享数据库前沿知识和技术,
互助解决问题,共建数据库技术交流圈。