收藏版!手把手教你搭建 Greenplum 6.1 集群

随着Greenplum大数据平台正式进入6时代,Greenplum 新版本在功能和性能上都实现大幅度地提升。Greenplum 用户麦煜遥将在本文详细介绍如何在Linux上搭建Greenplum 6.1集群。

1. 安装说明

1.1 环境说明

操作系统:  CentOS release 6.6

数据库: Greenplum 6.1

辅助工具:  Winscp, Putty

Winscp: 以root权限登录,远程连接Linux修改文档内容。Putty: 远程连接Linux运行命令。

1.2 参考安装教程

• Greenplum 5 <Greenplum 企业应用实战> 何勇,陈晓峰

• Greenplum 6 官网

https://gpdb.docs.pivotal.io/6-1/install_guide/prep_os.html#topic1

1.3  Greenplum 6.1 下载

https://github.com/greenplum-db/gpdb/releases/tag/6.1.0

备注:Greenplum 6.1 安装有两种方法:

    一是,下载源码,本地编译、安装;

    二是,直接下载编译好的包安装。

    这里选择的是,下载编译好的包安装,对于POC来讲,比较节省时间。

1.4 集群介绍

我搭建的 Greenplum 集群,使用1个 Master ,3个 Segment 的集群,如下:

192.168.xxx.1 Master 
192.168.xxx.3 Segment
192.168.xxx.4 Segment
192.168.xxx.5 Segment

备注:192.168.xxx.2 是 ETL 的 Pentaho 服务器,后面用来做测试的,没有在此列。

1.5 Master 与 Segment 职责对比

Master: 

 (1) 建立与客户端的回话连接和管理

 (2) SQL的解析并形成分布式的执行计划

 (3) 将生成好的执行计划分发到每个 Segment 上执行

 (4) 收集 Segment 的执行结果

 (5) Master 不存储业务数据,只存储数据字典

 (6) Master 主机可以一主一备,分布在两台机器上

 (7) 为了提高性能, Master 最好单独占用一台机器

Segment: 

 (1) 业务数据的存储和存取

 (2) 执行 Master 分发的 SQL 语句

 (3) 对于 Master 来讲,每个 Segment 都是对等的,负责对应数据的存储和计算

 (4) 每一台机器上可以配置一到多个 Segment

 (5) 由于每个 Segment 都是对等的,建议采用相同的机器配置

 (6) Segment 分 primary 和 mirror 两种,一般交错的存放在子节点上。

2. 安装环境准备

2.1 关闭SELINUX  (4台)

• /etc/selinux/config

SELINUX=disabled

备注:关闭后,就不用再开启,也不需要reboot。另外,用 Winscp 去编辑文档,比在命令环境方便多了。

2.2 关闭防火墙  (4台)

配置的时候,要保证所有的机器的网络都是通的,并且每台机器的防火墙都是关闭的,避免存在网络不通的情况。

  • 查看防火墙状态

> service iptables status

  • 关闭防火墙

> service iptables stop

  • 永久关闭防火墙

> chkconfig iptables off

备注:CentOS 6的命令是iptables,和CentOS 7不同。防火墙关闭后,就不用再开启。

2.3 配置/etc/hosts  (4台)

主要是为之后 Greenplum 能够在各个节点之间相互通信做准备。习惯将 Master 叫 mdw,Segment 叫 sdw 。4台都要设置:

192.168.xxx.1  (主机名)  mdw
192.168.xxx.3  (主机名)  sdw1
192.168.xxx.4  (主机名)  sdw2
192.168.xxx.5  (主机名)  sdw3

备注:hosts文件是Linux系统中负责ip地址与域名快速解析的文件,我这台DEV服务器装了很多东西,主机名已经配置了。所以,mdw只是一个主机的别名,不影响程序去查找IP。

如果你想知道添加是否成功,ping一下即可:

2.4 修改内核配置参数 (4台)

  • /etc/sysctl.conf (这是官网贴的配置,上面有说明)

kernel.shmall = 4000000000
kernel.shmmax = 500000000
kernel.shmmni = 4096
vm.overcommit_memory = 2 
vm.overcommit_ratio = 95 
net.ipv4.ip_local_port_range = 10000 65535 
kernel.sem = 500 2048000 200 40960
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.swappiness = 10
vm.zone_reclaim_mode = 0
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
vm.dirty_background_ratio = 0 
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736
vm.dirty_bytes = 4294967296

  • 执行命令使之生效

> sysctl -p

2.5 配置资源限制参数 (4台)

  • /etc/security/limits.conf

* soft nofile 524288
* hard nofile 524288
* soft nproc 131072
* hard nproc 131072

2.6  创建用户和用户组 (4台)

创建 gpadmin 用户及用户组,将其作为安装 greenplum 的操作系统用户。

• 如果已经存在,先删除

> groupdel gpadmin
> userdel gpadmin

• 创建新的用户和用户组

> groupadd -g 530 gpadmin
> useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin

• 对文件夹进行赋权,为新用户创建密码

> chown -R gpadmin:gpadmin /home/gpadmin/
> passwd gpadmin

备注:密码提示太简单,连续输入两次即可。

2.7 创建安装目录,并赋权限 (4台)

> mkdir /usr/local/greenplum
> chown -R gpadmin:gpadmin /usr/local/greenplum/

备注:

    • greenplum 5的书本提示安装在/opt,greenplum 6 装在/usr/local 。

    • /opt一般是安装系统后用户自己安装的其他应用软件,一般是源码包的软件、大型软件、或者是一些服务程序的安装目录。

    • /usr 一般是安装软件的目录,这个目录就相当于在 windows 下的 Program Files 目录。因为我是POC,无所谓,所以装在 /usr/local 。

3. 安装 Greenplum DB – Master

3.1 准备好安装文件

拷贝至 Master 主节点 /usr/local/greenplum 目录下 (其实可以放置在随意的目录)

3.2 安装

  • 执行命令安装  

> cd /usr/local/greenplum
> yum install greenplum-db-6.1.0-rhel6-x86_64.rpm

自动安装依赖,没有要求输入安装路径,自动安装到 /usr/local。

备注:greenplum 5 是用rpm命令的,而greenplum 6 则用 yum install 直接安装依赖。生成的文件夹如下,并自动创建软连接。

• 赋权限

因为我是用root权限安装的,所以Owner是root,要把Owner换成gpadmin,否则gpadmin无权操作该目录的文件。

chown -R gpadmin:gpadmin /usr/local/greenplum*

• 应用环境变量

安装完成后,greenplum的环境变量,已经在 greenplum_path.sh 中设置了,这里需要应用一下变量。用 gpadmin 用户,登录到 master host:

> su gpadmin
> source /usr/local/greenplum-db-6.1.0/greenplum_path.sh

4. 安装 Greenplum DB – Segment

4.1 Enabling Passwordless SSH (免密登录)

Master,Segment之间是通过SSH连接登录的,SSH登录有2种方式:密码,Host key。当然还可以两个都验证。但是,在服务器之间不可能每次都输入密码,所以我们只需要用Host key 登录即可。

  • 创建公私钥对 (4台)

我的Linux还没有公私钥对,所以,要先生成一个。生成时不要输入密码,否则还要用密码打开key。注意,我的登录用户是gpadmin。

> ssh-keygen -t rsa

选择生成的位置是 /home/gpadmin/.ssh/id_rsa,是私钥。另外,还会产生一个公钥 id_rsa.pub,生成如下:

• 添加信任其他机器的Host key (4 台)

> ssh-copy-id mdw
> ssh-copy-id sdw1
> ssh-copy-id sdw2
> ssh-copy-id sdw3

在集群的每一台使用 ssh-copy-id 命令,把 gpadmin 的 public key 拷到 known_hosts。这样,集群的机器互相访问就是通过这个设定互相信任的。(其实,个人觉得known_hosts是不需要放本机的key,放其他的机器key即可。而authorized_keys里面放的是本机的key。)

• 创建 hostlist,seg_hosts  (Master)

目录/home/gpadmin/conf,再分别创建hostlist,seg_hosts 。我这里 hostlist 中填写所有节点的主机别名,seg_hosts 中填写所有Segment 的主机别名。

> mkdir /home/gpadmin/conf
> cd /home/gpadmin/conf
> touch hostlist
> touch seg_hosts

然后,我喜欢使用winscp去修改内容:

4.2 使用 gpssh-exkeys 打通所有服务器  (Master)

  • 使用 gpssh-exkeys 将所有机器的通道打开,这样在每台机器之间跳转,就不需要输入密码。

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

  • 在打通所有机器通道之后,我们就可以使用 gpssh 命令对所有机器进行批量操作了。

> gpssh -f hostlist

备注:这是一个神奇的功能,原来我接触的集群部署,需要运行 SCP 远程拷贝命令。如果有100台,就需要操作100次。但是,这里只需要操作一次,就完成到全部集群的操作,前面带 “=>”,exit 退出。

4.3 分发数据库文件

• 打包

> cd /usr/local
> tar -cf gp6.tar greenplum-db-6.1.0/
> chown -R gpadmin:gpadmin /usr/local/gp6.tar

打包的时候权限不够,我换成root,然后再把.tar的权限还给gpadmin。

最后,要用gpadmin操作,因为前面设置了gpadmin免密。

• 分发

> gpscp -f /home/gpadmin/conf/hostlist gp6.tar =:/usr/local/greenplum

官网没有这部分的说明,书上看到用的是 hostlist 作为参数去操作。但是 hostlist 里面的是配置包括 master 的主机别名,所以,主机到主机也复制了一份。

书上的用意应该是,把 greenplum-db-6.1.0 放进 greenplum 里面,外面那套greenplum重复了,就删掉。然后,4台机器都在同一个目录下。

• 解压

在master上运行,一台上敲命令,操作4台。

> gpssh -f /home/gpadmin/conf/hostlist
=> cd /usr/local/greenplum
=> tar -xf gp6.tar
=> ln -s greenplum-db-6.1.0 greenplum-db

最后,退出。

5.环境配置

5.1 创建数据存储空间 

以上安装的是程序,接下来要创建数据存储空间 。

• Master

Master 不存储 user data,仅有 system catalog tables 和 system metadata ,我这里没有 Standby Master。所以,只在 Master 创建一个目录即可。

> mkdir -p /home/gpadmin/data/master

• Segment

数据存储在Segment 中,并且需要 primary segments 和 mirror segments,其余3台segment 用 gpssh分别创建2个目录。

> source /usr/local/greenplum-db/greenplum_path.sh 
> gpssh -f /home/gpadmin/conf/seg_hosts -e 'mkdir -p /home/gpadmin/data/primary'
> gpssh -f /home/gpadmin/conf/seg_hosts -e 'mkdir -p /home/gpadmin/data/mirror'

5.2  配置 .bash_profile 环境变量

• /home/gpadmin/.bash_profile, 网上没有确切说要配置几台,我4台都配置了。

source /usr/local/greenplum/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/home/gpadmin/data/master/gpseg-1
export PGPORT=5432
export PGUSER=testDB

其中,greenplum_path.sh中包括greenplun运行的一些环境变量设置,包GPHOME等,因为安装后把位置改了,4台都修正之。

• 使之生效

> source /home/gpadmin/.bash_profile

5.3  初始化配置文件

• configuration file

模板在:$GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config,拷贝过来。

> mkdir /home/gpadmin/gpconfigs
> cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config /home/gpadmin/gpconfigs/gpinitsystem_config
#数据库代号
ARRAY_NAME="Greenplum"

#segment前缀
SEG_PREFIX=gpseg

#primary segment 起始的端口号
PORT_BASE=33000

#指定primary segment的数据目录,网上写的是多个相同目录,多个目录表示一台机器有多个segment
declare -a DATA_DIRECTORY=(/home/gpadmin/data/primary)

#master所在机器的host name
MASTER_HOSTNAME=mdw

#master的数据目录
MASTER_DIRECTORY=/home/gpadmin/data/master

#master的端口
MASTER_PORT=5432

#指定bash的版本
TRUSTED_SHELL=/usr/bin/ssh

#将日志写入磁盘的间隔,每个段文件通常 =16MB < 2 * CHECK_POINT_SEGMENTS + 1
CHECK_POINT_SEGMENTS=8

#字符集
ENCODING=UNICODE

#mirror segment 起始的端口号
MIRROR_PORT_BASE=44000

# mirror的数据目录,和主数据一样,一个对一个,多个对多个
declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/data/mirror)

• host file

6. 初始化数据库

 6.1 安装

> cd ~
> gpinitsystem -c gpconfigs/gpinitsystem_config -h gpconfigs/hostfile_gpinitsystem

期间会提示,是否继续,输入y即可:

• 以上提示安装失败

• 查看日志,排查异常

[FATAL]:-Not on original master host Master, backout script exiting!
解决:不使用这个脚本清理中间数据,按照backout里面的步骤一个个删除。

• 经历过很多次失败,最后成功了,也忘记怎么过来的。可能是我在gpadmin和root之间频繁切换,要Source 环境变量,反正网上都可以搜到答案。

7. 使用数据库

7.1 psql 登录数据库

psql -d postgres

• 创建数据库

命令集参考文档如下:

https://gpdb.docs.pivotal.io/6-1/ref_guide/sql_commands/sql_ref.html
\q 退出
\l 显示数据库列表

7.2 允许外部登录

• navicat登录

结果报错,因为greenplum有权限控制,并不是所有的机器都可以连接到数据库。需要在pg_hba.conf文件增加客户端机器的权限。

• 先给gpadmin创建一个密码:

testdb=# alter role gpadmin with password 'gpadmin';
ALTER ROLE

• 在Linux,我们可以用命令快速查找一个文件:

[root@  ~]# find / -type f -name pg_hba.conf
/home/gpadmin/data/master/gpseg-1/pg_hba.conf

• 因为是POC,我开通全网可以直接访问全部数据库。

连接方式 连接的数据库 连接的用户  连接的主机IP  认证方式
host     all         gpadmin     192.168.0.0/16   trust

• 刷新

pg_ctl reload -D /home/gpadmin/data/master/gpseg-1

备注:官网说的 gpstop -u 可以刷新 postgresql.conf 和 pg_hba.conf 但不重启 Greenplum Database,其实是不行的,我一直改pg_hba.conf,一直报错。

• navicat登录

大功告成!

7.3 其他greenplum命令

• 关闭

> gpstop

• 启动

> gpstart

• 状态查看

> gpstate

• 其他

https://gpdb.docs.pivotal.io/6-1/utility_guide/ref/gpstate.html

关于作者

麦煜遥 (公众号:Entelodon):毕业于电子科技大学(成都) ,热衷IT技术,擅长数据分析。曾从事社保数据分析处理,IBM/AS400 DB2开发、数据分析,参保人员数据量月增千万级;曾于电脑OEM厂商,负责EDI(电子数据交换),电子订单秒级并发量万级。现于供职于风电行业,从事大数据分析。


关注微信公众号

VMware 中国研发中心