ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CentOS 7 部署 Greenplum:安装器与 gpinitsystem

CentOS 7 部署 Greenplum:安装器与 gpinitsystem

简介:这是一套面向大数据平台运维与开发人员、用于 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.conf

kernel.sem的四个值分别是信号量集合数、每个集合的最大信号量数、可同时操作的信号量数和系统总信号量数,太小会让 segment 启动时报共享内存或信号量错误。vm.overcommit_memory=2配合overcommit_ratio控制内存超额分配,测试环境可以先用安装器模板里的值,生产要按实际内存和并发重算。net.ipv4.ip_local_port_range避开 Greenplum 端口段,减少端口冲突。

THP 在 CentOS 7 上默认可能是 always,Greenplum 对透明大页比较敏感,常见做法是关掉。临时关闭和持久化要分开处理,临时改完重启会丢。

# 临时关闭 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/^SELINUX=enforcing/SELINUX=permissive/' /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 到所有 segment,segment 也要能回连 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_keys

ssh-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 "$GPHOME"

tar -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 found'

ldd输出里出现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_NAME="gp_sandbox" MACHINE_LIST_FILE=/home/gpadmin/hostfile SEG_PREFIX=gpseg PORT_BASE=6000 declare -a DATA_DIRECTORY=(/data/primary /data/primary) MASTER_HOST=gp-master MASTER_DIRECTORY=/data/master MASTER_PORT=5432 TRUSTED_SHELL=ssh CHECK_POINT_SEGMENTS=8 ENCODING=UTF8 LOCALE=en_US.UTF-8 MIRROR_PORT_BASE=7000 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_config

bash -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 \ 2>&1 | tee /home/gpadmin/gpinitsystem-run.log # 初始化成功后启动并检查 gpstart -a gpstate -e

-c指定配置文件,-h指定 hostfile,-s可选指定 standby master。gpstart -a免交互启动,gpstate -e看 segment 状态和镜像同步情况。不要只看gpstart返回 0,segment 可能起来了但 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数据目录前缀gpseggpseg
PORT_BASEprimary 起始端口60006000
MIRROR_PORT_BASEmirror 起始端口70007000
DATA_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 | head

lsblk -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 默认 5432,segment 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 -f

ss -lntp输出里如果有别的进程占了 6000 或 7000,换端口段比重启冲突服务更省事。getent hosts确认每台主机名都能解析到正确地址,hostname -f确认本机全名和/etc/hosts一致。主机名不一致会让 SSH 互信和 gpinitsystem 分发配置都出问题。

多机环境还要确认 master 和 segment 在同一网段、MTU 一致,时间同步正常。时间偏差太大会让节点间认证和日志时间线错乱,排查时非常难受。

# 检查时间同步状态,CentOS 7 常见用 chrony chronyc tracking chronyc sources

chronyc 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 -u

gpconfig -c改参数,-v是 master 值,-m是 segment 值。max_connections不要只调大,连接数上去后每个连接都占内存。gp_vmem_protect_limit的单位是 MB,8192表示 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

血泪经验是不要从网上抄

本文还有配套的精品资源,点击获取

返回列表