ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Greenplum 6在CentOS 7上安装部署:从installer到gpinitsystem的完整踩坑指南

Greenplum 6在CentOS 7上安装部署:从installer到gpinitsystem的完整踩坑指南 简介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跑GreenplumGreenplum是典型的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台做master2台做segment每台配置是16核CPU、64GB内存、500GB SSD数据盘。机器规划时要注意几个点主机名不要用默认的localhost建议改成有业务含义的名字比如gp-master01、gp-seg01因为后面所有节点间的通信都依赖hostname解析。每台机器的时间必须同步推荐配置chrony或ntpGreenplum对节点间时钟偏差很敏感偏差太大会导致事务时间戳混乱。数据盘单独挂载到比如/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和pythonCentOS 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 gpadmingp-master01 ssh-copy-id gpadmingp-seg01 ssh-copy-id gpadmingp-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_NAMEGreenplum DW SEG_PREFIXgpseg PORT_BASE6000 declare -a DATA_DIRECTORY(/data/gpdata1 /data/gpdata1) MASTER_HOSTNAMEgp-master01 MASTER_DIRECTORY/data/gpmaster MASTER_PORT5432 TRUSTED_SHELLssh CHECK_PG_DIRtrue MIRRORINGoff字段含义解释一下SEG_PREFIXgpsegsegment节点的数据目录前缀比如gpseg0、gpseg1不要改成太复杂的名字否则日志和排错时看花眼。PORT_BASE6000segment节点监听端口的起始值每个segment在每台机器上会占用这个端口及后续端口。DATA_DIRECTORY注意这里是个数组有几个元素就表示在每台segment机器上建几个primary segment实例。我的例子只写了一个目录元素表示每台机器上跑一个segment实例可以用/data/gpdata1 /data/gpdata2 /data/gpdata3来增加每个节点上的实例数量。MASTER_DIRECTORYmaster节点的数据目录必须和安装时规划的一致。MIRRORINGoff先关掉镜像因为演示环境没有多余机器做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服务里要正确配置Usergpadmin和ExecStart的路径否则启动后进程权限不对连数据目录都打不开。4.4 常见问题速查表我把安装过程中容易遇到的典型问题整理成了表格方便快速对照排查现象可能原因排查命令解决办法installer提示unexpected error/tmp空间不足df -h /tmp清理临时文件或扩容保留至少5GBinstaller提示找不到库文件缺少libcurl/apr等依赖ldd /usr/local/greenplum-db/bin/postgres用yum安装对应依赖库gpinitsystem报semget failedkernel.sem未生效ipcs -l修改/etc/sysctl.conf并重启节点间无法通信/etc/hosts配置错误ping gp-seg01在所有节点补齐hosts映射数据目录创建失败/data目录权限不对ls -ld /datachown -R gpadmin:gpadmin /datapsql连接超时防火墙未关闭systemctl status firewalldsystemctl stop firewalld并禁用开机自启启动时提示端口被占用master端口冲突ss -lntp查看5432释放端口或修改PGPORT配置集群状态显示segment Downsegment进程崩溃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放到其他分布式数据库的安装部署上照样成立。本文还有配套的精品资源点击获取
返回列表