简介:Greenplum在CentOS 7上的安装部署包,面向大数据平台工程师、数据库运维人员及需要处理海量数据复杂查询的技术团队。安装包围绕Greenplum的集群化部署进行模块化组织,共32个文件,压缩包约66.11MB,以yml、yaml、sh、j2等配置与脚本为主,辅以ini、cfg参数文件、sql脚本和编译配置文件,覆盖主机配置、源码编译、自动化安装、服务启动等完整环节。全包按Ansible部署思路划分为主机清单、角色变量、模板和启动脚本等部分,便于用户根据实际集群节点修改配置参数并批量执行。已有244人学习。通过该包可快速在CentOS 7上搭建可用的Greenplum大数据分析平台,掌握从主机环境检查到数据库启动的完整流程;同时包内保留数据库源码,可供需要二次开发或深入理解MPP内核的读者进一步研究。整体适合从零入门的初级工程师,也是中高级运维人员搭建多节点分析环境的实用参考。 接手一个部署任务时,最烦的不是Greenplum本身怎么用,而是卡在第一步——装不上。之前在一套CentOS 7.9的裸机上部署Greenplum 6,踩了一堆和安装器(greenplum installer)相关的坑,从依赖缺失到内核参数不对,再到segment节点互相ping不通,前前后后折腾了一整天才把集群拉起来。这篇文章就把整个安装过程、核心参数、踩坑记录完整写出来,给后面要在CentOS 7上装Greenplum的朋友当一份实操参考。
1. 项目背景与整体安装思路
1.1 为什么用CentOS 7跑Greenplum
Greenplum是典型的MPP(大规模并行处理)分析型数据库,和单机版PostgreSQL最大的不同在于,它是“一堆机器一起干活”的架构:一个master节点负责接收SQL、生成执行计划,然后把任务分发给多个segment节点并行计算。这种架构天然吃多核、吃内存、吃网络带宽,所以底层操作系统选型很重要。
CentOS 7至今仍在大量企业内网环境里服役,原因不外乎三点:一是生命周期长、资料多,出了问题能查到解决方案的概率高;二是和Greenplum官方文档的兼容性矩阵对齐,6.x版本在RHEL/CentOS 7.x上跑得最稳;三是多数机房现有的运维体系、监控脚本、安全基线都建立在CentOS 7上,强行换系统带来的隐性成本反而更高。如果你的环境是CentOS 7.6到7.9,装Greenplum 6基本没有障碍。
1.2 安装器方式 vs 手动安装
安装Greenplum主要有两条路:一条是从官方仓库或镜像站下载rpm包,然后用rpm命令逐个安装并手动做初始化;另一条就是标题里提到的greenplum installer,这是官方提供的图形化/命令行安装向导,本质上是一个封装好的安装程序,会自动帮你做环境检查、依赖校验、文件拷贝和权限设置。
我个人的建议是:能用installer就用installer。理由很实际:
- 手动装rpm需要自己处理一长串依赖关系,Greenplum依赖的库(如apr、libevent、curl等)在最小化安装的CentOS 7上经常缺,补依赖本身就是一个大坑。
- installer内置了环境预检,能提前发现磁盘空间不足、内存不够、内核参数不对等问题,避免装到一半失败再回头排查。
- 一键式安装对后续交付也有好处,别人接手时只需要看安装目录和配置文件,不用费劲还原你手动敲过的几十条命令。
当然,installer也不是万能的,它只负责“装进去”,真正让集群跑起来还要靠后面的gpinitsystem初始化步骤。所以整个安装链路可以拆成“系统准备 → 运行installer → 初始化集群 → 验证结果”四段,每一段都有值得注意的细节。
2. 安装前的系统准备
2.1 主机规划与基础配置
Greenplum集群最少需要两台机器(一台master、一台segment),但生产环境至少是“2个master节点(含standby)+ 多个segment节点”的结构。我这次用的是3台机器:1台做master,2台做segment,每台配置是16核CPU、64GB内存、500GB SSD数据盘。
机器规划时要注意几个点:
- 主机名不要用默认的
localhost,建议改成有业务含义的名字,比如gp-master01、gp-seg01,因为后面所有节点间的通信都依赖hostname解析。 - 每台机器的时间必须同步,推荐配置chrony或ntp,Greenplum对节点间时钟偏差很敏感,偏差太大会导致事务时间戳混乱。
- 数据盘单独挂载到比如
/data目录,不要和系统盘混在一起,否则后续扩容和性能排查会很痛苦。
2.2 内核参数与资源限制调优
Greenplum对操作系统参数有硬性要求,尤其是共享内存、信号量和文件句柄。installer虽然不会强制你改,但初始化集群时gpinit会检查这些参数,不满足就会报错。建议在装机后、跑installer之前就把参数改好。
编辑/etc/sysctl.conf,追加以下内容:
# 内核参数调整 kernel.shmmax = 500000000 kernel.shmmni = 4096 kernel.shmall = 4000000000 kernel.sem = 250 512000 100 2048 net.ipv4.ip_local_port_range = 10000 65535 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 4194304 vm.overcommit_memory = 2然后执行sysctl -p生效。这里解释一下几个关键参数:
kernel.shmmax和kernel.shmall控制共享内存段的大小和总页数,Greenplum的segment进程之间通信会大量使用共享内存,默认值往往偏小。kernel.sem控制信号量,格式是SEMMSL SEMMNS SEMOPM SEMMNI,其中第四个值SEMMNI(信号量标识符数量)在segment节点数量多时特别重要,默认128根本不够用。vm.overcommit_memory = 2表示禁止内存过量分配,Greenplum官方建议开启,防止进程申请的内存超过物理内存后系统变得不稳定。
同时还要修改/etc/security/limits.conf,给gpadmin用户放开文件句柄和进程数限制:
gpadmin soft nofile 65536 gpadmin hard nofile 65536 gpadmin soft nproc 131072 gpadmin hard nproc 131072改完后用ulimit -u和ulimit -n验证一下是否生效。这一步漏掉的话,后期跑高并发查询时会出现“too many open files”或无法fork新进程的错误。
2.3 依赖库与软件检查
Greenplum 6安装器会依赖一些系统库,比如libcurl、libapr、libevent,这些在最小化安装的CentOS 7上通常没有。我习惯在正式安装前先把基础工具和依赖一次性补齐:
yum install -y epel-release yum install -y net-tools vim wget tar bzip2 yum install -y which sudo openssh-clients yum install -y libcurl libcurl-devel yum install -y apr apr-devel libevent libevent-devel另外一个很多人忽略的点:Greenplum的安装和使用需要perl和python,CentOS 7自带的版本足够,但要注意不能擅自升级python到3.x,因为Greenplum内部脚本有些是基于python 2语法写的,升级后反而会报错。
3. greenplum installer 实操全过程
3.1 下载与文件校验
Greenplum的二进制安装包可以从VMware官方下载(Greenplum被VMware收购后,下载入口在Broadcom/VMware站点上),文件名类似greenplum-db-6.24.4-rhel7-x86_64.rpm,一个rpm包大概300MB左右。需要注册账号才能下载,没有账号的可以在一些镜像站找历史版本。
下载完成后,建议先做校验,确认文件完整:
sha512sum greenplum-db-6.24.4-rhel7-x86_64.rpm把输出的校验值和官方页面上的比对,不一致就重新下载。这一步看似多余,但文件损坏导致的“莫名其妙的安装失败”我见过不止一次。
3.2 运行安装器的两种模式
Greenplum installer支持图形界面模式和命令行模式。如果服务器有图形界面,直接运行rpm安装后就会看到安装向导;如果是纯命令行环境(大多数生产服务器都是这种),就切换到命令行模式安装。
先安装rpm包:
rpm -ivh greenplum-db-6.24.4-rhel7-x86_64.rpm默认安装路径是/usr/local/greenplum-db-6.24.4,同时会在/usr/local下生成一个软链接greenplum-db指向当前版本,这个设计很贴心,后续升级版本不需要改一堆环境变量里的路径。如果不想装到默认路径,可以在rpm安装时指定--prefix,但我不推荐,因为很多脚本里硬编码了/usr/local/greenplum-db的软链接逻辑,改路径容易留坑。
rpm装完后,还需要安装Greenplum客户端工具和Perl模块,这一步通过安装器自动完成:
cd /usr/local/greenplum-db-6.24.4 ./bin/gpinstall运行gpinstall后,安装器会检查环境并提示安装路径、数据目录位置等信息。这里有一个交互选项要特别注意:它会问你是否要创建gpadmin用户和gpadmin用户组,如果系统里还没有这个用户,一定要选“是”,否则后面所有操作都得用root跑,既危险又不合规。
3.3 配置环境变量与互信
安装完成后,需要把Greenplum的环境变量写进gpadmin用户的.bashrc里:
source /usr/local/greenplum-db/greenplum_path.shgreenplum_path.sh是Greenplum自带的环境变量脚本,它会帮你设置GPHOME、PATH、LD_LIBRARY_PATH等关键变量。我见过有人手动去export这些变量,结果漏了LD_LIBRARY_PATH,导致psql连接到一半就报找不到共享库。
接下来配置节点间的SSH互信。Greenplum的master节点需要通过SSH免密登录到所有segment节点,用来下发命令和收集状态。虽然installer不会强制做这一步,但gpinitsystem会用到。配置方法:
su - gpadmin ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa ssh-copy-id gpadmin@gp-master01 ssh-copy-id gpadmin@gp-seg01 ssh-copy-id gpadmin@gp-seg02配置完成后,逐个测试ssh gp-master01 hostname、ssh gp-seg01 hostname,确保不用输密码能直接连通。如果这一步跳过,后面初始化集群时会报“ssh connection denied”或“host key verification failed”。
3.4 使用gpinitsystem初始化集群
安装器只负责把二进制文件放到位,真正把集群“拉起来”的是gpinitsystem这个命令。执行前需要先准备一个配置文件,描述集群拓扑和目录结构。
在/home/gpadmin下创建gpinit_gp6.cfg,内容大致如下:
ARRAY_NAME="Greenplum DW" SEG_PREFIX=gpseg PORT_BASE=6000 declare -a DATA_DIRECTORY=(/data/gpdata1 /data/gpdata1) MASTER_HOSTNAME=gp-master01 MASTER_DIRECTORY=/data/gpmaster MASTER_PORT=5432 TRUSTED_SHELL=ssh CHECK_PG_DIR=true MIRRORING=off字段含义解释一下:
SEG_PREFIX=gpseg:segment节点的数据目录前缀,比如gpseg0、gpseg1,不要改成太复杂的名字,否则日志和排错时看花眼。PORT_BASE=6000:segment节点监听端口的起始值,每个segment在每台机器上会占用这个端口及后续端口。DATA_DIRECTORY:注意这里是个数组,有几个元素就表示在每台segment机器上建几个primary segment实例。我的例子只写了一个目录元素,表示每台机器上跑一个segment实例,可以用/data/gpdata1 /data/gpdata2 /data/gpdata3来增加每个节点上的实例数量。MASTER_DIRECTORY:master节点的数据目录,必须和安装时规划的一致。MIRRORING=off:先关掉镜像,因为演示环境没有多余机器做segment镜像;生产环境建议on,并额外配置mirror目录。
配置完成后,执行:
su - gpadmin gpinitsystem -c gpinit_gp6.cfg -h /home/gpadmin/hostfile这里-h参数指向一个主机清单文件hostfile,里面一行一个主机名,内容就是gp-seg01和gp-seg02。如果要加standby master,还要用-s参数指定。
初始化过程中会输出大量日志,如果中途失败,不要慌,先看最后的报错信息,再去~/gpAdminLogs目录下找对应的日志文件,比如gpinitsystem_20240315.log。
3.5 验证安装结果
集群初始化完成后,先用psql连接默认数据库试试:
psql -d postgres -c "select version();"能看到类似PostgreSQL 9.4.24 (Greenplum Database 6.24.4)的输出就说明核心进程已经起来了。接着用gpstate查看集群状态:
gpstate -s重点看Master instance是否为Active,以及每个segment节点是否都显示Up。如果某个segment状态是Down,可以用gpstate -e查看更详细的错误信息。一个简单实用的验证是跑一个并行查询:
select gp_segment_id, count(*) from gp_segment_configuration group by gp_segment_id;能看到每个segment都返回数据,说明集群的分布执行链路是通的。
4. 常见问题与排查技巧实录
4.1 安装器报错与日志定位
标题相关热词里出现一条很典型的问题:“the installer has encountered an unexpected error installing this package”。虽然这条报错常见于Windows环境,但Greenplum安装器在Linux下也会出现类似的“unexpected error”提示。我遇到过两次,一次是因为/tmp目录空间不足,installer解压临时文件失败;另一次是因为系统缺少chkconfig命令,安装脚本在注册服务时挂掉。
遇到这类通用报错,别急着搜报错文本,先做三件事:
- 用
df -h /tmp确认临时目录有足够空间,至少留5GB以上。 - 用
dmesg | tail -20查看内核日志,确认没有磁盘IO错误或内存不足。 - 找到安装日志,Greenplum安装器会在
/tmp或安装目录下生成gpAdminLogs日志文件,用tail -50看最后的堆栈信息。
当初我定位到chkconfig缺失时,就是因为日志里有一行/usr/sbin/chkconfig: No such file or directory,装个yum install -y chkconfig就解决了。多花一分钟读日志,比反复重装省一小时。
4.2 gpinitsystem初始化失败的排查
gpinitsystem失败是最常见的坑,报错五花八门。根据我自己的经历,排在前三的原因如下:
原因一:/etc/hosts配置错误。这是最容易被忽略的。Greenplum节点间通信全靠hostname解析,如果hostfile里写的是gp-seg01,但/etc/hosts里没有对应条目,或者条目指向了网卡IP以外的地址,就会报“could not connect to segment”之类的错误。排查方法:
cat /etc/hosts ping gp-seg01确保每个节点上都维护了完整的hosts映射,包括master和所有segment。注意,不要用/etc/hostname里的带域名的完整名称去代替短主机名,最好保持短名称和长名称都能解析,避免后续麻烦。
原因二:数据目录权限不对。gpinitsystem会用gpadmin用户去创建数据目录,如果/data目录是root创建的,gpadmin没有写权限,就会报“permission denied”。我习惯在跑初始化之前把数据目录的所有者直接改好:
chown -R gpadmin:gpadmin /data原因三:内核参数仍然不达标。前面说过的kernel.sem如果没生效,gpinitsystem会直接报“semget failed”或“Semaphore operation failed”。此时用ipcs -l查看信号量限制,对照Greenplum要求逐项检查。这里要提醒一句:改完/etc/sysctl.conf后,不仅要执行sysctl -p,最好重启一下机器确认参数在重启后依然生效。
4.3 安装后无法启动数据库
如果集群初始化成功,但重启机器后数据库起不来,最常见的两个问题:
一是/etc/fstab没有正确挂载数据盘,导致gpadmin家目录和数据目录下的内容丢失或不可访问。挂载逻辑要写清楚,比如用UUID而不是设备名挂载,避免磁盘顺序变化后挂载失败。
二是Greenplum的启动脚本没有设置开机自启。需要手动启动时执行:
su - gpadmin gpstart -a如果想把Greenplum注册成系统服务,可以写一个systemd单元文件,但这里有个坑:Greenplum的进程是由gpadmin用户启动的,systemd服务里要正确配置User=gpadmin和ExecStart的路径,否则启动后进程权限不对,连数据目录都打不开。
4.4 常见问题速查表
我把安装过程中容易遇到的典型问题整理成了表格,方便快速对照排查:
| 现象 | 可能原因 | 排查命令 | 解决办法 |
|---|---|---|---|
| installer提示unexpected error | /tmp空间不足 | df -h /tmp | 清理临时文件或扩容,保留至少5GB |
| installer提示找不到库文件 | 缺少libcurl/apr等依赖 | ldd /usr/local/greenplum-db/bin/postgres | 用yum安装对应依赖库 |
| gpinitsystem报semget failed | kernel.sem未生效 | ipcs -l | 修改/etc/sysctl.conf并重启 |
| 节点间无法通信 | /etc/hosts配置错误 | ping gp-seg01 | 在所有节点补齐hosts映射 |
| 数据目录创建失败 | /data目录权限不对 | ls -ld /data | chown -R gpadmin:gpadmin /data |
| psql连接超时 | 防火墙未关闭 | systemctl status firewalld | systemctl stop firewalld并禁用开机自启 |
| 启动时提示端口被占用 | master端口冲突 | ss -lntp查看5432 | 释放端口或修改PGPORT配置 |
| 集群状态显示segment Down | segment进程崩溃 | gpstate -e查看日志 | 到日志目录排查具体报错原因 |
防火墙关闭这一点要重点强调:CentOS 7默认开启firewalld,如果不关掉,即使Greenplum进程正常监听端口,跨节点的pg_ctl命令也会超时。我在测试环境里就因为忘了关防火墙,排查了两个小时。直接执行:
systemctl stop firewalld systemctl disable firewalld但要注意,这只是为了方便测试,生产环境建议通过配置firewalld规则放行Greenplum所需端口,而不是把防火墙整个关掉。
4.5 安装器的自动化与集群扩展
最后说一个提升效率的技巧:Greenplum installer支持在多个节点上批量安装。在master节点上把安装rpm包放到共享目录,然后写一个简单的shell脚本,通过SSH循环在所有节点上执行rpm -ivh greenplum-db-6.24.4-rhel7-x86_64.rpm,就能避免逐台机器手动安装的重复劳动。参考脚本如下:
for host in gp-master01 gp-seg01 gp-seg02; do echo "=== installing on $host ===" ssh root@$host "rpm -ivh /shared/greenplum-db-6.24.4-rhel7-x86_64.rpm" done装完之后,在每个节点上执行source /usr/local/greenplum-db/greenplum_path.sh并写入/etc/profile.d/greenplum.sh,这样所有用户登录时环境变量都自动生效,不用每次手动source。
此外,Greenplum集群后续扩容也依赖安装器的一致性。新增一台segment节点时,要先在这台机器上安装相同版本的Greenplum二进制,然后配置SSH互信,最后用gpexpand工具生成扩容方案并执行。如果前期基线的安装方式和目录结构没有统一,扩容时会触发一堆路径不一致的问题。
5. 写在最后的经验之谈
Greenplum在CentOS 7上的安装,说到底是一个“细心活”而非“技术活”。只要系统参数调到位、依赖补齐、hosts配置正确、SSH互信打通,安装器跑起来五分钟都不用。真正花时间的往往是那些被你忽略的小细节——比如一个没关的防火墙,一个指向错误IP的hosts条目,或者一个忘记改所有权的数据目录。
从安装器到gpinitsystem,每一步都有对应的日志和检查工具,养成“报错先看日志、动手前先列检查清单”的习惯,比记住任何一条具体命令都重要。这套方法论不仅适用于Greenplum,放到其他分布式数据库的安装部署上照样成立。
本文还有配套的精品资源,点击获取