简介这是一套面向大数据平台运维与开发人员、用于 CentOS 7 环境部署 Greenplum 的安装资料适合需要快速搭建 MPP 数据库集群并开展海量数据处理与复杂查询实践的用户。压缩包共 32 个文件约 66.11MB以 yml、sh、j2、yaml、ini 等配置和脚本文件为主同时含有 makefile、rpm、sql、许可协议与说明文档覆盖主机参数、端口与存储路径设置、模板渲染、安装启动、环境初始化、失败回滚及卸载清理等环节目录按流程模块组织便于定位和复用。已有 253 人学习说明其具备一定参考价值。读者可从中获得较完整的部署配置样例、自动化脚本与排错线索用于搭建测试集群、核对主机和集群参数、验证启动流程也可借此理解 Greenplum 在 CentOS 7 上的部署结构与运维要点对集群初始化、服务启停和清理回滚等操作有直接参考意义适合中高级数据库学习者查漏补缺。1. 在 CentOS 7 上装 Greenplum先跑安装器再谈手敲命令拿到 greenplum_installer-centos7 时场景很具体一台刚装好的 CentOS 7磁盘挂好、网络通了Greenplum 还躺在压缩包里。手装过的人知道耗时间的不是解压而是系统层那串动作共享内存、信号量、THP、SELinux、防火墙、gpadmin 用户、SSH 互信、数据目录权限最后才轮到 gpinitsystem。漏一环gpstart 就用一段看不懂的日志把你打回原点。这份资源包把这条链路收成脚本、配置模板和检查项适合快速搭测试集群、做交付标准化也适合被手装流程反复折磨的人。它不是生产一键上线按钮段数量、镜像策略、内存上限、locale 仍要按机器和业务改。第 2 章先拆链路再落到参数和踩坑。2. 拆开 greenplum_installer-centos7从 CentOS 7 系统体检到 gpinitsystem 的六个阶段安装器最容易让人误判的地方是把它当成一个“装库脚本”。实际跑一遍就会发现它更像一条编排链路先确认 CentOS 7 的系统参数能不能承载 Greenplum再准备用户和互信解压二进制最后才把 gpinitsystem 推上去。链路里任何一段失败后面的步骤都不会真正开始。先看目录结构比急着执行 install.sh 更省时间。2.1 目录结构与执行入口资源包常见的组织方式是按阶段拆文件scripts 放检查、初始化、清理脚本conf 放 gpinitsystem_config 和 hostfile 模板packages 放 Greenplum 二进制包logs 收执行日志templates 放 sysctl、profile、hosts 这类系统模板。不同包的文件名会变但职责划分基本一致。先跑一遍文件清单确认入口脚本和模板位置后面改参数才知道该改哪一份。# 查看资源包顶层结构先确认入口和模板位置 find . -maxdepth 2 -type f | sort # 常见入口脚本先看帮助不要直接执行 bash ./install.sh --help 2/dev/null || bash ./setup.sh --help代码里的find只列两层避免日志和包内文档刷屏--help用来确认安装器接受的是--mode single还是-m single不同包的参数名不完全一样。执行入口通常叫 install.sh 或 setup.sh但真正决定安装形态的是 conf 目录里的配置模板。先看帮助再执行能避免把单机参数误用到多机环境。目录/文件作用执行时机scripts/check_env.sh检查内核参数、THP、SELinux、端口安装前conf/gpinitsystem_config.template段数量、端口、数据目录、locale安装前按机器修改conf/hostfile.templatesegment 主机列表安装前按集群填写packages/Greenplum 二进制包解压阶段logs/安装器执行日志安装中与失败后templates/sysctl、profile、hosts 模板系统准备阶段表格里的文件名是常见做法实际资源包可能合并成更少的脚本。判断标准不是文件名而是脚本里有没有对应的检查项和幂等处理。没有检查项的安装器跑失败后容易留下半初始化目录第二次执行会更乱。2.2 系统层预检内核参数、THP、SELinux、防火墙CentOS 7 默认的内核参数对 Greenplum 来说偏保守尤其是共享内存和信号量。安装器一般会落一份 sysctl 配置再执行 sysctl -p。下面这份是测试环境常见的起点kernel.shmmax和kernel.shmall要按物理内存换算不能照抄固定值。shmall通常等于shmmax除以页大小页大小用getconf PAGE_SIZE查。# /etc/sysctl.d/99-greenplum.conf 示例数值按物理内存调整 kernel.shmmax 68719476736 kernel.shmall 16777216 kernel.sem 250 512000 100 2048 kernel.sysrq 1 net.ipv4.ip_local_port_range 10000 65535 net.core.rmem_max 2097152 net.core.wmem_max 2097152 vm.overcommit_memory 2 vm.overcommit_ratio 95 sysctl -p /etc/sysctl.d/99-greenplum.confkernel.sem的四个值分别是信号量集合数、每个集合的最大信号量数、可同时操作的信号量数和系统总信号量数太小会让 segment 启动时报共享内存或信号量错误。vm.overcommit_memory2配合overcommit_ratio控制内存超额分配测试环境可以先用安装器模板里的值生产要按实际内存和并发重算。net.ipv4.ip_local_port_range避开 Greenplum 端口段减少端口冲突。THP 在 CentOS 7 上默认可能是 alwaysGreenplum 对透明大页比较敏感常见做法是关掉。临时关闭和持久化要分开处理临时改完重启会丢。# 临时关闭 THP重启后失效 echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag # 检查当前状态 cat /sys/kernel/mm/transparent_hugepage/enabled持久化可以写进 rc.local 或用 tuned但 CentOS 7 的 systemd 对 rc.local 有权限要求安装器如果自带 systemd unit 或 tuned 配置优先用包内的。SELinux 和防火墙在测试环境常被停掉生产不能照搬至少要按端口段放行 master 和 segment 通信。# 测试环境临时处理生产按安全规范放行端口 setenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config systemctl stop firewalld systemctl disable firewalld注意关闭防火墙和 SELinux 只适合隔离的测试环境。生产环境要保留安全策略放行 master 5432 和 segment 的PORT_BASE到MIRROR_PORT_BASE端口段。2.3 用户、互信与数据目录Greenplum 不允许用 root 跑安装器一般会创建 gpadmin 用户。用户建完后互信是第一个高频翻车点master 要能免密 ssh 到所有 segmentsegment 也要能回连 master单机安装时本机 ssh 本机也要通。只做一半gpinitsystem 会在分发配置时卡住。# 创建 gpadmin 用户示例密码仅用于测试落地时改掉 useradd -m -s /bin/bash gpadmin echo gpadmin:ChangeMe123 | chpasswd su - gpadmin ssh-keygen -t rsa -b 4096 -N -f ~/.ssh/id_rsa for h in gp-master gp-seg1 gp-seg2; do ssh-copy-id $h done chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keysssh-keygen -N 生成空口令密钥方便脚本免交互ssh-copy-id要把公钥推到 hostfile 里的每一台。主机名必须能在/etc/hosts或内部 DNS 里解析不要 IP 和主机名混用。权限700和600不是形式主义.ssh权限过宽会导致 ssh 直接拒绝密钥登录。数据目录要按 master、primary、mirror 分开规划。测试环境可以放在同一块盘生产最好让 primary 和 mirror 落在不同物理盘或不同存储上。目录属主必须是 gpadmin挂载选项常见加noatime文件系统用 XFS 或 ext4不建议把数据目录放到 NFS 上。# 目录规划示例按实际挂载点替换 sudo mkdir -p /data/master /data/primary /data/mirror sudo chown -R gpadmin:gpadmin /data sudo chmod 750 /data/master /data/primary /data/mirror/data/master给 master 用/data/primary给 segment primary 用/data/mirror给镜像用。每个 segment 实例对应一个独立子目录不要让多个实例共用一个目录。目录权限不对gpinitsystem 可能在初始化后期才报错日志里不一定直接写“权限”两个字。2.4 安装包解压与环境变量Greenplum 二进制包常见是 tar.gz解压到/usr/local后建一个软链后续升级只换软链指向。解压后要 sourcegreenplum_path.sh把GPHOME、PATH、LD_LIBRARY_PATH带进当前 shell。安装器一般会把这个动作写进 gpadmin 的.bash_profile但手工验证时最好自己 source 一遍。# 解压并建立稳定软链包名按实际文件替换 sudo tar -xzf packages/greenplum-db-*.tar.gz -C /usr/local sudo ln -s /usr/local/greenplum-db-* /usr/local/greenplum-db # 写入 gpadmin 环境重新登录后生效 echo source /usr/local/greenplum-db/greenplum_path.sh /home/gpadmin/.bash_profile source /usr/local/greenplum-db/greenplum_path.sh which gpinitsystem echo $GPHOMEtar -C /usr/local决定安装根目录软链名保持/usr/local/greenplum-db可以让配置文件不随版本号变化。source greenplum_path.sh之后gpinitsystem、gpstart、gpstate才在 PATH 里。which gpinitsystem和echo $GPHOME是最快的自检两个都为空就别继续往下跑。CentOS 7 上还要确认依赖库存在。常见缺少的是 Python、Perl、readline、zlib、openssl 相关运行库。安装器如果有check_env.sh先跑它没有就手工用ldd看 gpinitsystem 依赖。# 检查 gpinitsystem 的动态库依赖缺库会直接列出来 ldd $GPHOME/bin/gpinitsystem | grep -i not foundldd输出里出现not found就不要硬跑先把对应运行库补上。CentOS 7 的 yum 源如果已经不可用常见做法是挂内部镜像源而不是临时改一堆外网地址。依赖问题在安装阶段暴露比在 gpstart 阶段暴露便宜得多。2.5 gpinitsystem 配置模板与段实例规划真正决定集群形态的是gpinitsystem_config。这个文件本质是 bash 脚本里面用declare -a定义数组。DATA_DIRECTORY的条目数决定每台 segment 主机上建几个 primary乘上 hostfile 行数才是总 primary 数。MIRROR_DATA_DIRECTORY对应镜像目录不开镜像就不写镜像数组具体以包内模板为准。# gpinitsystem_config 示例主机名和目录按实际环境替换 ARRAY_NAMEgp_sandbox MACHINE_LIST_FILE/home/gpadmin/hostfile SEG_PREFIXgpseg PORT_BASE6000 declare -a DATA_DIRECTORY(/data/primary /data/primary) MASTER_HOSTgp-master MASTER_DIRECTORY/data/master MASTER_PORT5432 TRUSTED_SHELLssh CHECK_POINT_SEGMENTS8 ENCODINGUTF8 LOCALEen_US.UTF-8 MIRROR_PORT_BASE7000 declare -a MIRROR_DATA_DIRECTORY(/data/mirror /data/mirror)MACHINE_LIST_FILE要写绝对路径hostfile 一行一个 segment 主机名不要有空行。SEG_PREFIX是数据目录前缀最终目录形如gpseg0、gpseg1。PORT_BASE是 primary 起始端口MIRROR_PORT_BASE是 mirror 起始端口两者不能重叠。MASTER_DIRECTORY是 master 数据目录不要和 segment 目录混用。ENCODING和LOCALE在 master 与 segment 上必须一致后面第 3 章会单独说。hostfile 示例# 多机只列 segment 主机一行一个 gp-seg1 gp-seg2 # 单机写本机主机名确保能解析和免密 ssh gp-master多机 hostfile 不要写 master除非 master 同时承担 segment 角色。单机安装时 hostfile 写本机主机名不要写localhost否则 gpinitsystem 可能拿不到一致的解析结果。改完配置后先做一次语法检查避免数组括号或变量名写错。# 用 bash -n 检查配置语法不执行 bash -n /home/gpadmin/gpinitsystem_configbash -n只查语法不查语义。语义错误比如目录不存在、端口冲突、hostfile 路径不对要等 gpinitsystem 跑起来才暴露。配置改完后先cat一遍 hostfile 和数组确认没有多余空格和空行。2.6 初始化与验证初始化命令本身不复杂难的是失败后怎么看日志。gpinitsystem 会在 gpadmin 家目录下生成gpAdminLogs安装器自己的日志在 logs 目录。执行时把标准输出和错误一起 tee 到文件失败后先看最后 100 行再 grep 关键字。# 执行初始化带 standby 时加 -s gp-standby gpinitsystem -c /home/gpadmin/gpinitsystem_config \ -h /home/gpadmin/hostfile \ 21 | tee /home/gpadmin/gpinitsystem-run.log # 初始化成功后启动并检查 gpstart -a gpstate -e-c指定配置文件-h指定 hostfile-s可选指定 standby master。gpstart -a免交互启动gpstate -e看 segment 状态和镜像同步情况。不要只看gpstart返回 0segment 可能起来了但 mirror 没同步。再跑一条简单查询确认分布表可写可读。-- 建一张分布表确认数据能落到 segment create table smoke_test(id int) distributed by (id); insert into smoke_test select generate_series(1, 1000); select count(*) from smoke_test;distributed by (id)指定分布键generate_series造一千行数据。count(*)能返回 1000 说明 master 和 segment 基本通了。这一步不要省很多问题在空库状态下看不出来一写数据才暴露磁盘权限或端口问题。3. 参数怎么落gpinitsystem_config 里最容易被改错的五组值安装器把模板放出来不代表模板里的值能直接上生产。段数量、镜像策略、数据目录、端口、内存上限、locale 这五组值决定了集群能不能启动、能跑多快、后面好不好扩。下面按“先定形态再定资源最后定一致性”的顺序拆。3.1 段数量与镜像策略段数量不是越多越好。每台主机上建几个 primary取决于磁盘数、内存和并发。DATA_DIRECTORY数组里写几个目录就是每台 segment 主机上几个 primary。总 primary 数等于每台主机 primary 数乘 hostfile 行数。镜像再乘一份存储。测试环境常见做法是单机 2 个 primary镜像可开可不开生产按磁盘数配尽量让 primary 和 mirror 不落在同一块盘。参数含义单机测试多机生产SEG_PREFIX数据目录前缀gpseggpsegPORT_BASEprimary 起始端口60006000MIRROR_PORT_BASEmirror 起始端口70007000DATA_DIRECTORYprimary 目录数组2 个目录每盘一个目录MIRROR_DATA_DIRECTORYmirror 目录数组2 个目录或不开对应镜像盘镜像策略要在初始化时定后面补镜像虽然能做但多一步 gprecoverseg 和容量规划。测试环境为了省磁盘可以不开镜像但交付给业务前要明确告知没有冗余。生产环境不建议无镜像跑核心业务segment 挂一个就可能影响查询。提示段数量先按“每台主机 2 到 4 个 primary”起步压测后再调。一次建太多 segment内存和端口都容易打架。3.2 数据目录与文件系统数据目录最常见的错误是全部塞在根分区。Greenplum 的 segment 数据、日志、临时文件都吃磁盘根分区满了会直接把 segment 拖 down。master 单独一个目录primary 和 mirror 分开最好对应不同挂载点。文件系统用 XFS 或 ext4挂载加noatime不要在 NFS 上跑数据目录。# 检查挂载点和文件系统类型 lsblk -f mount | grep -E /data|/db xfs_info /data 2/dev/null || tune2fs -l /data 2/dev/null | headlsblk -f看设备、文件系统类型和挂载点mount确认实际挂载选项xfs_info或tune2fs确认文件系统参数。数据目录权限统一给 gpadmin不要用 root 跑 gpinitsystem。目录规划建议单独列一张表交付时随安装记录一起留档。目录用途权限建议/data/mastermaster 数据目录gpadmin:gpadmin 750/data/primarysegment primary 数据gpadmin:gpadmin 750/data/mirrorsegment mirror 数据gpadmin:gpadmin 750/home/gpadmin/gpAdminLogs安装与运行日志gpadmin:gpadmin 700磁盘满导致的问题往往不是“磁盘满”三个字而是 segment 日志里报临时文件写入失败。安装前用df -h确认每个挂载点余量安装后再看一次。镜像目录和 primary 目录不要指向同一个子目录否则镜像失去意义。3.3 端口与地址Greenplum 的端口规划比较直接master 默认 5432segment primary 从PORT_BASE开始按目录顺序递增mirror 从MIRROR_PORT_BASE开始递增。两个端口段不能重叠也不能和系统里已有服务冲突。CentOS 7 上先用ss查一遍再改配置。# 检查 master 和 segment 端口是否被占用 ss -lntp | grep -E :(5432|6000|6001|7000|7001)\b # 检查主机名解析master 和 segment 都要能互相解析 getent hosts gp-master gp-seg1 gp-seg2 hostname -fss -lntp输出里如果有别的进程占了 6000 或 7000换端口段比重启冲突服务更省事。getent hosts确认每台主机名都能解析到正确地址hostname -f确认本机全名和/etc/hosts一致。主机名不一致会让 SSH 互信和 gpinitsystem 分发配置都出问题。多机环境还要确认 master 和 segment 在同一网段、MTU 一致时间同步正常。时间偏差太大会让节点间认证和日志时间线错乱排查时非常难受。# 检查时间同步状态CentOS 7 常见用 chrony chronyc tracking chronyc sourceschronyc tracking看当前偏差chronyc sources看时间源是否可达。测试环境用内部时间源即可不要依赖不稳定的外部源。时间同步不是 Greenplum 专属要求但集群节点时间不一致会让很多分布式问题看起来像“玄学”。3.4 资源队列与并发安装完成后最容易拍脑袋改的是内存参数。gp_vmem_protect_limit控制每个 segment 的内存保护上限设得太高会让 segment 被系统 OOM 杀掉设得太低会让大查询直接报内存不足。常见算法是按 segment 主机总内存乘 0.8再除以该主机上的 primary 数留出系统余量。statement_mem是单条语句的基础内存不能超过保护上限除以并发。# 查看当前值再决定怎么改 gpconfig -s max_connections gpconfig -s gp_vmem_protect_limit gpconfig -s statement_mem # 修改示例单位 MB数值按机器换算不要照抄 gpconfig -c max_connections -v 200 -m 20 gpconfig -c gp_vmem_protect_limit -v 8192 gpconfig -c statement_mem -v 128MB # 部分参数 reload 生效部分需要重启按命令提示处理 gpstop -ugpconfig -c改参数-v是 master 值-m是 segment 值。max_connections不要只调大连接数上去后每个连接都占内存。gp_vmem_protect_limit的单位是 MB8192表示 8GB实际值按物理内存和 segment 数算。gpstop -u只 reload 配置不重启实例有些参数必须gpstop -r才生效改完看命令输出。参数作用调整边界max_connectionsmaster 最大连接数按并发和内存不要只追大gp_vmem_protect_limit每 segment 内存保护上限总内存乘 0.8 再除以 primary 数statement_mem单语句基础内存不超过保护上限除以并发gp_resqueue_memory_policy资源队列内存策略按负载选 auto 或 eager血泪经验是不要从网上抄本文还有配套的精品资源点击获取