Greenplum 带ORCA 优化器的编译安装解析

ORCA是开源的Postgres和Greenplum的优化器,相比于Greenplum和Postgres内置的优化器,ORCA在复杂查询以及分区表等场合有非常好的性能提升。这里介绍下如何使Greenplum启用ORCA优化器,以及如何运行Greenplum的测试用例installcheck-world。

设置开发环境

在开始之前需要装编译和运行的依赖,包括Greenplum和ORCA的依赖。这里采用的编译环境以CentOS 7为例。首先安装系统包,执行的命令如下:

sudo yum -y groupinstall "Development Tools"
sudo yum -y install readline-devel zlib-devel curl-devel apr-devel libevent-devel libxml2-devel bzip2-devel python-devel openssl-devel which iproute net-tools perl-Env wget
sudo yum install -y epel-release centos-release-scl
sudo yum install -y python-pip python-psutil cmake3
sudo yum install -y devtoolset-6-toolchain
sudo yum install -y xerces-c-devel

Greenplum源码保包中的README.CentOS.bash有相关的依赖包设置,这里的命令相比README.CentOS.bash增加了部分依赖。接下来按装相关的python依赖,命令如下:

sudo pip install --upgrade pip
sudo pip install --no-cache-dir lockfile paramiko setuptools psutil conan

然后安装ORCA依赖的编译管理公共ninja,这里用的是1.8.2版本。最新的1.9 依赖了高版本的c++运行库,在CentOS7上执行会报错。

wget https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip
unzip ninja-linux.zip
sudo mv ninja /usr/local/bin/

最后再来配置额外的环境设置:

sudo mkdir /usr/local/gpdb
sudo chown -R `whoami` /usr/local/gpdb
source scl_source enable devtoolset-6
sudo ln -sf /usr/bin/cmake3 /usr/bin/cmake

到此我们的准备工作就全部完成,可以开始编译了。

配置ORCA

准备xerces依赖库(可选)

编译ORCA之前需要先编译它的依赖,也就是xerces,ORCA用它来读写xml数据格式。这一步操作是可选的,因为我们既可以使用已经安装好的系统版本,也可以使用带gp补丁的版本(地址为:https://github.com/greenplum-db/gp-xerces)。如果要使用gp补丁的版本,需要执行的命令如下:

git clone https://github.com/greenplum-db/gp-xerces.git
cd gp-xerces/
mkdir build && cd build
../configure --prefix=/usr/local/gpdb
make && make install && make install

编译ORCA

编译ORCA需要cmake3和gcc-6,在第一步中已经配置完成,开始前可通过如下命令进行确认:

gcc --version
cmake --version

如果版本不对或者命令没有找到,请确保如下两个操作正确执行了:

source scl_source enable devtoolset-6
sudo ln -sf /usr/bin/cmake3 /usr/bin/cmake

其中命令`source scl_source enable devtoolset-6`用于修改gcc版本,可将其加入登录脚本中来自动执行

echo 'source scl_source enable devtoolset-6' >> ~/.bashrc

由于Greenplum和ORCA之间存在版本匹配问题,因此我们采用的方式是用Greenplum源码中的ORCA版本来编译,具体步骤如下:

git clone https://github.com/greenplum-db/gpdb.git --branch 6X_STABLE --single-branch --depth 1 -b 6X_STABLE 6X_STABLE
cd 6X_STABLE/depends
CFLAGS="-L/usr/local/gpdb/lib/" ./configure --prefix=/usr/local/gpdb
make
make install_local

此时编好ORCA就被安装于/usr/local/gpdb目录下了。

编译Greenplum

Greenplum有很多的扩展功能可以在命令行里控制,这里重点在编译ORCA,因此使用的配置关掉其它一些编译参数。在Greenplum的源码根目录执行如下命令:

export LD_LIBRARY_PATH=/usr/local/gpdb/libCFLAGS="-I/usr/local/gpdb/include" LDFLAGS="-L/usr/local/gpdb/lib/" ./configure --enable-orca --without-perl --without-python --with-libxml --without-gssapi --disable-pxf --without-zstd -without-openssl
make -j4 && make install

当命令执行成功后,恭喜你,你自己的Greenplum已经就绪。编译好的Greenplum就被安装到/usr/local/gpdb目录,它可以作为一个整体打包,部署到其它机器的同样位置进行集群测试。编译好的gpdb目录内容大致如下:

$ ls /usr/local/gpdb
bin  docs  etc  greenplum_path.sh  include  lib  sbin  share

运行测试用例

Greenplum编译完之后,我们需要确认所有的相关测试可以正常运行。Greenplum继承了Postgres的测试框架,提供了自己的测试target:installcheck-world。此外,Greenplum还包含了创建测试集群的配置,因此我们的目标就是用测试集群来执行installcheck-world测试。

准备系统配置

为确保测试可以正常执行,强烈建议根据Greenplum官方文档来配置相应的系统配置文件,包括/etc/security/limits.conf和/etc/sysctl.conf等,在源码目录的README.linux.md中也有简单的描述。

此外,由于即使单机版本,Greenplum也需要使用SSH执行命令,因此需要配置好无密码访问:

ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

创建测试集群

通过如下命令可以创建一个3 primary, 3 mirror的Greenplum集群:

source /usr/local/gpdb/greenplum_path.sh
make create-demo-cluster

当看到如下信息时,说明demo集群配置成功。

 optimizer
----------- 
 on 
(1 row)
                gp_opt_version
---------------------------------------------- 
GPOPT version: 3.48.0, Xerces version: 3.1.2(1 row)

如果出现错误,需要根据提示进行相应的修复。修复完后,可以先通过命令

pkill postgres

来强制结束未完成的操作,然后重新执行。

执行测试

创建好测试集群后,就可以运行测试了,在Greenplum源码根目录下执行如下命令:

PGPORT=15432 make installcheck-world

所有测试都会在打开ORCA的情况下执行。此外,尽管我们使用的是STABLE分支,仍有可能出现某些测试失败的情况,欢迎大家提供补丁或者上报bug。

获得更多关于Greenpum的技术干货,请访问Greenplum中文社区网站

你可能感兴趣的:(greenplum,数据库,postgresql)