最近两周研究了Greenplum集群搭建,在docker环境下实现了一个3节点的Greenplum集群实例。现在把建设的具体过程写出来供读者参考。
Greenplum是一款分布式数据库系统,由于其在并行数据处理上的优势而变得越来越流行。在本例中笔者在一台机器上试图实现一个基于docker的Greenplum集群。笔者一共设置了三个Grennplum节点,一个主节点用于集群控制,两个从节点用于存储数据,其中一个从节点作为主节点的热备份,操作系统采用ubuntu16.04。
主节点Greenplum源代码编译安装
首先进入宿主机确定docker的守护进程在运行,然后先创建一个docker子网,将所有的Greenplum容器都纳入到这个子网中,使节点内部能够实现互联。
docker network create gp_network
在宿主机上启动三个docker容器,分别代表三个Greenplum的节点。
#主节点容器创建并运行
docker run --net=gp_network --name ubuntu_gp_master -h master -it --privileged -p 5432:5432 -p 8023:8023 -p 8022:22 -v $(pwd)/volumes:/volumes_file ubuntu:16.04 /bin/bash
#从节点创建并运行
docker run --net=gp_network --name ubuntu_gp_s1 -h s1 -it --privileged ubuntu:16.04 /bin/bash
docker run --net=gp_network --name ubuntu_gp_s2 -h s2 -it --privileged ubuntu:16.04 /bin/bash
在这里,可以创建多个终端连接这些容器,实现操作上的并行。容器创建好之后首先在主节点安装Greenplum并配置集群信息。在本例中,笔者采用Greenplum源代码编译的安装方式。在实验之前,笔者就下载好了gp的源代码,以及一些必要的依赖包。从上面的代码清单中可以看到:创建主节点容器时挂载了一个卷到容器中,这个卷中就包含了gp编译安装所需的全部软件依赖。具体来说一共是四个软件,第一个是cmake 软件包,第二个是gporca ,第三个是gp-xerces ,最后一个是Greenplum的源代码 。
在主节点和从节点中首先要对软件源进行更新,安装一些必需的软件和python模块,具体来说需要安装以下这些软件和模块:
apt-get install -y git-core gcc g++ ccache libreadline-dev bison flex zlib1g-dev openssl libssl-dev libpam-dev libcurl4-openssl-dev libbz2-dev python-dev ssh python-pip unzip wget libffi-dev sudo vim net-tools inetutils-ping lsb
pip install psutil lockfile paramiko setuptools
将上面提到的四个软件的源代码包解压统一放在一处以便进行编译和安装。首先安装cmake,安装代码如下所示:
#进入cmake的文件夹中
./bootstrap
make -j4
sudo make install
cmake --version
安装完成后应该有如下显示:
cmake安装完成后就可以安装gporca了,gporca是Greenplum的一个优化器。在Greenplum的安装中这并不是必须的,但笔者还是在这里将它的安装步骤罗列出来供读者参考。安装gporca之前首先要安装gporca的依赖环境,这一点可以参照Github上gporca的依赖安装步骤来做,在这里给出Github上的指引链接 供读者参考。
在安装依赖环境之前,笔者推荐首先配置一个环境变量DEBIAN_FRONTEND=noninteractive。这个环境变量的配置可以让我们省去一个不大不小又无关痛痒的麻烦。
随后我们让这个环境变量生效。
source /etc/profile
设置了环境变量以后还有一个可选的操作,这个操作是Greenplum源码中提供的一个批处理操作,用于安装一些必要的软件以及配置环境。笔者推荐读者执行这一步。
./gpdb-master/README.ubuntu.bash
执行完成后,还需要确保ld.so.conf文件中拥有这样两条记录。
保存退出后记得执行ldconfig命令使之生效,注意这条命令并没有输出。
接下来就要配置集群中ssh登录了,请在设置之前确保docker容器中的ssh服务是开启的。这一步既可以使用gp源代码中自带的批处理文件自动生成,也可以使用ssh-keygen来自动生成公钥。笔者推荐使用gp源代码中自带的批处理工具,因为这个工具不仅仅能生成秘钥还能生成gpadmin用户。在使用这个批处理文件的时候需要注意一个小点:需要在该批处理文件所在目录下创建一个gpdb_src目录,否则批处理文件执行会报错,这是由于批处理文件中有chown -R gpadmin:gpadmin gpdb_src这样一条命令,但是其所在文件夹中并没有gpdb_src这样一个目录,因此需要我们手动创建一个。
./gpdb-master/concourse/scripts/setup_gpadmin_user.bash
执行完成没有报错的话应该可以本机ssh免密码登录,效果如下图所示:
设置完成后还需要在/etc/sysctl.conf中添加一些集群的必要信息(所有节点都执行):
kernel.shmmax = 500000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 250 512000 100 2048
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1025 65535
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.overcommit_memory = 2
在/etc/security/limits.conf中添加记录(所有节点都执行):
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
在/etc/selinux/config中配置信息。(所有节点都执行)
SELINUX=disabled
SELINUXTYPE=targeted
在安装gporca之前要先安装gp-xerces,代码清单如下图所示:
cd ./gp-xerces
mkdir build && cd build
../configure --prefix=/usr/local
make
make install
接下来,就要开始安装gporca。安装之前首先要安装Ninja:
#若执行了README.ubuntu.bash则跳过这一步
apt-get install ninja-build
进入gporca执行以下代码清单完成gporca的安装:
cd ./gporca
cmake -GNinja -H. -Bbuild
sudo ninja install -C build
安装完成若没有报错可以测试一下,代码清单如下图所示:
cd ./build
ctest -j7 --output-on-failure
最后,就可以编译Greenplum源代码并且安装了,安装之前还需要再安装四个软件。代码清单如下:
#若执行了README.ubuntu.bash这一步可跳过
apt-get install -y libapr1-dev libevent-dev libperl-dev python2.7-dev libyaml-dev libxml2-dev libkrb5-dev
进入gp代码文件夹中,执行如下清单:
cd ./gpdb-master
./configure --with-perl --with-python --with-libxml --with-gssapi --prefix=/usr/local/gpdb
make -j8
make -j8 install
安装完成后配置gp的环境变量:
source /usr/local/gpdb/greenplum_path.sh
到这一步,gp在主节点上的安装就已经完成了,接下来可以测试一下安装效果。但是在测试之前还有几个小步骤需要完成来保证测试成功。首先需要配置机器的编码,这是必要的,同时应该在所有节点上完成:
localedef -i en_US -f UTF-8 en_US.UTF-8
第二,可能需要在/usr/local/gpdb/greenplum_path.sh中做一点更改:在LD_LIBRARY_PATH后面添加/usr/local/lib路径。
第三,需要把gpdb-master的拥有者和拥有组都改为gpadmin。
chown -R gpadmin:gpadmin /gpdb-master
全部完成后,使用gpadmin用户登录,就可以进行测试了:
cd ./gpdb-master
make create-demo-cluster
Greenplum集群构建
构建集群之前首先要在从节点上安装一些必要的软件,python模块,添加一些配置信息,以及配置编码。这些在上一节都已经完成了,不再赘述。
集群建设之前首先要更新每台机器上的hosts文件,确保集群中的任意两台机器是可以通过主机名ping通的。
在主节点的gpadmin用户目录下创建一个conf目录用于保存集群的配置信息等文件。
首先创建两个文件用于保存集群的主机信息和从节点信息:
su - gpadmin
cd /home/gpadmin
mkdir conf && cd conf
vi hostlist
master
s1
s2
:wq
vi seg_hosts
s1
s2
:wq
其次,在所有从节点上创建gpadmin用户:
groupadd -g 530 gpadmin
useradd -g 530 -u530 -m -d /home/gpadmin -s /bin/bash
gpadmin passwd gpadmin
现在可以进行ssh秘钥分发了,这一步完成了就可以实现集群中任意两台主机之间的免密码ssh登录,配置的代码清单如下:
gpssh-exkeys -f /home/gpadmin/conf/hostlist
完成后可以测试一下从主节点ssh登录从节点,或者某一个从节点ssh登录某一个从节点。
接下来,需要在所有从节点上批量安装Greenplum。由于在主节点上的gp安装目录为/usr/local/gpdb,因此我们首先打包这个文件,并且打包/usr/local/lib目录。
postgres -V#这一步最好执行
tar -czvf /home/gpadmin/gpdb.tar /usr/local/gpdb
tar -czvf /home/gpadmin/lib.tar /usr/local/lib
将打包好的文件分发到所有集群的从节点中:
gpscp -f /home/gpadmin/conf/seg_hosts /home/gpadmin/gpdb.tar =:/home/gpadmin gpscp -f /home/gpadmin/conf/seg_hosts /home/gpadmin/lib.tar =:/home/gpadmin
在每个从节点中将这两个tar文件移动到/usr/local目录下解压,其中替换掉原来/usr/local目录下的lib目录。
进行到这一步就可以在集群中每一个节点上创建数据保存目录了,gp在这里为我们提供了集群批处理工具,让我们不用一台机器一台机器地配置。
gpssh -f /home/gpadmin/conf/hostlist
mkdir gpdata && cd gpdata#(创建数据存放主目录,并进入目录)
mkdir gpdatap1 gpdatap2 gpdatam1 gpdatam2 gpmaster
exit
在所有节点上添加环境变量:
vi /etc/profile(主节点,从节点)
export DEBIAN_FRONTEND=noninteractive
source /usr/local/gpdb/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/home/gpadmin/gpdata/gpmaster/gpseg-1
export PGPORT=5432
:wq
source /etc/profile
最后,在主节点上添加集群的配置信息:
cp /usr/local/gpdb/docs/cli_help/gpconfigs/gpinitsystem_config /home/gpadmin/conf
cd /home/gpadmin/conf vi gpinitsystem_config
# FILE NAME: gpinitsystem_config
ARRAY_NAME="Greenplum"
SEG_PREFIX=gpseg
PORT_BASE=40000
declare -a DATA_DIRECTORY=(/home/gpadmin/gpdata/gpdatap1 /home/gpadmin/gpdata/gpdatap2)
MASTER_HOSTNAME=master
MASTER_DIRECTORY=/home/gpadmin/gpdata/gpmaster
MASTER_PORT=5432
TRUSTED_SHELL=ssh
CHECK_POINT_SEGMENTS=8
ENCODING=UNICODE
MIRROR_PORT_BASE=50000
REPLICATION_PORT_BASE=41000
MIRROR_REPLICATION_PORT_BASE=51000
declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/gpdata/gpdatam1 /home/gpadmin/gpdata/gpdatam2)
MACHINE_LIST_FILE=/home/gpadmin/conf/seg_hosts
完成之后,就可以执行配置信息了,若成功Greenplum会自动启动集群。在执行配置信息之前还需要完成一些小步骤来确保集群启动成功。首先在各个从节点上执行:
postgres -V
若上面的代码清单可以正常输出则说明没有问题,否则还需要进一步配置。最后,最好把所有从节点上的/usr/local/gpdb的所有者和所有组都设置成gpadmin,否则可能会出现权限问题。设置配置文件的权限:
chmod 644 /home/gpadmin/conf/gpinitsystem_config
到这一步就可以执行配置文件了。
#设置s1节点为第二主节点
gpinitsystem -s s1 -c /home/gpadmin/conf/gpinitsystem_config –a
若上一步没有报错则集群的构建就已经完成,在主节点上可以操作集群的启动和停止,以及进入退出某个数据库:
至此,Greenplum的集群建设实验就告一段落了。笔者下一步的设想是使用Greenplum官方提供的docker镜像进行gp集群建设。
2017年12月3日