资讯详情

资讯详情

CentOS 7 上安装 Greenplum 的完整避坑指南:从内核参数到集群初始化

简介本资源为Greenplum在CentOS 7环境下的安装包面向需要搭建MPP大数据分析平台的运维人员与数据库开发者帮助解决集群部署与初始化配置问题。压缩包共32个文件约66.11MB涵盖yml、sh、j2、yaml、ini、cfg、sql、makefile、rpm、license、txt等多种类型分别用于主机配置、自动化部署、模板渲染、启动脚本与许可说明。其中host.ini负责集群主机与端口设置makefile与src目录支撑编译安装及源码定制start.sh简化服务启动流程readme.txt提供安装要点提示。已有253人学习下载适合希望快速构建稳定可靠大数据处理平台、处理海量数据与复杂查询场景的技术人员参考使用。1. CentOS 7 上装 Greenplum为什么我劝你先别急着敲 gpinitsystem在 CentOS 7 上部署 Greenplum十个里有八个第一次跑gpinitsystem都会翻车。不是 SSH 互信没配好就是sem内核参数没调再不然就是数据目录权限不对初始化到一半报错退出留下一个半死不活的集群。这套环境在数据仓库场景里太常见了——MPP 架构、主从分段、并行查询很多公司的离线数仓底层就是它。但 Greenplum 对操作系统层面的要求比普通单机数据库苛刻得多CentOS 7 虽然老依然是不少生产环境的主力系统所以greenplum_installer-centos7这类安装方案一直有人找。这篇笔记适合两类人一是第一次在 CentOS 7 上搭 Greenplum、想照着走一遍不踩坑的二是装过但被内核参数和互信折腾过、想回头把流程理清楚的。我会按「装什么版本 → 系统怎么改 → 怎么装 → 怎么初始化 → 坏了怎么救 → 怎么验证」的顺序写命令都能直接抄。2. 装前把系统底子摸清CentOS 7 的内核参数与依赖包2.1 版本选择Greenplum 6 还是 7CentOS 7 上怎么定Greenplum 的版本和 CentOS 7 的兼容性有个分水岭。Greenplum 6.x 系列对 CentOS 7 的支持最成熟官方 RPM 包直接覆盖社区文档也最全Greenplum 7 虽然功能更新但在 CentOS 7 上装的时候部分依赖库的版本会打架尤其是libevent和apr这类基础库。我一般会先确认系统的小版本# 查看 CentOS 7 具体小版本和内核 cat /etc/centos-release uname -r输出如果是CentOS Linux release 7.9.2009这种基本就是 CentOS 7 的末期版本兼容性最好。如果还在 7.4 以下建议先yum update把系统补到 7.9否则后面装 Greenplum 6 的时候会遇到glibc版本不够的问题。版本选择上生产环境我倾向 Greenplum 6.24 或 6.26 这类稳定分支别追最新。Greenplum 7 在 CentOS 7 上不是不能装但你要做好手动编译部分依赖的准备对新手不友好。2.2 依赖包清单少一个都可能在初始化时炸CentOS 7 最小化安装之后缺的包比你想的多。下面这串是我装 Greenplum 6 时固定会装的依赖直接一条命令搞定# 安装 Greenplum 运行和编译所需的基础依赖 yum install -y epel-release yum install -y apr apr-util bash bzip2 curl krb5-devel libcurl-devel \ libevent libevent-devel libxml2 libxml2-devel libyaml libyaml-devel \ openssl openssl-devel openldap openldap-devel pam pam-devel \ perl perl-devel readline readline-devel rsync unzip zip zlib zlib-devel这里有几个包容易被忽略libevent-devel和libyaml-devel是 Greenplum 内部通信和配置解析用的缺了会在gpinitsystem阶段报cannot open shared object filereadline-devel影响psql的交互体验不装也能跑但用起来难受。krb5-devel和openldap-devel是如果你要用 LDAP 或 Kerberos 认证才需要但提前装上省得后面补。装完可以用rpm -qa | grep逐个确认别嫌麻烦。2.3 内核参数sysctl 和 limits 这两处必须改Greenplum 是 MPP 架构每个 segment 都是独立进程对共享内存和信号量的需求比单机 PostgreSQL 大得多。CentOS 7 默认的shmmax和shmall根本不够不改的话gpinitsystem会在创建共享内存时直接失败。我一般会写一个独立的配置文件# 创建 Greenplum 专用的内核参数文件 cat /etc/sysctl.d/99-greenplum.conf EOF kernel.shmmax 500000000 kernel.shmmni 4096 kernel.shmall 4000000000 kernel.sem 250 512000 100 2048 kernel.sysrq 1 kernel.core_uses_pid 1 kernel.msgmnb 65536 kernel.msgmax 65536 kernel.msgmni 2048 net.ipv4.tcp_syncookies 1 net.ipv4.ip_forward 0 net.ipv4.conf.default.accept_source_route 0 net.ipv4.tcp_tw_recycle 1 net.ipv4.tcp_max_syn_backlog 4096 net.ipv4.conf.all.arp_filter 1 net.ipv4.ip_local_port_range 1025 65535 net.core.netdev_max_backlog 10000 net.core.rmem_max 2097152 net.core.wmem_max 2097152 vm.overcommit_memory 2 EOF # 生效 sysctl -p /etc/sysctl.d/99-greenplum.confkernel.shmmax设成 500000000 是 Greenplum 官方推荐的最小值实际生产可以按内存调大kernel.sem四个值分别是SEMMSL、SEMMNS、SEMOPM、SEMMNIGreenplum 对SEMMNS要求很高512000 是保险值。vm.overcommit_memory 2是让内核严格检查内存分配避免 Greenplum 申请大页内存时被拒。改完sysctl还要改limits# 调整用户资源限制 cat /etc/security/limits.conf EOF * soft nofile 65536 * hard nofile 65536 * soft nproc 131072 * hard nproc 131072 EOFnofile和nproc不调的话segment 数量一多就会报too many open files。改完limits需要重新登录才生效别在当前会话里直接测。3. 装 Greenplum 本体RPM 安装与目录规划3.1 下载与 RPM 安装别用 root 跑 gp 命令Greenplum 的 RPM 包在官方仓库能拿到CentOS 7 对应的是greenplum-db-6.x.x-rhel7-x86_64.rpm这种命名。下载之后用yum localinstall装比rpm -ivh省心因为能自动处理依赖# 安装 Greenplum RPM 包 yum localinstall -y greenplum-db-6.24.0-rhel7-x86_64.rpm装完之后 Greenplum 会落在/usr/local/greenplum-db-6.24.0同时创建一个软链接/usr/local/greenplum-db指向它。这里有个关键点Greenplum 不允许用 root 运行gp系列命令必须用一个普通用户通常叫gpadmin。所以装完 RPM 第一件事是建用户和组# 创建 gpadmin 组和用户 groupadd -g 530 gpadmin useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin # 设置密码 passwd gpadminUID 和 GID 用 530 是 Greenplum 社区的惯例不是强制但多节点部署时保持一致能省很多事。建完用户要把 Greenplum 目录的属主改过去# 把 Greenplum 安装目录交给 gpadmin chown -R gpadmin:gpadmin /usr/local/greenplum-db-6.24.0 chown -R gpadmin:gpadmin /usr/local/greenplum-db3.2 目录规划数据目录和安装目录必须分开Greenplum 的安装目录和数据目录一定要分开安装目录放代码和二进制数据目录放 segment 的数据文件。我一般会在数据盘上建一个/data分区然后规划成# 创建 Greenplum 数据目录结构 mkdir -p /data/gpdata/master mkdir -p /data/gpdata/primary mkdir -p /data/gpdata/mirror chown -R gpadmin:gpadmin /data/gpdatamaster放 master 节点数据primary放主 segmentmirror放镜像 segment。如果是单机测试这三个目录都在同一块盘上没问题生产环境建议 primary 和 mirror 分到不同物理盘否则一块盘坏了主备一起挂。目录建完还要确认挂载点的noatime选项减少不必要的磁盘写入# 查看挂载选项确认有 noatime mount | grep /data如果没有noatime可以在/etc/fstab里加上然后mount -o remount /data。这个细节对写入密集的 Greenplum 来说影响不小。3.3 环境变量gpadmin 的 .bashrc 要写对gpadmin用户登录后要能直接找到 Greenplum 的命令所以环境变量必须配。我一般直接写进gpadmin的.bashrc# 切换到 gpadmin 用户后编辑 .bashrc su - gpadmin cat ~/.bashrc EOF source /usr/local/greenplum-db/greenplum_path.sh export MASTER_DATA_DIRECTORY/data/gpdata/master/gpseg-1 export PGPORT5432 export PGUSERgpadmin export PGDATABASEpostgres EOF source ~/.bashrcgreenplum_path.sh是 Greenplum 自带的环境脚本里面设了GPHOME、PATH、LD_LIBRARY_PATH这些关键变量必须 source。MASTER_DATA_DIRECTORY指向 master 的数据目录后面gpstart、gpstop都依赖它。PGPORT默认 5432如果和系统里已有的 PostgreSQL 冲突改成 5433 或别的。配完可以用which psql确认路径指向/usr/local/greenplum-db/bin/psql如果指向/usr/bin/psql说明系统里装了别的 PostgreSQL要先把 PATH 顺序调对。4. 初始化集群互信、配置文件与 gpinitsystem4.1 SSH 互信单机和多机的配法不一样Greenplum 的 master 和 segment 之间靠 SSH 通信互信没配好gpinitsystem直接卡在第一步。单机部署master 和 segment 在同一台机器也要配因为 Greenplum 会通过ssh localhost连自己。配法是# 在 gpadmin 用户下生成密钥 su - gpadmin ssh-keygen -t rsa -b 2048 -N -f ~/.ssh/id_rsa # 把公钥加入授权 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh # 测试免密 ssh localhost datessh localhost date如果不需要输密码就返回日期说明互信通了。多机部署的话要把每台机器的id_rsa.pub收集起来汇总到所有节点的authorized_keys里包括 master 和所有 segment。常见做法是用ssh-copy-id逐台推或者用gpssh-exkeys工具批量做。gpssh-exkeys是 Greenplum 自带的比手动推省事# 多机互信hostfile 里列出所有节点 gpssh-exkeys -f /home/gpadmin/hostfilehostfile里一行一个主机名比如mdw、sdw1、sdw2。跑之前确保每台机器的/etc/hosts里都有彼此的解析别依赖 DNS。4.2 初始化配置文件gpinitsystem_config 怎么改Greenplum 初始化靠一个配置文件模板在$GPHOME/docs/cli_help/gpinitsystem_config。我一般复制一份到gpadmin家目录再改# 复制模板并编辑 cp $GPHOME/docs/cli_help/gpinitsystem_config ~/gpinitsystem_config vim ~/gpinitsystem_config关键字段这么填# 阵列类型单机用 none ARRAY_NAMEGreenplum Data Platform # segment 前缀 SEG_PREFIXgpseg # 数据目录和前面规划的一致 declare -a DATA_DIRECTORY(/data/gpdata/primary /data/gpdata/primary) # master 主机名 MASTER_HOSTNAMEmdw # master 数据目录 MASTER_DIRECTORY/data/gpdata/master # master 端口 MASTER_PORT5432 # segment 端口每个 segment 一个 declare -a PORT_BASE(6000 6001) # 镜像相关单机测试可以先不配镜像 MIRROR_PORT_BASE7000 declare -a MIRROR_DATA_DIRECTORY(/data/gpdata/mirror /data/gpdata/mirror)DATA_DIRECTORY数组里几个元素就代表每台机器上建几个 primary segment我上面写了两个对应PORT_BASE的两个端口。MASTER_HOSTNAME要和hostname命令输出一致别写 IP。如果配镜像MIRROR_DATA_DIRECTORY要和 primary 分开别指向同一个目录。4.3 跑 gpinitsystem参数和失败后的清理配置文件改好之后用gpinitsystem初始化# 初始化 Greenplum 集群 gpinitsystem -c ~/gpinitsystem_config -h ~/hostfile -a-c指定配置文件-h指定 hostfile单机也要写里面就一行主机名-a是自动确认不加的话会交互式问你确认。跑的过程中会输出大量日志重点看有没有ERROR或FATAL。如果中途失败别直接重跑先清理残留# 清理失败的初始化残留 gpstop -a -r 2/dev/null rm -rf /data/gpdata/master/* rm -rf /data/gpdata/primary/* rm -rf /data/gpdata/mirror/*gpstop -a -r是强制停掉可能残留的进程-r是快速模式。清完目录再重跑gpinitsystem否则会因为目录非空报错。初始化成功的话最后会输出Greenplum Database instance successfully created这时候集群已经起来了。5. 避坑与排查装 Greenplum 时最容易翻车的五件事5.1 现象gpinitsystem 报 shared memory 不足原因kernel.shmmax或kernel.shmall没生效或者sysctl改了但没sysctl -p。CentOS 7 有时候/etc/sysctl.conf和/etc/sysctl.d/下的文件会冲突后加载的覆盖前面的。解决用sysctl -a | grep shmmax确认实际值如果和配置文件不一致检查/etc/sysctl.d/里的文件命名顺序数字大的后加载。我一般把 Greenplum 的参数放在99-greenplum.conf确保最后生效。5.2 现象SSH 互信测试通过但 gpinitsystem 还是卡住原因gpadmin用户的.ssh目录权限不对或者known_hosts里有旧的主机指纹。Greenplum 对 SSH 的严格模式很敏感权限多了少了都不行。解决chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys、chmod 600 ~/.ssh/id_rsa然后删掉known_hosts重新ssh localhost接受指纹。如果还不行用ssh -vvv localhost看详细日志通常能定位到具体哪一步被拒。5.3 现象初始化成功但 gpstart 起不来原因MASTER_DATA_DIRECTORY环境变量没设或者PGPORT和系统里其他服务冲突。CentOS 7 默认可能装了 PostgreSQL占用 5432。解决echo $MASTER_DATA_DIRECTORY确认指向正确netstat -tlnp | grep 5432看端口占用。如果被占改gpinitsystem_config里的MASTER_PORT和PORT_BASE重新初始化。别试图改已初始化集群的端口改配置文件重来更省事。5.4 现象segment 数量对不上gpstate 显示有 down 的原因gpinitsystem_config里DATA_DIRECTORY和PORT_BASE的元素个数不一致或者某台机器上目录没建全。解决gpstate -e看具体哪个 segment 挂了然后去对应机器上检查数据目录是否存在、权限是否gpadmin。如果目录缺失手动建好再gprecoverseg -a恢复。初始化之前一定要逐台确认目录别假设脚本会帮你建。5.5 现象psql 连不上报 role gpadmin does not exist原因Greenplum 初始化时会用当前系统用户创建同名数据库角色但如果用su而不是su -切换环境变量没加载psql可能连到了系统自带的 PostgreSQL。解决始终用su - gpadmin切换确保greenplum_path.sh被 source。然后用psql -d postgres连如果还报错检查PGUSER和PGDATABASE环境变量。初始化后的默认数据库是postgres默认用户是gpadmin别用 root 去连。6. 装完怎么验证从 gpstate 到一次真实查询集群起来之后别急着建表先跑一遍状态检查。gpstate是最直接的# 查看集群整体状态 gpstate输出里重点看Master instance和Segment instances两段所有 segment 的Status都应该是UpData directory路径和你规划的一致。如果有Down的用gpstate -e看详细原因。接着确认 master 和 standby 的状态# 查看 master 和 standby 角色 gpstate -f单机部署没有 standby输出会提示Standby master not configured这是正常的。然后连进数据库做一次真实查询# 连接 postgres 库 psql -d postgres # 在 psql 里查看 segment 配置 SELECT * FROM gp_segment_configuration ORDER BY dbid; # 建一张测试表插入数据验证并行查询 CREATE TABLE test_gp (id int, name text) DISTRIBUTED BY (id); INSERT INTO test_gp SELECT generate_series(1,10000), test; SELECT count(*) FROM test_gp;gp_segment_configuration这张表会列出所有 segment 的dbid、content、role、statusstatus是u表示 uprole是p表示 primary、m表示 mirror。count(*)返回 10000 说明数据分布和查询都正常。最后用\d看表结构确认分布键生效-- 查看表的分布信息 \d test_gp输出里Distributed by: (id)说明分布键正确。如果分布键不对数据会倾斜到某个 segment查询性能直接崩。验证完这些这套 Greenplum 环境就算真正跑通了。从那以后我每次装完 Greenplum都会强制走一遍gpstate→gp_segment_configuration→ 建表插数查询这三步少一步都不放心。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →