Greenplum_源代码编译安装和RPM包安装

2022-06-08 00:00:00 执行 代码 节点 安装 复制

背景

原来使用GP的场景是直接使用阿里云提供的HybridDB产品,所以没有亲自动手安装过。现在有一个在本地搭建测试环境的需求,所以就照猫画虎的做一遍,把过程记录下来。

CentOS 7 x64

Greenplum 5.8.0 RPM包安装(基于PostgreSQL 8.3.23)

Greenplum 6.0.0 源代码安装(基于PostgreSQL 9.2.0)

备注

  • 目前Greenplum已经开源,但是在网上不太容易找到已经编译后的新版本,所以我这次找了一个第三方编译的5.8.0的RPM包来进行安装。

  • 基于新源代码,我也进行了一次编译安装。

参考

Greenplum的安装

centos7 编译安装greenplum5.7

OS环境准备

本节所有操作都默认使用root用户在每一个节点上执行

GP生产环境一般是多个节点,如果是仅用于测试,也可以选择单节点模式。两种安装方式在操作流程上几乎没有区别。

系统准备

#### 安装过程中需要使用到的一些工具,dos2unix用来转换在Win环境编辑的配置文件
yum -y install unzip ntp dos2unix
复制代码

sysctl参数

#### 修改系统参数
vi /etc/sysctl.conf

# 修改下列配置,以下是小配置
kernel.shmmax = 500000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 500 1024000 200 4096
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
复制代码

limits参数

#### 修改文件打开数等限制
vi /etc/security/limits.conf

# 添加如下几行(注意*也需要添加)
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072

#### 
vi /etc/security/limits.d/90-nproc.conf

# 添加如下几行(注意*也需要添加)
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
复制代码

scheduler参数

#### 修改默认参数cfq为deadline
echo deadline > /sys/block/vda/queue/scheduler

#### 检查修改后的结果
more /sys/block/vda/queue/scheduler 
noop anticipatory [deadline] cfq 
复制代码

关闭防火墙

#### 关闭防火墙
chkconfig iptables off
service iptables stop
systemctl stop firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

#### 检查修改后的结果
sestatus
复制代码

允许root密码登录

#### 允许root密码登录并重启ssh
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin .*$/PermitRootLogin yes/' /etc/ssh/sshd_config
service sshd restart

#### 检查修改后的结果
grep ^PasswordAuthentication /etc/ssh/sshd_config
grep ^PermitRootLogin /etc/ssh/sshd_config
复制代码

主机hosts

#### 修改hosts
vi /etc/hosts

# 修改为如下内容(三个节点)
127.0.0.1       localhost
10.10.1.10      mdw
10.10.1.11      sdw1
10.10.1.12      sdw2

#### 修改主机名(在每个节点上分别使用各自的名称,这里仅用mdw为例)
sed -i 's/HOSTNAME=.*/HOSTNAME=mdw/' /etc/sysconfig/network | hostname mdw
复制代码

时钟同步

####
vi /etc/ntp.conf 

# 把下列内容改在行
server mdw
复制代码

安装数据库

本节所有操作都默认使用root用户在Master节点上执行

节点信息配置

安装过程中,GP需要两个文件提供节点信息

#### 
vi hostfile_exkeys 

# 包含Master和Segment
mdw
sdw1
sdw2

####
vi hostfile_segments 

# 只包含Segment
sdw1
sdw2
复制代码

安装Master

源代码编译安装

因为流程步骤比较多,所以我把这一部分内容放在了文章末尾的附录中。

RPM安装

#### RPM方式,默认安装到 /usr/local/greenplum-db/ (以root在master执行)
rpm -Uvh greenplum-db-5.8.0-rhel7-x86_64.rpm
复制代码

建立节点信任关系

#### 安装各个节点的过程中,需要打通master到各节点的免密码登录 (以root在master执行)
source /usr/local/greenplum-db/greenplum_path.sh
gpssh-exkeys -f hostfile_exkeys

# 在上面操作过程中要求输入节点root的密码
复制代码

安装各节点

#### 安装各个节点,并建立gpadmin用户(以root在master执行)
gpseginstall -f hostfile_exkeys -u gpadmin -p gpadmin
复制代码

创建数据文件夹

#### 创建数据文件夹 (以root在master执行)
# gpssh工具可以同时在多个机器上执行相同命令,和ansible功能类似
gpssh -f hostfile_exkeys 
=>
mkdir -p /data/gpdata/gpmaster
mkdir -p /data/gpdata/primary
mkdir -p /data/gpdata/mirror
chown -R gpadmin:gpadmin /data/gpdata
exit
复制代码

安装后检查

#### 
gpssh -f hostfile_exkeys -v -e 'ntpd'
gpcheck -f hostfile_exkeys -m mdw -s sdw1 -s sdw2
复制代码

初始化数据库

本节所有操作都默认使用gpadmin用户在Master节点上执行

环境变量

su - gpadmin

#### 修改环境变量
vi ~/.bash_profile

# 增加如下内容
export GPHOME=/usr/local/greenplum-db
export MASTER_DATA_DIRECTORY=/data/gpdata/gpmaster/gpseg-1
source ${GPHOME}/greenplum_path.sh

#### 重新载入环境变量
source ~/.bash_profile
复制代码

初始化数据库

#### 以gpinitsystem_config文件为模板
cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config ./gpinit_config

#### 配置gpinit_config
vi gpinit_config

# 修改如下配置,每个segment上1个数据文件夹,没有配置镜像
declare -a DATA_DIRECTORY=(/data/gpdata/primary)
MASTER_DIRECTORY=/data/gpdata/gpmaster
ENCODING=UTF8

#### 初始化
gpinitsystem -c gpinit_config -h hostfile_segments
复制代码

修改安全设置

#### 设置监听IP和Port
vi ${MASTER_DATA_DIRECTORY}/postgresql.conf

# 设置监听所有IP(这是一个非常宽松的限制,生产环境慎用)
listen_addresses = '*'
port = 5432

#### 设置数据库白名单
vi ${MASTER_DATA_DIRECTORY}/pg_hba.conf

# 增加如下一条记录,允许用户密码模式(这是一个非常宽松的限制,生产环境慎用)
host	all		all		0.0.0.0/0	md5
复制代码

启动停止命令

#### 启动,-a参数跳过用户确认步骤
${GPHOME}/bin/gpstart -a

#### 停止
${GPHOME}/bin/gpstop -a -M fast

#### 重新载入配置文件(不需要重启)
${GPHOME}/bin/gpstop -u
复制代码

访问数据库

命令行连接

#### 使用gpadmin用户作为超级用户登录
su - gpadmin
psql -p 5432 -d postgres
复制代码
# 查询当前版本
select * from version();

# 通过执行计划查看当前优化器类型
explain select 1;

# 打开/关闭GPORAC
set optimizer=on;
set optimizer=off;
复制代码

新建DB和USER

# 新建一个测试用用户
drop user if exists demo;
create user demo password 'demo';

# 新建一个测试用DB并分配给指定用户
drop database if exists demo;
create database demo owner=demo;

# 修改用户密码
alter user demo password 'xxx';

# 切换到新建用户
\connect demo demo mdw

# 新建Schema
drop schema if exists s01 cascade;
create schema s01;
set search_path to s01;
复制代码

创建只读用户

在GP下创建一个只读用户的流程是

  1. 建立用户
  2. 赋予给定DB的连接权限
  3. 赋予给定Schema的使用权限
  4. 赋予给定Table的访问权限

备注:因为我们想要控制,所以这里使用的是针对每一个表的显式授权。如果要求不那么严格,可以使用默认授权让新建的表自动获得访问权限。

# 新建一个测试用用户(gpadmin用户执行)
drop user if exists demoread;
create user demo password 'demo';

# 赋予、取消给定DB的连接权限(DB所有者执行,这里是demo用户执行)
grant connect on database demo to demoread;
revoke connect on database demo from demoread;

# Schema和Table的权限操作用下面语句生成,然后执行
# (DB所有者执行,这里是demo用户执行)
-- 构造对指定schema下所有表的grant、revoke语句
select 
	'grant usage on schema ' || pn.nspname || ' to ' || u.uname || ' ;' as schema_grant,
	'revoke usage on schema ' || pn.nspname || ' from ' || u.uname || ' ;' as schema_revoke,
	'grant select on ' || pn.nspname || '.' || pc.relname || ' to ' || u.uname || ' ;' as table_grant,
	'revoke select on ' || pn.nspname || '.' || pc.relname || ' from ' || u.uname || ' ;' as table_revoke
from pg_class pc, 
	pg_namespace pn, 
	(select 'demoread' as uname) as u -- 提供:给定被授权用户名
where pc.relnamespace = pn.oid
	and pc.relkind in ('r', 'v', 'S')
	and pn.nspname in ('s01','s02') -- 提供:授权schema
order by pn.nspname, pc.relname
;

复制代码

附录:源代码编译安装

根据官方安装手册指导进行操作。

编译准备工作

#### 获取源代码
git clone https://github.com/greenplum-db/gpdb.git

#### 获取指定版本
cd gpdb
git checkout xxxx

#### 安装CentOS依赖包
./README.CentOS.bash

# 这一步安装conan依赖包的过程中,有个pyparsing包失败,通过强制手工安装这个包进行了修复
pip install --ignore-installed pyparsing

#### 软连接cmake3
ln -sf /usr/bin/cmake3 /usr/local/bin/cmake

#### 配置动态链接库
vi /etc/ld.so.conf
# 内容如下
include ld.so.conf.d/*.conf
include /usr/local/lib
include /usr/local/lib64

#### 解决后面gporca版本不能识别的问题 configure: error: Your ORCA version is expected to be 2.XX.XXX
vi /etc/ld.so.conf.d/usrlocallib.conf
# 内容如下
/usr/local
/usr/local/lib
/usr/local/lib64

#### 刷新动态链接库缓存
ldconfig
复制代码

编译GPORCA

#### 安装手册执行
cd depends
./configure
make
make install_local
cd ..
复制代码

编译安装GPDB

# 设置编译环境,指定目标目录 /usr/local/greenplum-db
./configure --with-perl --with-python --with-libxml --with-gssapi --prefix=/usr/local/greenplum-db

# 编译和安装
make -j8
make -j8 install

相关文章