2023.9月greenplum 7.0.0正式发布,准备安装试用一下。官方支持的系统是rockylinux 8,而我手头只有rockylinux 9.2,就尝试安装了一下。以下为踩坑记录。
*centos已经不包含在greenplum7.0.0的支持列表中,centos8已经停止维护,centos7到2024年也会停止维护,推荐rockylinux。关于rockylinux可以参考rockylinux介绍
节点准备
配置hosts等
用户:root
/etc/hosts配置
master & segments
192.168.56.12 gp7-master gp7-master
192.168.56.13 gp7-seg1 gp7-seg1
192.168.56.14 gp7-seg2 gp7-seg2
gpadmin用户配置
master & segments
用户:gpadmin
参考用户配置
gp提供了setup_gpadmin_user.bash用于配置gpadmin用户,但是不太灵活,因此手动配置。
ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
编译准备
编译依赖安装、系统配置
master & segments
*实际上segment不需要编译,需要安装的内容更少,但是GP官方的依赖安装脚本为编译+系统配置一体,并没有单独将运行期的依赖剥离出来。懒得折腾就一起安装了。
用户:root或者有sudo权限的用户
参考依赖安装说明
greenplum提供了一些主流系统的依赖安装脚本,README.Rhel-Rocky.bash对应rockylinux 8。
修改安装包列表
由于rockylinux8中python版本默认为3.6,而greenplum7.0.0需要依赖python3.9,因此会指定安装python3.9对应的软件包。而rockylinux9中python版本默认为3.9,安装的软件包不需要指定对应python3.9的版本。因此需要将脚本中对应的软件版本进行调整。
-INSTALL_PKGS="apr-devel bison bzip2-devel cmake3 epel-release flex gcc gcc-c++ krb5-devel libcurl-devel libevent-devel libkadm5 libxml2-devel libzstd-devel openssl-devel python39 python39-devel python39-psutil python3-pip perl-ExtUtils-MakeMaker.noarch perl-ExtUtils-Embed.noarch readline-devel rsync xerces-c-devel zlib-devel python3-psutil python3-pyyaml"
+INSTALL_PKGS="apr-devel bison bzip2-devel cmake3 epel-release flex gcc gcc-c++ krb5-devel libcurl-devel libevent-devel libkadm5 libxml2-devel libzstd-devel openssl-devel python3 python3-devel python3-psutil python3-pip perl-ExtUtils-MakeMaker.noarch perl-ExtUtils-Embed.noarch readline-devel rsync xerces-c-devel zlib-devel python3-psutil python3-pyyaml"
屏蔽python依赖检查
rockylinux9中python依赖包的版本高于greenplum7.0.0中指定的版本,不需要进行检查。
-pip3.9 install -r python-dependencies.txt
+## pip3.9 install -r python-dependencies.txt
root下执行依赖安装脚本
./README.Rhel-Rocky.bash
其它依赖安装
上述Greenplum提供的依赖并不全面,在后续configure阶段还会因为缺少一些依赖而报错,需要再安装更多的依赖。
libyaml-devel安装
configure会报告libyaml相关问题,原因为configure中会编译一段测试程序,其中会引用libyaml中包含的头文件,从而确定libyaml-devel是否存在,由于libyaml-devel默认没有安装,因此会报错。
libyaml-devel并不在默认enable的安装源中,而是在crb中(通过谷歌搜索到crb的安装源中有libyaml-devel),需要首先enable crb再安装。
## 查看repolist状态,发现crb是disabled
dnf repolist all|grep crb
## enable crb
dnf config-manager --set-enabled crb
dnf repolist all|grep crb
## 当前安装源中已经可以搜索到libyaml-devel
dnf search libyaml-devel
dnf install libyaml-devel.x86_64
## 最好关闭crb,以防止今后遇到一些软件包依赖问题
dnf config-manager --set-disabled crb
perl-core安装
make时候会报perl-core相关错误,如下安装
perldoc -l FindBin
yum list installed |grep perl-core
dnf install perl-core
编译
编译
master
./configure --with-perl --with-python --with-libxml --with-gssapi --prefix=/usr/local/gpdb
make -j8
安装准备
创建安装目录
master&segment
[root]# mkdir -p /usr/local/gpdb
[root]# chown -R gpadmin:gpadmin /usr/local/gpdb
互信配置
GP依赖互信,也方便后续segment安装。
参考Enabling Passwordless SSH
1-n互信
master
source /usr/local/gpdb/greenplum_path.sh
ssh-copy-id gp7-seg1
ssh-copy-id gp7-seg2
n-n互信
master
[gpadmin]$ cat ~/hostfile_exkeys
gp7-master
gp7-seg1
gp7-seg2
[gpadmin]$ gpssh-exkeys -f ~/hostfile_exkeys
安装
master安装
master
make -j8 install
segment安装
master
*互信配置好了,再进行rsync,省得输入密码了
rsync -avz -e "ssh" /usr/local/gpdb/ gpadmin@gp7-seg1:/usr/local/gpdb/
rsync -avz -e "ssh" /usr/local/gpdb/ gpadmin@gp7-seg2:/usr/local/gpdb/
准备数据目录
参考Creating the Data Storage Areas
创建master数据目录
master
用户:root
mkdir -p /data/coordinator
chown gpadmin:gpadmin /data/coordinator
创建master standby数据目录
可选
创建segment数据目录
all segments
用户:root
mkdir -p /data/primary
mkdir -p /data/mirror
chown -R gpadmin /data/primary
chown -R gpadmin /data/mirror
*也可以参考Creating Data Storage Areas on Segment Hosts的方法在master上远程创建,但是实际上面配置互信是gpadmin用户下互信,root下没有配置,因此会出现失败。不确定是我对官方文档理解是否有偏差。
安装集群
参考Initializing a Greenplum Database System
master
用户:gpadmin
准备环境变量
source /usr/local/gpdb/greenplum_path.sh
创建segment节点列表文件
mkdir -p ~/gpconfigs/
vi ~/gpconfigs/hostfile_gpinitsystem
[gpadmin@gp7-master ~]$ cat ~/gpconfigs/hostfile_gpinitsystem
gp7-seg1
gp7-seg2
[gpadmin@gp7-master ~]$
创建GP初始化配置文件
[gpadmin@gp7-master ~]$ cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config ~/gpconfigs/
[gpadmin@gp7-master ~]$ vi ~/gpconfigs/gpinitsystem_config
通常需要修改如下field与实际环境一致
对应1master无standby,2segment host,4 segment instances,默认库postgres
[gpadmin@gp7-master ~]$ vi ~/gpconfigs/gpinitsystem_config
## 这里是segment的数据目录,()内数量决定了每个segment host上的segment实例数量,如下面每个segment host上有两个实例
declare -a DATA_DIRECTORY=(/data/primary /data/primary)
## 与master的hostname
COORDINATOR_HOSTNAME=gp7-master
## 与master的数据目录一致
COORDINATOR_DIRECTORY=/data/coordinator
其它说明
DATA_DIRECTORY指定一个segment host上的各个segment对应的数据目录。
个数决定了在一个host上起的segment数量,每个segment对应一个postgreSQL数据库实例。如(/data/primary /data/primary)对应两个segment实例。会在该目录下新建目录作为数据目录,如
[gpadmin@dw1-seg1 vagrant]$ ls /data/primary/
gpseg0 gpseg1
还会针对同一个host上指定多个网口的情形进行合理绑定。前提这些网口对应IP在hostfile_gpinitsystem中暴露出来。
[segment数量设置](https://developer.aliyun.com/ask/54601?spm=a2c6h.13159736)
和CPU核数,块设备数量,RAID卡通道数量,网卡数量都有关系。
要做到均衡配比,资源的利用才能最合理。
你可以这样来分配,例如CPU核数乘以0.8作为segment数量,然后再均匀分配SEG对应的块设备,网卡,RAID卡,
PORT_BASE和[系统配置](https://segmentfault.com/a/1190000043041096)中的net.ipv4.ip_local_port_range对应
DATABASE_NAME默认不设置,只会创建默认的postgres库。指定后会自动创建指定的库,如dw1.
MIRROR_DATA_DIRECTORY指定mirror,默认没有打开
有效的部分样例如下
SEG_PREFIX=gpseg
PORT_BASE=6000
declare -a DATA_DIRECTORY=(/data/primary /data/primary)
COORDINATOR_HOSTNAME=gp7-master
COORDINATOR_DIRECTORY=/data/coordinator
COORDINATOR_PORT=5432
TRUSTED_SHELL=ssh
ENCODING=UNICODE
执行集群初始化
master
用户:gpadmin
[gpadmin@gp7-master ~]$ gpinitsystem -c ~/gpconfigs/gpinitsystem_config -h ~/gpconfigs/hostfile_gpinitsystem
# 选择y
环境变量设置
master
用户:gpadmin
可以放到单独的文件myenv或者.bashrc
source /usr/local/gpdb/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
export PGPORT=5432
export PGUSER=gpadmin
export PGDATABASE=postgres
# 如果DATABASE_NAME指定了数据库名,如dw1
# export PGDATABASE=dw1
常用命令
登陆数据库
[gpadmin@gp7-master gp7]$ source myenv
[gpadmin@gp7-master gp7]$ psql
psql (12.12)
Type "help" for help.
启停集群
# stop所有实例
gpstop -a
gpstop -M fast -a
# start所有实例
gpstart -a
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。