Greenplum集群建设

最近两周研究了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

安装完成后应该有如下显示:

cmake安装完成

cmake安装完成后就可以安装gporca了,gporca是Greenplum的一个优化器。在Greenplum的安装中这并不是必须的,但笔者还是在这里将它的安装步骤罗列出来供读者参考。安装gporca之前首先要安装gporca的依赖环境,这一点可以参照Github上gporca的依赖安装步骤来做,在这里给出Github上的指引链接 供读者参考。

在安装依赖环境之前,笔者推荐首先配置一个环境变量DEBIAN_FRONTEND=noninteractive。这个环境变量的配置可以让我们省去一个不大不小又无关痛痒的麻烦。

主节点上增加一个环境变量

随后我们让这个环境变量生效。

source /etc/profile

设置了环境变量以后还有一个可选的操作,这个操作是Greenplum源码中提供的一个批处理操作,用于安装一些必要的软件以及配置环境。笔者推荐读者执行这一步。

./gpdb-master/README.ubuntu.bash

主节点配置ubuntu并安装必要依赖

执行完成后,还需要确保ld.so.conf文件中拥有这样两条记录。

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并设置gpadmin

执行完成没有报错的话应该可以本机ssh免密码登录,效果如下图所示:

主节点免密码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

sysctl.conf中添加记录

在/etc/security/limits.conf中添加记录(所有节点都执行):

* soft nofile 65536

* hard nofile 65536

* soft nproc 131072

* hard nproc 131072

limits.conf文件配置

在/etc/selinux/config中配置信息。(所有节点都执行)

SELINUX=disabled

SELINUXTYPE=targeted

config中信息配置

在安装gporca之前要先安装gp-xerces,代码清单如下图所示:

cd ./gp-xerces

mkdir build && cd build

../configure --prefix=/usr/local

make

make install

安装gp-xerces

接下来,就要开始安装gporca。安装之前首先要安装Ninja:

#若执行了README.ubuntu.bash则跳过这一步

apt-get install ninja-build

进入gporca执行以下代码清单完成gporca的安装:

cd ./gporca

cmake -GNinja -H. -Bbuild

sudo ninja install -C build

安装gporca

安装完成若没有报错可以测试一下,代码清单如下图所示:

cd ./build

ctest -j7 --output-on-failure

主节点测试gporca

最后,就可以编译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
编译gp源代码并安装

安装完成后配置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路径。

greenplum_path.sh更改

第三,需要把gpdb-master的拥有者和拥有组都改为gpadmin。

chown -R gpadmin:gpadmin /gpdb-master

代码变更所有者

全部完成后,使用gpadmin用户登录,就可以进行测试了:

cd ./gpdb-master

make create-demo-cluster

主节点上gp测试

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

从节点上添加gpadmin用户

现在可以进行ssh秘钥分发了,这一步完成了就可以实现集群中任意两台主机之间的免密码ssh登录,配置的代码清单如下:

gpssh-exkeys -f /home/gpadmin/conf/hostlist

集群中ssh秘钥分发

完成后可以测试一下从主节点ssh登录从节点,或者某一个从节点ssh登录某一个从节点。

主节点免密码登录s1和s2

接下来,需要在所有从节点上批量安装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

主节点上配置集群并设置s1为第二主节点

若上一步没有报错则集群的构建就已经完成,在主节点上可以操作集群的启动和停止,以及进入退出某个数据库:

主节点上进入数据库
主节点上停止集群
主节点上启动集群
主节点上查看集群状态

至此,Greenplum的集群建设实验就告一段落了。笔者下一步的设想是使用Greenplum官方提供的docker镜像进行gp集群建设。

2017年12月3日

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容