# GreenPlum入门
# GreenPlum简介
以下资料来源于 https://blog.csdn.net/qq_22473611/article/details/123927398
是业界最快最高性价比的关系型分布式数据库,它在开源的PostgreSQL的基础上采用MPP架构(Massive Parallel Processing,海量并行处理),具有强大的大规模数据分析任务处理能力
# 特点
- 完善的标准:GreenPlum数据库支持ANSI SQL 2008和SQL OLAP 2003扩展;支持ODBC和JDBC应用编程接口。完善的标准支持使得系统开发、维护和管理都大为方便。(而现在的 NoSQL和Hadoop 对 SQL 的支持都不完善,不同的系统需要单独开发和管理,且移植性不好)
- 数据的强一致性:GreenPlum数据库支持分布式事务,支持ACID,保证数据库中数据的强一致性。
- 良好的线性扩展能力:GreenPlum数据库采用MPP架构,其基本特征是有多台SMP(Symmetric Multi-Processor,对称多处理器)服务器通过节点互联网络连接而成,是一种 Share Nothing(完全无共享)结构,因而扩展能力最强,理论上可以无限扩展。目前的技术可以实现512个节点互联,包含数千个CPU。
- 标准SQL接口,比MapReduce接入更方便
- 完整的分布式事务能力,确保强数据一致性
- 近乎线性的在线扩展能力
- 高并发数据加载技术
- 高灵活的行、列以及混合存储及压缩技术
- 高可用技术方案
- 支持多方式的授权管理及审计,表级别粒度
# GreenPlum数据库 VS 传统数据库
使用传统数据库时,我们经常会通过分库分表的方式将数据打散到多个数据库实例中。
其缺点在于可能会出现不平均的情况:数据在后端被打散成许多数据分片,但是有些分片的数据量很大,热度很高,有些分片相对来说热度较低。
当进行数据统计或分析时,一部分用户数据处理速度慢,一部分用户数据处理速度快,使得许多用户的体验下降。
在GreenPlum数据库中、我们怎么做的呢
GreenPlum数据库采用分而治之的方法,将数据非常均衡的分布在所有节点上。而且当服务器数量不够或者计算能力不够的时候,可以在线横向扩展,此时数据库会重新做二次分片,也就是表数据需要重新分布,在保证强大处理能力的同时也时刻保持用户性能的均衡,提升用户体验。
1
2
3
4
5
6
2
3
4
5
6
# GreenPlum 适用场景
GreenPlum 虽然是关系型数据库产品,它的特点主要就是查询速度快,数据装载速度快,批量DML处理快。而且性能可以随着硬件的添加,呈线性增加,拥有非常良好的可扩展性。因此,它主要适用于面向分析的应用。比如构建企业级ODS/EDW,或者数据集市等等。
1
# 常用指令
-- 取端口号:
select * from gp_segment_configuration;
-- 该表能查看到当前数据库连接的IP 地址,用户名,提交的查询等
select * from pg_stat_activity;
-- 查看数据库占用空间
select pg_size_pretty(pg_relation_size('schema.tablename'));
-- 查看表占用空间
select pg_size_pretty(pg_database_size('databasename'));
-- 回收垃圾和收集统计信息
Vacuum analyze tablename
-- 查看数据分布情况
Select gp_segment_id,count(*) from 'tablename' group by 1;
-- 实例恢复
gp_segment_configuration;
-- relname: 表名 locktype、mode 标识了锁的类型
SELECT locktype, database, c.relname, l.relation, l.transactionid, l.transaction, l.pid, l.mode, l.granted, a.current_query FROM pg_locks l, pg_class c, pg_stat_activity a WHERE l.relation=c.oid AND l.pid=a.procpid ORDER BY c.relname;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 使用索引需考虑
- 查询工作负载:对于查询工作负载需返回大量数据的情况而言索引未必有效
- 压缩表:对于压缩数据而言,索引访问方法是解压需要的记录而不是全部解压
- 避免你在频繁更新列表上使用索引:会消耗大量写磁盘和CPU计算资源
- 创建选择性B-tree索引:选择性指数=DISTINCT值数量/表记录数,即表中重复记录越多,建立B-tree索引越有用(DISTINCT值在100到100000之间最佳,超100000之后不宜使用)
- 低选择性列上使用位图索引
- 索引列用于关联:或许可以改善join(关联)性能
- 索引列经常用在查询条件中:对大表来说,查询语句where条件中常用到的列可考虑使用索引
# 单机
# Centos安装docker
若已安装忽略
以下资料来源于 https://blog.csdn.net/PyongSen/article/details/123053374
# 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 安装组件包
sudo yum install -y yum-utils
1
# 设置镜像仓库
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1
2
3
2
3
# 更新yum软件包索引
yum makecache fast
1
# 安装docker-ce
# 社区版
sudo yum install docker-ce docker-ce-cli containerd.io
1
2
2
# 启动docker
sudo systemctl start docker
1
# docker 查看版本
docker version
1
# 设置开机启动
systemctl enable docker
1
# 配置阿里云的镜像加速
# 创建一个目录
sudo mkdir -p /etc/docker
# 编辑配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jdh8r4sm.mirror.aliyuncs.com"]
}
EOF
# 重启服务
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 卸载docker
# 卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
# 删除文件夹
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
1
2
3
4
5
6
2
3
4
5
6
# Docker安装GreenPlum
以下资料来源于 https://developer.aliyun.com/article/57656
多台物理机搭建GPDB集群(1个主节点、1个备节点、n个Segment节点)是最佳的实战环境,但作为入门,GP官方提供的Docker镜像足够用了
# 拉取镜像
docker pull pivotaldata/gpdb-base
1
安装相关工具
# 安装 wget
yum -y install wget
# 安装unzip
yum install -y unzip
1
2
3
4
2
3
4
下载GP官方提供的教程
# 设置一个目标文件夹
mkdir /usr/local/gpdb
cd /usr/local/gpdb
# 下载 或者本地下载传至指定文件夹
wget https://github.com/greenplum-db/gpdb-sandbox-tutorials/zipball/master
# 解压
unzip vmware-archive-gpdb-sandbox-tutorials-c9dc54b.zip
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 启动GP容器,并挂载上述教程
docker run -ti \
-p 15432:5432 \
--name gp_tutorials \
--hostname gp-tutorials \
-v /usr/local/gpdb:/tutorials \
pivotaldata/gpdb-base
1
2
3
4
5
6
2
3
4
5
6
容器内包含的用户/密码信息
root/pivotal
gpadmin/pivotal
1
2
2
# 使用
# 使用 gpadmin 用户
su - gpadmin
# 创建用户和角色 (n,y,n)
createuser -P user1
# ...更多待补充
1
2
3
4
5
2
3
4
5
可以使用 postgresql 客户端工具连接该数据库
# springboot集成greenplum
# 依赖
需要前往 https://mvnrepository.com/artifact/com.pivotal/greenplum-jdbc 下载jar 并安装至本地maven仓库
<!-- https://mvnrepository.com/artifact/com.pivotal/greenplum-jdbc -->
<dependency>
<groupId>com.pivotal</groupId>
<artifactId>greenplum-jdbc</artifactId>
<version>5.1.4</version>
</dependency>
1
2
3
4
5
6
2
3
4
5
6
# maven命令
mvn install:install-file -Dfile='jar包存放的位置'/greenplum-jdbc-5.1.4.jar -DgroupId=com.pivotal -DartifactId=greenplum-jdbc -Dversion=5.1.4 -Dpackaging=jar
1
# yml
spring:
datasource:
driver-class-name: com.pivotal.jdbc.GreenplumDriver
jdbcUrl: jdbc:pivotal:greenplum://127.0.0.1:5432;DatabaseName=test
username: gpadmin
password: pivotal
hikari.maximum-pool-size: 20
hikari.minimum-idle: 5
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 集群
# 主机设置
查看主机名
hostname
1
修改主机名
vi /etc/hostname
# 重启
reboot
1
2
3
2
3
修改ip(非必要)
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 修改以下字段
IPADDR 192.168.1.101
# 重启网络
systemctl restart network
1
2
3
4
5
6
7
2
3
4
5
6
7
修改hosts文件
# 多台机器均要配置
vi /etc/hosts
# 例如 ip hostname
192.168.1.188 mdw
192.168.1.189 sdw1
192.168.1.190 sdw2
# ping命令查看是否能互相ping通主机
ping mdw
ping sdw1
ping sdw2
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 安装docker-compose
# 国内加速安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# Apply executable permissions to the binary
sudo chmod +x /usr/local/bin/docker-compose
# Test the installation
docker-compose --version
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 下载项目
参考链接 https://www.jianshu.com/p/2f3d9925965d
# 下载docker配置文件
git clone https://github.com/lij55/gphost.git
# 解压到任意目录下 例如
/usr/local/docker/github/
# 下载 greenplum-db-6.4.0-rhel7-x86_64.rpm 放到对应的example目录下(版本随意)
# 进入该目录
cd /usr/local/docker/github/gphost-master/example6
# 修改Dockerfile 中的版本为自己的版本
docker build . -t mygreenplum6
# 容器通过docker-compose进行管理,在gphost/example6中有配置好的docker-compose.yaml,默认有1个master节点、2个segment节点、1个etl服务器,可根据自己的需求修改docker-compose.yaml文件
# 启动
docker-compose up -d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dockerfile
FROM lyasper/gphost
COPY greenplum-db-6.4.0-rhel7-x86_64.rpm /home/gpadmin/greenplum-db.rpm
RUN rpm -i /home/gpadmin/greenplum-db.rpm --nodeps --force
RUN chown -R gpadmin /usr/local/greenplum-db*
RUN rm -f /home/gpadmin/greenplum-db.rpm
1
2
3
4
5
2
3
4
5
docker-compose.yml
version: '3'
services:
mdw:
hostname: mdw
image: "mygreenplum6"
ports:
- "6222:22"
- "6432:5432"
sdw1:
hostname: sdw1
image: "mygreenplum6"
sdw2:
hostname: sdw2
image: "mygreenplum6"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 配置集群
# 登录集群master节点,一定要是gpadmin用户
# 登录master节点
ssh -p 6222 gpadmin@127.0.0.1
# 或者 ssh -p 6222 gpadmin@0.0.0.0
# 密码: changeme
# 初始化配置文件
source /usr/local/greenplum-db/greenplum_path.sh
# 配置greenplum文件 (根据自己实际配置的数量)
artifact/prepare.sh -s 2 -n 1
# -s: segment(容器)的个数
# -n: 每个segment(容器)上primary的个数
# 初始化集群,会生成env.sh 文件(greenplum所需的环境变量)
gpinitsystem -a -c gpinitsystem_config
source env.sh
# 开启远程无密码访问
artifact/postinstall.sh
# 查看安装结果
ps -ef | grep postgres
# 使用navicat连接
# IP:192.168.1.188
# 端口:6432
# 用户名:gpadmin
# 密码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
如下图即成功

# greenplum命令
资料来源于 https://blog.51cto.com/feko/2738318
gpstop 关闭
# 交互式关闭,等待所有数据库连接断开才停库
gpstop
# 交互式关闭,强制断开所有数据库连接,直接停库
gpstop -M fast
# 停数据库时,最好不好直接使用gpstop -af命令直接停整个数据,我们应该先把master给停掉,避免一些数据不一致,数据库无法启动的问题。
gpstop -amf
gpstart -am
gpstop -af
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
gpstart 启动
# 交互式启动
gpstart
# 快速启动,非交互式启动
gpstart -a
# 重启
gpstop -ar
1
2
3
4
5
6
2
3
4
5
6
gpstate 查看状态
# 显示所有Master和Segment信息
gpstate -s
# 正常情况,显示primary 和 mirror 的映射关系
gpstate -c
# 异常情况,显示primary 和 mirror 的映射关系
gpstate -e
1
2
3
4
5
6
2
3
4
5
6
查询greenplum 表在各个节点数据的分布情况
select gp_segment_id,count(*) from tablename group by gp_segment_id;
1
结果展示

# 日志配置
# 进入docker容器
docker ps -a
docker exec -it '容器id' bash
# 日志文件一般存放于 /home/gpadmin/gpAdminLogs
# 查询配置文件位置
find / -name postgresql.conf
# log_statement 由 all 修改为 ddl
# 控制记录那些SQL语句应该记录,ddl表示只记录CREATE,ALTER,和 DROP等命令,默认为all,表示insert、update、delete、truncate和copy from等都会记录
log_statement='ddl'
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13