一、前言
Greenplum(简称 GPDB)是一款基于 PostgreSQL 演进的开源 MPP 大规模并行处理分布式数据库,主打 PB 级海量数据离线分析、数据仓库、多维报表、即席查询等 OLAP 场景,在金融、电信、零售、物流等企业级大数据平台中应用十分广泛。

它完全兼容 PostgreSQL 语法,学习门槛低,依托 Shared-Nothing 无共享架构具备线性扩展能力,同时支持行存、列存、数据压缩、高可用、数据镜像等企业级特性,是传统数仓、大数据分析场景的主流选型之一。
架构详解(Master + Segment + Interconnect)

- Master(主节点)
- 全局入口,接收客户端连接(默认 5432 端口)。
- 解析 SQL、生成并行执行计划、分发任务、汇总结果。
- 不存业务数据,仅存元数据(数据字典)。
- 通常部署主备高可用(Primary/Standby)。
- Segment(数据节点)
- 核心数据存储与计算单元,每个 Segment 是独立 PostgreSQL 实例。
- 数据按Hash / 随机 / 范围分布,每个 Segment 存分片数据。
- 支持Primary+Mirror 镜像,节点故障自动切换,保障高可用。
- 单节点可部署多个 Segment 实例,提升资源利用率。
- Interconnect(互联层)
- 节点间高速数据传输通道,负责并行查询的数据洗牌、分发、聚合。
- 采用UDP 协议,低延迟高吞吐,支撑大规模数据交换。
环境说明:本文采用Linux单机部署,仅用于学习、测试、开发调试,不适用生产集群。
二、环境准备
本文提供一种主流单机部署方案,VMware+CentOS7.9 RPM 安装贴近生产环境。
VMware+CentOS7.9 RPM单机部署
2.1 虚拟机硬件配置
- CPU:4 核心(最低 2 核)
- 内存:8GB(最低 6GB,GP 对内存要求较高)
- 硬盘:系统盘 60GB,额外划分独立磁盘挂载
/data用于存放数据 - 网络:桥接模式,方便宿主机图形化工具远程连接
2.2 系统环境初始化(CentOS 7.9)
2.2.1 关闭防火墙与开机自启
# 临时关闭防火墙
systemctl stop firewalld
# 禁止开机自启
systemctl disable firewalld
# 查看状态
systemctl status firewalld
2.2.2 关闭SELinux
SELinux会拦截数据库进程访问,必须关闭:
# 临时关闭
setenforce 0
# 永久关闭(重启生效)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 验证状态
getenforce
2.2.3 配置系统内核参数
编辑内核配置文件,适配 GP 内存、网络、信号量要求:
vim /etc/sysctl.conf
文件末尾追加以下内容:
kernel.shmmax = 500000000
kernel.shmall = 4000000000
kernel.sem = 250 512000 100 2048
net.ipv4.tcp_syncookies = 1
vm.overcommit_memory = 2
保存退出,执行命令使配置生效:
sysctl -p
2.2.4 配置系统资源限制
修改文件句柄、进程数限制,避免大数据查询报错:
vim /etc/security/limits.conf
文件末尾添加:
* soft nofile 65535
* hard nofile 65535
* soft nproc 131072
* hard nproc 131072
配置完成后重启虚拟机:
reboot
2.3 创建专用用户与数据目录
Greenplum强制使用gpadmin账户运行,禁止root账户启动服务:
# 创建gpadmin用户
useradd gpadmin
# 设置用户密码
passwd gpadmin
# 创建数据目录并授权
mkdir -p /data/master
chown -R gpadmin:gpadmin /data
chmod 700 /data
2.4 下载并安装RPM包
# 切换至安装目录
cd /usr/local
# 在线下载开源版Greenplum 6.14.1
wget https://github.com/greenplum-db/gpdb/releases/download/6.14.1/open-source-greenplum-db-6.14.1-rhel7-x86_64.rpm
# 执行安装(自动安装依赖)
yum install -y ./open-source-greenplum-db-6.14.1-rhel7-x86_64.rpm
# 授权安装目录
chown -R gpadmin:gpadmin /usr/local/greenplum*
2.5 配置环境变量
切换至gpadmin用户,配置全局环境变量:
su - gpadmin
vim ~/.bashrc
文件末尾添加配置:
source /usr/local/greenplum-db-6.14.1/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/master
加载环境变量:
source ~/.bashrc
执行gpversion可查看版本,代表配置成功。
2.6 初始化并启动数据库
使用官方单节点模板初始化实例:
# 单节点初始化,出现提示输入 Y 确认
gpinitsystem -c /usr/local/greenplum-db-6.14.1/docs/cli_help/gpconfigs/gpinitsystem_singlenode
常用启停命令
# 启动数据库
gpstart -a
# 停止数据库
gpstop -a
# 重启数据库
gpstop -ar
命令行连接数据库
psql
出现postgres=# 即连接成功。
三、Greenplum核心基础概念
在编写 SQL 前,先掌握两个 GP 最核心特性,也是和单机 PostgreSQL 最大的区别:
3.1 数据分布键DISTRIBUTED BY
GP是分布式MPP架构,数据会拆分到多个Segment节点存储,分布键决定数据分片规则,直接影响查询性能:
DISTRIBUTED BY (字段名):哈希分布(生产环境推荐),按字段哈希值分片,数据均匀分布DISTRIBUTED RANDOMLY:随机分布,数据随机打散,适合小表、维度表- 不指定分布键:默认使用表主键作为分布键
最佳实践:大表、事实表优先选择查询、关联高频字段作为分布键。
3.2 存储类型
GP 支持多种存储模式,适配不同业务场景:
- 行存储(Heap 表,默认):适合小表、频繁增删改、OLTP 轻事务场景
- AO 追加优化表:专为批量写入、海量分析设计,支持列存储 + 数据压缩,数仓大表首选,压缩比最高可达 10:1,大幅节省磁盘空间。
四、基础SQL实战示例
下文所有SQL均可直接在psql客户端中执行,覆盖库、用户、表、增删改查、导入导出、元数据查询等日常常用操作。
4.1 数据库与用户管理
4.1.1 创建、切换数据库
-- 创建测试数据库
CREATE DATABASE test_db;
-- 切换至目标数据库
\c test_db;
4.1.2 创建用户并授权
-- 创建普通用户,设置密码
CREATE USER test_user WITH PASSWORD '123456';
-- 给用户授予数据库全部权限
GRANT ALL PRIVILEGES ON DATABASE test_db TO test_user;
4.2 数据表创建(行存 / 列存两种场景)
4.2.1 普通行存表(小表 / 更新频繁场景)
适用于用户维度表、配置表等小体量数据表:
CREATE TABLE user_info (
id INT,
name VARCHAR(50),
age INT,
city VARCHAR(50),
create_time TIMESTAMP
)
-- 指定分布键:按id哈希分片
DISTRIBUTED BY (id);
4.2.2 列存压缩表(大表 / 分析型场景)
适用于销售流水、日志、行为数据等海量事实表,开启列存 + zlib 压缩:
CREATE TABLE sales_record (
sale_id INT,
product_name VARCHAR(100),
amount DECIMAL(10,2),
sale_date DATE
)
-- 开启AO表、列存储、zlib压缩,压缩级别5
WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=5)
-- 分布键
DISTRIBUTED BY (sale_id);
4.3 插入数据
支持单条、批量插入,数仓环境优先使用批量插入提升效率:
-- 向用户表批量插入数据
INSERT INTO user_info VALUES
(1, '张三', 25, '北京', now()),
(2, '李四', 30, '上海', now()),
(3, '王五', 28, '深圳', now()),
(4, '赵六', 35, '广州', now());
-- 向销售表批量插入数据
INSERT INTO sales_record VALUES
(1001, '手机', 3999.00, '2025-01-01'),
(1002, '电脑', 5999.00, '2025-01-01'),
(1003, '耳机', 299.00, '2025-01-02');
4.4 数据查询(基础查询 + 聚合 + 联表)
GP 完全兼容标准 SQL 与 PostgreSQL 语法,常规查询写法一致:
-- 1. 全表查询
SELECT * FROM user_info;
-- 2. 条件过滤查询
SELECT * FROM user_info WHERE city = '北京';
-- 3. 分组聚合统计(数仓高频用法)
SELECT city, COUNT(*) AS user_count
FROM user_info
GROUP BY city
ORDER BY user_count DESC;
-- 4. 多表关联查询
SELECT u.name, s.product_name, s.amount
FROM user_info u
JOIN sales_record s ON u.id = s.sale_id;
4.5 元数据与集群信息查询
查看表结构、分布键、集群节点等运维常用命令:
-- 查看表结构、分布键、存储属性
\d user_info;
-- 查看当前库下所有数据表
\dt;
-- 查看Greenplum集群节点配置信息
SELECT * FROM gp_segment_configuration;
4.6 数据导入导出(CSV 文件)
使用\copy命令实现本地文件与数据库数据互导,大数据量场景优先使用该方式:
-- 1. 表数据导出为CSV文件(带表头)
\copy user_info TO '/home/gpadmin/user_info.csv' WITH CSV HEADER;
-- 2. 从CSV文件导入数据到表中
\copy user_info FROM '/home/gpadmin/user_info.csv' WITH CSV HEADER;
4.7 表清空与删除
-- 清空表数据,保留表结构(高效清空大表)
TRUNCATE TABLE user_info;
-- 彻底删除数据表
DROP TABLE user_info;
五、入门必备优化建议
结合Greenplum架构特性,分享几条新手必记的性能优化规则:
- 合理选择分布键:大表关联字段尽量作为分布键,避免查询时节点间数据重分布,大幅提升效率;
- 区分存储类型:小表、频繁更新表使用默认行存,千万级以上大分析表统一使用列存 + 压缩;
- 批量写入优先:避免单条循环INSERT,批量插入、文件导入是GP最优写入方式;
- 小表使用随机分布:维度表、字典表等小表可使用
DISTRIBUTED RANDOMLY。
六、环境关闭与退出
6.1 退出psql客户端
\q
6.2 退出容器
exit
6.3 停止 / 重启容器(可选)
# 停止容器
docker stop greenplum
# 重启容器
docker restart greenplum
七、总结
- 本文基于linux实现Greenplum零门槛单机部署,无需复杂集群配置,适合个人学习与开发调试;
- 分布键和存储类型是Greenplum区别于传统单机数据库的核心,也是性能优化的关键;
- GP高度兼容PostgreSQL SQL语法,有SQL基础的开发者可快速上手;
- 该环境仅用于学习测试,生产环境需搭建Master主备、Segment镜像的高可用集群。

3048

被折叠的 条评论
为什么被折叠?



