GreenPlum
安装详细步骤
1
、环境准备
1、
CentOS7.2
2
、
greenplum-db-4.3.9.1-build-1-rhel5-x86_64.bin
此文件为
GreenPlum
(
以下简称为
gp
)的安装文件,由于此文件需从国外官网下载比较费劲,所以一并附在压缩包中。
3
、以下步骤若未说明均在
root
用户下进行操作
2
、配置系统信息
1.gp
集群介绍
本次
gp集群安装使用了
4台机器,其中
1台为
master,
3台为
segment,
ip为
7.7.8.151 7.7.8.152 7.7.8.153 7.7.8.154
其中
7.7.8.151为
master 其余为
segment。
- 修改/etc/sysconfig/network-scripts/ifconfig-eth0文件(所有机器均需修改)
修改机器的
ip、子网掩码、
dns等等
- 修改/etc/hosts文件(所有机器均需修改)
此处主要是为之后
gp集群之间的相互通信做准备
(注意:一定要按照此格式书写,其中第三块的意思是为了与后面所用到的配置文件相匹配)
- 修改/etc/hostname文件与/etc/sysconfig/network文件(所有机器均需修改)
hostname为主机名,根据个人情况定,本次四台机器分别为
mdw、
sdw1、
sdw2、
sdw3
- 重启网络并测试(所有机器均重启并测试)
重启网络:
service network restart
用主机名来测试各主机是否能
ping通
- 创建用户和用户组(所有机器均需修改)
创建用户组:
groupadd -g 530 sdzw
创建用户:
useradd -g 530 -u530 -m -d /home/sdzw -s /bin/bash sdzw
为用户
sdzw设置密码:
passwd sdzw
- 修改文件/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 -p 使其生效
- 修改文件/etc/security/limits.conf(所有机器均需修改)
在文件末尾追加以下内容,注意不要漏掉
*号
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
- 关闭防火墙及selinux(所有机器均需修改)
停止防火墙
systemctl stop firewalld.service
禁止防火墙
systemctl disable firewalld.service
修改
selinux配置文件如下图黄色字体所示
3
、安装
GreenPlum
1.
创建安装文件目录(所有机器)
创建目录:
mkdir /sdzw/greenplum
给
sdzw用户修改文件夹权限
chown -R sdzw:sdzw /sdzw/greenplum
之后把安装包
greenplum-db-4.3.9.1-build-1-rhel5-x86_64.bin放于
/opt/greenplum当中
2.
安装
gp
(只需在
master
主机上)
1.首先给文件赋权:
chmod +x
greenplum-db-4.3.9.1-build-1-rhel5-x86_64.bin
2.
执行安装:
./greenplum-db-4.3.9.1-build-1-rhel5-x86_64.bin
(安装期间需要手动输入安装目录
/opt/greenplum/greenplum-db-4.3.9.1否则会默认安装到
/usr/local下,且需手动输入几次
yes)
3.完成后即安装成功,此时
master上的
gp已经安装成功。但它是以
root身份安装的,所以修改下文件夹的用户
chown -R sdzw:sdzw /sdzw/greenplum
3.
创建配置文件(以
sdzw
用户只需在
master
主机上)
- 首先以sdzw用户登陆 su sdzw
- 创建文件夹 cd /sdzw mkdir conf
- 在/sdzw/conf下创建2个文件hostlist 和seg_hosts,内容如下图所示
4.
打通所有结点(以
sdzw
用户只需在
master
主机上)
执行以下两条命令:
source /sdzw/greenplum/greenplum-db/greenplum_path.sh
gpssh-exkeys -f /sdzw/conf/hostlist
当看到
completed successfully 说明成功打通
然后执行
gpssh -f /home/sdzw/conf/hostlist 进行测试会提示
Note: command history unsupported on this machine ...
=>
输入
pwd会显示
[sdw1] /home/sdzw
[sdw3] /home/sdzw
[sdw2] /home/sdzw
[ mdw] /home/sdzw
=>
输入
exit退出
5.
将安装包分发到每个节点上(以
sdzw
用户只需在
master
主机上)
cd /sdzw/greenplum/
tar -cf gp.4.3.tar greenplum-db-4.3.9.1/
然后利用
gpscp命令将这个文件复制到每一台机器上:
gpscp -f /sdzw/conf/hostlist gp.4.3.tar =:/sdzw/greenplum/
ok,如果没有意外,就批量复制成功了,可以去子节点的相应文件夹查看,之后要将
tar包解压,我们使用批量操作
[sdzw@mdw conf]$
gpssh -f /sdzw/conf/hostlist
=>
cd /sdzw/greenplum
[sdw3]
[sdw1]
[sdw2]
[mdw]
=>
tar -xf gp.4.3.tar
[sdw3]
[sdw1]
[sdw2]
[mdw]
建立软链接
=>
ln -s ./greenplum-db-4.3.9.1 greenplum-db
[sdw3]
[sdw1]
[sdw2]
[mdw]
=>
ll
(可以使用
ll查看一下是否已经安装成功
)
这样,就完成了所有几点的安装,接下来初始化数据库
6.
初始化数据库(以
sdzw
用户只需在
master
主机上)
[sdzw@mdw conf]$
gpssh -f /sdzw/conf/hostlist
=> cd /sdzw
=> mkdir gpdata
[sdw3]
[ mdw]
[sdw2]
[sdw1]
=> cd gpdata
[sdw3]
[ mdw]
[sdw2]
[sdw1]
=> mkdir gpmaster gpdatap1 gpdatap2 gpdatam1 gpdatam2
[sdw3]
[ mdw]
[sdw2]
[sdw1]
=> ll
[sdw3] 总用量
20
[sdw3] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam1
[sdw3] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam2
[sdw3] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap1
[sdw3] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap2
[sdw3] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpmaster
[ mdw] 总用量
20
[ mdw] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam1
[ mdw] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam2
[ mdw] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap1
[ mdw] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap2
[ mdw] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpmaster
[sdw2] 总用量
20
[sdw2] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam1
[sdw2] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam2
[sdw2] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap1
[sdw2] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap2
[sdw2] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpmaster
[sdw1] 总用量
20
[sdw1] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam1
[sdw1] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatam2
[sdw1] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap1
[sdw1] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpdatap2
[sdw1] drwxrwxr-x 2 sdzw sdzw 4096 7月
18 19:46 gpmaster
=> exit
7.
配置
.bash_profile
环境变量(以
sdzw
用户在每台机器上)
[sdzw@mdw ~]$ cd
[sdzw@mdw ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
source /sdzw/greenplum/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/sdzw/gpdata/gpmaster/gpseg-1
export PGPORT=5432
export PGDATABASE=gpdb
其实就是加上最后四行,然后
source .bash_profile让环境变量生效
,如果后期出现了新窗口中
greenplum的命令找不到的情况,
就是
(
source /sdzw/greenplum/greenplum-db/greenplum_path.sh)
这一句没成功实现开机执行,再加到环境变量里
如
.bashrc
- 初始化配置文件(以sdzw用户只需在master机器上)
[sdzw@mdw ~]$ cat /sdzw/conf/gpinitsystem_config
ARRAY_NAME="Greenplum"
SEG_PREFIX=gpseg
PORT_BASE=33000
declare -a DATA_DIRECTORY=(/sdzw/gpdata/gpdatap1 /sdzw/gpdata/gpdatap2)
MASTER_HOSTNAME=mdw
MASTER_DIRECTORY=/sdzw/gpdata/gpmaster
MASTER_PORT=5432
TRUSTED_SHELL=/usr/bin/ssh
MIRROR_PORT_BASE=43000
REPLICATION_PORT_BASE=34000
MIRROR_REPLICATION_PORT_BASE=44000
declare -a MIRROR_DATA_DIRECTORY=(/sdzw/gpdata/gpdatam1 /sdzw/gpdata/gpdatam2)
MACHINE_LIST_FILE=/sdzw/conf/seg_hosts
9.
初始化数据库(以
sdzw
用户只需在
master
机器上)
gpinitsystem -c /sdzw/conf/gpinitsystem_config -s sdw7
其中
sdw3是指
master的
standby(备份)所在的节点,我看书上和网上的一些资料都将
standby放在最后一个节点,可能是约定俗成的吧。
如果上面有一些配置有问题,
gpinitsystem就不能成功,日志在主节点
/home/sdzw/sdzwLogs/的
gpinitsystem_2016XXXX.log文件中。
需要注意的是如果初始化失败,一定要认真查看这个日志文件,一味重复安装没有太大意义,重要的是要找到主要原因。
4
、测试
到此为止
gp安装所有工作已完成,接下来进行个简单的测试
sdzw 用户
psql -p 5433 -d pgDB 集群
Postgres 用户
psql -p 5432 -d postgres 单个数据库
重启
服务重启
systemctl restart postgresql-9.4
5
、
GreenPlum Common Center
监控工具
安装
GPCC
GreenPlum官方提供了一套可视化的监控工具,名为
GreenPlum Common Center(以下简称
GPCC),使用此工具可以以图形方式将各种性能指标以图形方式展现出来,接下来介绍如何安装。
- 创建监控数据库,数据库名为gpperfmon,并打开gp_enable_gpperfmon参数,并创建gpmon用户并设置用户密码。
$ createdb gpperfmon
$ createuser gpmon
ALTER USER gpmon WITH PASSWORD ‘gpmon’;
$ gpperfmon_install --enable --password gpmon --port 5432
$ gpstop -r 重启数据库使以上设置生效
- 确认监控采集进程是否已经启动
$ ps -ef | grep gpmmon
$ psql -d gpperfmon -c ‘select * from system_now’
- 安装GPCC
切换到
root用户
把
pg_hba.conf 中
local all all ident 改为
local all all trust
# chmod +x greenplum-cc-web-2.0-build-32-RHEL5.x86_64.bin
# ./chmod +x greenplum-cc-web-2.0-build-32-RHEL5.x86_64.bin
安装时输入安装目录。
安装完后赋权并使环境变量生效
# chown -R gpadmin:gpadmin greenplum-4.3.3/
# chown -R gpadmin:gpadmin greenplum-cc-web
# source /home/greenplum-4.3-cc/gpcc_path.sh
安装配置
# gpcmdr --setup
安装完后
gpcmdr --start gpcc 启动
浏览
http://mdw:28080 用户名和密码均为刚刚设置的
gpmon
分区表的创建
1.自动日期分区
CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( START (date '2008-01-01') INCLUSIVE
END (date '2009-01-01') EXCLUSIVE
EVERY (INTERVAL '1 day') );
创建按月分区
CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( PARTITION Jan08 START (date '2008-01-01') INCLUSIVE ,
PARTITION Feb08 START (date '2008-02-01') INCLUSIVE ,
PARTITION Mar08 START (date '2008-03-01') INCLUSIVE ,
PARTITION Apr08 START (date '2008-04-01') INCLUSIVE ,
PARTITION May08 START (date '2008-05-01') INCLUSIVE ,
PARTITION Jun08 START (date '2008-06-01') INCLUSIVE ,
PARTITION Jul08 START (date '2008-07-01') INCLUSIVE ,
PARTITION Aug08 START (date '2008-08-01') INCLUSIVE ,
PARTITION Sep08 START (date '2008-09-01') INCLUSIVE ,
PARTITION Oct08 START (date '2008-10-01') INCLUSIVE ,
PARTITION Nov08 START (date '2008-11-01') INCLUSIVE ,
PARTITION Dec08 START (date '2008-12-01') INCLUSIVE
END (date '2009-01-01') EXCLUSIVE );
按年分区
CREATE TABLE rank (id int, rank int, year int, gender char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
( START (2001) END (2008) EVERY (1),
DEFAULT PARTITION extra );
列表分区,以性别做分区依据列,男女共两个分区
CREATE TABLE rank (id int, rank int, year int, gender char(1), count int )
DISTRIBUTED BY (id)
PARTITION BY LIST (gender)
( PARTITION girls VALUES ('F'),
PARTITION boys VALUES ('M'),
DEFAULT PARTITION other );
范围,列表,时间分区
CREATE TABLE sales (trans_id int, date date, amount decimal(9,2), region text)
DISTRIBUTED BY (trans_id)
PARTITION BY RANGE (date)
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE
( SUBPARTITION usa VALUES ('usa'),
SUBPARTITION asia VALUES ('asia'),
SUBPARTITION europe VALUES ('europe'),
DEFAULT SUBPARTITION other_regions)
START (date '2008-01-01') INCLUSIVE
END (date '2009-01-01') EXCLUSIVE
EVERY (INTERVAL '1 month'),
DEFAULT PARTITION outlying_dates );
年,月,时间,列表分区
CREATE TABLE sales (id int, year int, month int, day int, region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
SUBPARTITION BY RANGE (month)
SUBPARTITION TEMPLATE (
START (1) END (13) EVERY (1),
DEFAULT SUBPARTITION other_months )
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE (
SUBPARTITION usa VALUES ('usa'),
SUBPARTITION europe VALUES ('europe'),
SUBPARTITION asia VALUES ('asia'),
DEFAULT SUBPARTITION other_regions )
( START (2002) END (2010) EVERY (1),
DEFAULT PARTITION outlying_years );
增加表分区
ALTER TABLE sales ADD PARTITION
START (date '2009-02-01') INCLUSIVE
END (date '2009-03-01') EXCLUSIVE;
增加子分区
ALTER TABLE sales ADD PARTITION
START (date '2009-02-01') INCLUSIVE
END (date '2009-03-01') EXCLUSIVE
( SUBPARTITION usa VALUES ('usa'),
SUBPARTITION asia VALUES ('asia'),
SUBPARTITION europe VALUES ('europe') );
1) Greenplum 通过外部表的方式让所有 segment 同时连接到一组外部服务 gpfdist, 同时拉取数据
2) gpfdist 随机分发数据给所有 segment.
3) segment拿到数据后先解析它,根据表的分发规则收下属于自己的数据,把不属于自己的数据再分发给所属的segment.
整个过程充分利用了网络和各 segment 的硬件资源,效率极高.
demo:
1) 在文件服务器上启动gpfdist服务,端口号8080,指定文本文件所在目录
./gpfdist -d /u01/gp001/dss-data/ -p 8080 -l /u01/gp001/loadlog.log
2) 连接Greenplum master节点,创建外部表
CREATE EXTERNAL TABLE LINEITEM_LOAD (
L_ORDERKEY INTEGER ,
L_PARTKEY INTEGER ,
L_SUPPKEY INTEGER ,
L_LINENUMBER INTEGER,
L_QUANTITY DECIMAL,
L_EXTENDEDPRICE DECIMAL,
L_DISCOUNT DECIMAL,
L_TAX DECIMAL,
L_RETURNFLAG CHAR(1),
L_LINESTATUS CHAR(1),
L_SHIPDATE DATE,
L_COMMITDATE DATE,
L_RECEIPTDATE DATE,
L_SHIPINSTRUCT CHAR(25),
L_SHIPMODE CHAR(10),
L_COMMENT VARCHAR(44)
) LOCATION ('gpfdist://1192.168.1.1:8080/lineitem.csv')
FORMAT 'CSV' (DELIMITER '|');
关键信息:
1. 指定了外部数据源是刚才启动的gpfdist服务,并指定了需要导入的文本文件名
2 文本的根式是CSV,列之间用 | 分隔.
3) 按照需求创建表,数据会导入到这个表中
CREATE TABLE LINEITEM (
L_ORDERKEY ,
L_PARTKEY ,
L_SUPPKEY ,
L_LINENUMBER INTEGER,
L_QUANTITY DECIMAL,
L_EXTENDEDPRICE DECIMAL,
L_DISCOUNT DECIMAL,
L_TAX DECIMAL,
L_RETURNFLAG CHAR(1),
L_LINESTATUS CHAR(1),
L_SHIPDATE DATE,
L_COMMITDATE DATE,
L_RECEIPTDATE DATE,
L_SHIPINSTRUCT CHAR(25),
L_SHIPMODE CHAR(10),
L_COMMENT VARCHAR(44)
) with (OIDS=false) DISTRIBUTED BY (l_orderkey, l_linenumber);
4) 通过外部数据源把数据导入到 Greenplum 中
insert into lineitem select * from lineitem_load;
5) 通过执行计划,可以理解他是工作原理, 整个过程 master 节点不会处理数据,都由 segment完成.
explain insert into lineitem select * from lineitem_load;
QUERY PLAN
-----------------------------------------------------------------------------------------------------
Insert (slice0; segments: 16) (rows=62500 width=426)
-> Redistribute Motion 16:16 (slice1; segments: 16) (cost=0.00..18500.00 rows=62500 width=426)
Hash Key: l_orderkey, lineitem_load.l_linenumber
-> External Scan on lineitem_load (cost=0.00..18500.00 rows=62500 width=426)
Settings: effective_cache_size=1GB
(5 rows)
清理连接
postgresql9.1之后
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection!
pid <> pg_backend_pid()
-- don't kill the connections to other databases
AND
datname =
'database_name'
;
If you're using Postgres 8.4-9.1 use procpid instead of pid
SELECT
pg_terminate_backend(procpid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection!
procpid <> pg_backend_pid()
-- don't kill the connections to other databases
AND
datname =
'database_name'
;
查看活跃连接
select * from pg_stat_activity