集群介绍
名称 | 版本 |
---|---|
操作系统 | centos 7.x 64bit |
greenplum | greenplum-db-5.27.1-rhel7-x86_64 |
准备3台PC安装CentOS 7,这3台机器的用户名以及对应的IP
IP地址 | 用户名 | 主从 |
---|---|---|
192.168.3.208 | master | 主机 |
192.168.3.209 | slave1 | 从机 |
192.168.3.210 | slave2 | 从机 |
安装环境准备
修改hostname
在IP地址为192.168.3.208的服务器上执行:
hostnamectl set-hostname master
在IP地址为192.168.3.209的服务器上执行:
hostnamectl set-hostname slave1
在IP地址为192.168.3.210的服务器上执行:
hostnamectl set-hostname slave2
修改master的/etc/hosts文件,如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.3.208 master
192.168.3.209 slave1
192.168.3.210 slave2
将修改后的/hosts文件分发给slave1和slave2
scp /etc/hosts slave1:/etc/hosts
scp /etc/hosts slave2:/etc/hosts
设置完成后每台虚拟机都需要重启,重启生效。
配置完成后使用ping命令检查这3个机器是否相互ping得通,以master为例,在执行命令:
ping -c 3 slave1
ping -c 3 slave2
依次修改各个节点/etc/sysconfig/network文件
同时修改各个子节点和主节点 /etc/sysconfig/network这个文件如下(这个不同节点配置不一样,无法复制,所有机器都要修改)
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=maste
修改系统内核/etc/sysctl.conf文件
vi /etc/sysctl.conf
kernel.shmmni = 4096
kernel.shmall = 4000000000
# 在虚拟级上的配置
# kernel.sem = 250 512000 100 2048
# 在正式服务器上的配置,信号量不足会引起初始化失败。
kernel.sem = 50100 128256000 50100 2560
# 使能sysq功能
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.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.defalut.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
### 测试环境要取消这个,否则oracle启不来 ### 值为1
vm.overcommit_memory = 2
最后让配置生效:
sysctl -p
修改进程数
修改/etc/security/limits.d/20-nproc.conf文件
vi /etc/security/limits.d/20-nproc.conf
* soft nproc 131072
root soft nproc unlimited
⚠️注意:XX-nproc.conf文件的20可能会变,例如90-nproc.conf之类的。
修改/etc/selinux/config文件
vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
复制主节点配置到子节点
依次复制到各个子节点:
scp /etc/sysctl.conf slave1:/etc
scp /etc/security/limits.d/20-nproc.conf slave1:/etc/security/limits.d
scp /etc/selinux/config slave1:/etc/selinux
scp /etc/sysctl.conf slave2:/etc
scp /etc/security/limits.d/20-nproc.conf slave2:/etc/security/limits.d
scp /etc/selinux/config slave2:/etc/selinux
⚠️注意:XX-nproc.conf文件的20可能会变,例如90-nproc.conf之类的。
创建gpadmin用户(所有节点)
groupadd -g 530 gpadmin
useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin
chown -R gpadmin:gpadmin /home/gpadmin
echo "gpadmin" | passwd --stdin gpadmin
关闭防火墙
关闭防火墙 :
systemctl stop firewalld.service
关闭 开机自启动防火墙:
systemctl disable firewalld.service
安装Greenplum DB
在Master节点上安装Greenplum DB
安装包是rpm格式的执行rpm安装命令:
rpm -ivh greenplum-db-5.27.1-rhel7-x86_64.rpm
默认的安装路径是/usr/local,然后需要修改该路径gpadmin操作权限:
chown -R gpadmin:gpadmin /usr/local/greenplum-db-5.27.1
创建配置集群hostlist文件,打通节点
创建一个hostlist,包含所有节点主机名:
su - gpadmin
mkdir -p /home/gpadmin/conf
vi /home/gpadmin/conf/hostlist
master
slave1
slave2
创建一个 seg_hosts ,包含所有的Segment Host的主机名:
vi /home/gpadmin/conf/seg_hosts
slave1
slave2
配置ssh免密连接:
su - gpadmin
source /usr/local/greenplum-db/greenplum_path.sh
gpssh-exkeys -f /home/gpadmin/conf/hostlist
[STEP 1 of 5] create local ID and authorize on local host
... /home/gpadmin/.ssh/id_rsa file exists ... key generation skipped
[STEP 2 of 5] keyscan all hosts and update known_hosts file
[STEP 3 of 5] authorize current user on remote hosts
... send to slave1
... send to slave2
#提示:这里提示输入各个子节点gpadmin用户密码
[STEP 4 of 5] determine common authentication file content
[STEP 5 of 5] copy authentication files to all remote hosts
... finished key exchange with slave1
... finished key exchange with slave2
[INFO] completed successfully
测试免密连接是否成功:
[root@gp-master ~]# ssh slave1 #不需要密码即可登录;
或者:
gpssh -f /home/gpadmin/conf/hostlist
=> pwd
[slave1] /home/gpadmin
[slave2] /home/gpadmin
[master] /home/gpadmin
=> exit
出现上面结果就是成功了。
在Segment节点上安装Greenplum DB
在各个子节点进行文件夹赋权:
chown -R gpadmin:gpadmin /usr/local/greenplum-db-5.27.1
chown -R gpadmin:gpadmin /home/gpadmin
在主节点打包安装包并复制到各个子节点:
cd /usr/local/
打包:
tar -cf gp.tar greenplum-db-5.27.1/
gpscp -f /home/gpadmin/conf/seg_hosts gp.tar =:/usr/local/
ok,如果没有意外,就批量复制成功了,可以去子节点的相应文件夹查看,之后要将tar包解压,现在我们将采用对子节点使用批量解压操作:
source /usr/local/greenplum-db/greenplum_path.sh
gpssh -f /home/gpadmin/conf/seg_hosts #统一处理子节点
=> cd /usr/local
[slave1]
[slave2]
=> tar -xf gp.tar
[slave1]
[slave2]
#建立软链接
=> ln -s ./greenplum-db-5.27.1 greenplum-db
[slave1]
[slave2]
=> ll(可以使用ll查看一下是否已经安装成功)
=>exit(退出)
这样就完成了所有节点的安装。
初始化数据库
创建资源目录
source /usr/local/greenplum-db/greenplum_path.sh
gpssh -f /home/gpadmin/conf/hostlist #统一处理所有节点
#创建资源目录 /home/gpadmin/greenplum/data下一系列目录(生产目录个数可根据需求生成)
mkdir -p /home/gpadmin/greenplum/data/master
mkdir -p /home/gpadmin/greenplum/data/primary
mkdir -p /home/gpadmin/greenplum/data/mirror
mkdir -p /home/gpadmin/greenplum/data2/primary
mkdir -p /home/gpadmin/greenplum/data2/mirror
环境变量配置
在主节点进行环境变量配置
vi /home/gpadmin/.bash_profile 在最后添加
source /usr/local/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/home/gpadmin/greenplum/data/master/gpseg-1
export GPPORT=5432
export PGDATABASE=gp_sydb
然后依次复制到各个子节点:
scp /home/gpadmin/.bash_profile slave1:/home/gpadmin/
。。。
让环境变量生效:
source .bash_profile
初始化前检查连通性
检查节点与节点之间文件读取;
cd /usr/local/greenplum-db/bin
gpcheckperf -f /home/gpadmin/conf/hostlist -r N -d /tmp
-------------------
-- NETPERF TEST
-------------------
====================
== RESULT
====================
Netperf bisection bandwidth test
master -> slave1 = 72.220000
slave1 -> slave2 = 21.470000
slave2 -> master = 43.510000
Summary:
sum = 181.40 MB/sec
min = 21.47 MB/sec
max = 72.22 MB/sec
avg = 45.35 MB/sec
median = 44.20 MB/sec
出现以上内容证明各个节点已经可以连通。
执行初始化
初始化 Greenplum 配置文件模板都在/usr/local/greenplum-db/docs/cli_help/gpconfigs目录下,gpinitsystem_config是初始化 Greenplum 的模板,此模板中 Mirror Segment的配置都被注释;创建一个副本,对其以下配置进行修改:
cd /usr/local/greenplum-db/docs/cli_help/gpconfigs
cp gpinitsystem_config initgp_config
vi initgp_config
#以下为文本要修改的属性字段配置
#资源目录为创建的资源目录,配置几次资源目录就是每个子节点有几个实例(推荐4-8个,这里配置了6个,primary与mirror文件夹个数对应)
declare -a DATA_DIRECTORY=(/home/gpadmin/greenplum/data/primary /home/gpadmin/greenplum/data/primary /home/gpadmin/greenplum/data/primary /home/gpadmin/greenplum/data2/primary /home/gpadmin/greenplum/data2/primary /home/gpadmin/greenplum/data2/primary)
declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/greenplum/data/mirror /home/gpadmin/greenplum/data/mirror /home/gpadmin/greenplum/data/mirror /home/gpadmin/greenplum/data2/mirror /home/gpadmin/greenplum/data2/mirror /home/gpadmin/greenplum/data2/mirror)
# 配置的初始化数据库名称
ARRAY_NAME="gp_sydb"
# 主节点名称
MASTER_HOSTNAME=master
# 资源目录为之前创建的资源目录
MASTER_DIRECTORY=/home/gpadmin/greenplum/data/master
# 与之前配置一样
# MASTER_DATA_DIRECTORY=/opt/greenplum/data/master/gpseg-1
# 配置的初始化数据库名称
DATABASE_NAME=gp_sydb
# 就是之前创建的文件
MACHINE_LIST_FILE=/home/gpadmin/conf/seg_hosts
执行初始化;
gpinitsystem -c initgp_config -S
若初始化失败,需要删除/home/gpadmin下的数据资源目录重新初始化;
若初始化成功,那恭喜你已经安装成功了。
数据库操作
停止和启动集群
gpstop -M fast
gpstart -a
登录数据库
$ psql -d postgres #进入某个数据库
postgres=# \l # 查询数据库
List of databases
Name | Owner | Encoding | Access privileges
-----------+---------+----------+---------------------
gp_sydb | gpadmin | UTF8 |
postgres | gpadmin | UTF8 |
template0 | gpadmin | UTF8 | =c/gpadmin : gpadmin=CTc/gpadmin
template1 | gpadmin | UTF8 | =c/gpadmin : gpadmin=CTc/gpadmin
(4 rows)
postgres=# \i test.sql #执行sql
postgres=# copy 表名 to '/tmp/1.csv' with 'csv'; #快速导出单表数据
postgres=# copy 表名 from '/tmp/1.csv' with 'csv'; #快速导入单表数据
postgres=# \q #退出数据库
\password 设置密码
\q 退出
\h 查看SQL命令的解释,比如\h select
\? 查看psql命令列表
\l 列出所有数据库
\c [database_name] 连接其他数据库
\d 列出当前数据库的所有表格
\d [table_name] 列出某一张表格的结构
\x 对数据做展开操作
\du 列出所有用户
设置密码和远程访问
首先为gpadmin用户创建密码
$ psql -d postgres # 进入某个数据库
# 首先为gpadmin用户创建密码
alter role gpadmin with password 'gpadmin';
接着在$MASTER_DATA_DIRECTORY//pg_hba.conf文件中增加(/opt/greenplum/data/master/gpseg-1/pg_hba.conf):
host all gpadmin 192.168.154.1/32 md5(需要远程连接数据库的机器的ip)
重新加载配置文件
gpstop -u
在其他机器上登录数据库
gpsql -h 192.168.3.208 -p 5432 -d postgres -u gpadmin
创建新用户
创建新用户 create role dbdream(用户名) password 'dbdream'(密码) createdb login(用户权限);
集群状态
# 查看mirror的状态
gpstate -e
# 查看standby master的状态
gpstate -f
# 查看整个GP群集的状态
gpstate -s
# 查看GP的版本
gpstate -i
# 帮助文档,可以查看gpstate更多用法
gpstate --help
目前为止数据库已经操作完毕。默认只有本地可以连数据库,如果需要别的I可以连,需要修改gp_hba.conf文件,具体这里不再赘述。
greenplum的hadoop环境配置
说明:安装greenplum后,建外部表如果需要读取HDFS文件的话,需要进行该配置。
1、(所有子节点)解压tar -zxvf hadoop-2.6.0-cdh5.8.0.tar.gz 至/home/hadoop/yarn/hadoop-2.6.0-cdh5.8.0/
2、(所有子节点)解压hadoop依赖的jdk tar -zxvf jdk-7u75-linux-x64.tar.gz 至/usr/java/jdk1.7.0_75
3、(所有子节点)修改gpadmin用户参数
vi /home/gpadmin/.bash_profile
在配置文件添加
export JAVA_HOME=/usr/java/jdk1.7.0_75
export CLASSPATH=$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/home/hadoop/yarn/hadoop-2.6.0-cdh5.8.0
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH
4、(只在master节点执行)配置hadoop版本信息及路径信息
gpconfig -c gp_hadoop_target_version -v "cdh5"
gpconfig -c gp_hadoop_home -v "/home/hadoop/yarn/hadoop-2.6.0-cdh5.8.0"
5、重启gp
常用语句
查看表结构:
select
a.attname 字段名,
pg_catalog.format_type(a.atttypid, a.atttypmod) as 类型
from pg_catalog.pg_attribute a,pg_catalog.pg_class c, pg_catalog.pg_namespace n
where a.attrelid=c.oid
and a.attnum>0 AND NOT a.attisdropped
and n.oid = c.relnamespace
and n.nspname='public'
and c.relname='employees'
order by a.attnum
gpfdist组件使用
启动命令:
nohup /usr/local/greenplum-db-5.27.1/bin/gpfdist -d /home/gpadmin/ -p 8090 > /home/gpadmin/gpfdist.log &
另外一种写法:
gpfdist -d /u01 -p 5555 -l /tmp/gpfdist.log &
参数解释:
-d 数据文件所放的目录
-p 设置访问gpfdist端口,这个可以根据实际情况写。
-l 设置日志文件所放的目录,这个参数也可以不用填写。
& 必须要写。
查看gpfdist是否开启:
ps -ef|grep pfdist
查看启动日志:
more /home/gpadmin/gpfdist.log
建立外部表:
create external table 外部表名(
列名1 数据类型,
列名2 数据类型...
)
LOCATION(
'gpfdist://服务器IP:gpfdist服务的端口/数据源文件'
)
FORMAT '数据源模式' (HEADER DELEMITER AS ',')
log errors into err.test_csv encoding 'utf-8';
注意:
外部表的数据定义不能有约束条件如not null ,default 等。
HEADER 表示csv文件的第一行定义了数据的数据类型
DELIMITER ‘,’ 表示用,分隔数据
NULL as ‘’ 表示’'为空值
encoding ‘utf-8’ 表示用utf-8编码
进入psql:
psql -d postgres
建立外部表:
create external table public.employees1 (
emp_no int,
birth_date date,
first_name varchar(14),
last_name varchar(16),
gender varchar(10),
hire_date date,
update_time timestamp,
create_time timestamp)
location (
'gpfdist://192.168.154.208:8090/gpextdata/employees.csv'
)
Format 'CSV' (header)
encoding 'GBK'
SEGMENT REJECT LIMIT 10000
;
create external table public.test (
emp_no int,
birth_date date)
location (
'gpfdist://192.168.154.208:8090/gpextdata/employees.csv'
)
Format 'CSV' (header)
encoding 'SQL_ASCII';
drop external table public.test;
insert into 导入数据
=# insert into 需要导入到的表名 select * from 外部表名
delete public.employees em where exist (select 1 from public.employees1 wem where wem.id = em.id);
insert into public.employees select * from public.employees1;
假如出现:
ERROR: date/time field value out of range: "26/6/1986" (seg1 slice1 192.168.154.209:6001 pid=3531)
DETAIL: External table employees1, line 2 of gpfdist://192.168.154.208:8090/gpextdata/employees.csv, column hire_date
是因为CSV时间格式是:DMY格式的。需要设置:
SET DateStyle="ISO,DMY";
SET DateStyle="DMY";
MDY格式的需要设置:
set lc_time to 'en_AU'
导入完成后将设置更改回去:
SET DateStyle=default;
删除外部表:
drop external table public.employees1;