因为想帮忙师兄做实验, 需要编译搭建 greenplum 数据库环境, 故在师兄建议下于 2020/2/26 写下此文.
Greenplum 是一个采取 MPP 架构(分布式), 用于大数据的开源新型数据库, 底层采取了传统关系数据库 PostgreSQL 进行存储与操作.
官网: https://greenplum.org/
中文: https://greenplum.cn/
GitHub 项目: https://github.com/greenplum-db/gpdb
在中文官网上你是可以找到 greenplum 编译安装的中文文档的, 但是这份文档非常的简洁, 对实际安装中可能会出现的错误基本没有提及. 所以如果按照它进行安装可能会导致你在反复碰到莫名 bug 时感到异常痛苦.
首先, 在具体安装步骤前, 我先提及一下系统问题. 我们知道许多软件都声明自己是支持多平台的, 甚至会以自己平台移植性作为优势进行宣传, 但是这种支持大多是运行支持而不是编译支持. 你在自己本地环境上跑起来了这个程序, 难度你以为你的环境就足够编译它了吗? 本人在配置环境中踩到最大的坑就是系统坑. 我首先采取的是 VMvare15 挂载 Centos8 虚拟机, 我在下载完 GitHub 项目提供的依赖项后, 在编译过程中困难重重, 从找不到库开始报错, 一直报到语法错误. 最后因为一个系统配置错误我出现 gnome 桌面循环登录, 不得已放弃了 centos8 去尝试 centos7. 然而尝试 centos7 后, 令人惊奇的是, 在 centos7 下你按照 GitHub 教程来基本没有报错, 极少出现缺包现象, 这一路顺风顺水, 相比 centos8 的尝试简直让人感动地落泪.
在编译安装中, 最常见的问题就是依赖库不匹配, 或者得不到满足. 系统不是官方编译的系统, 一方面很可能让你下载不到合适的库, 另一方面下载下来的库可能不匹配需求从而导致后续编译中出现不可思议的语法报错. greenplum 虽然一直在更新升级, 但是 GitHub 上提供的安装依赖库指南却不能及时满足新系统. 所以建议选择长时间较为稳定的系统版本, 如果程序有推荐系统, 务必选择推荐系统.
言归正传.
第一步, 开始准备 gpdb 的环境依赖.
https://github.com/greenplum-db/gpdb/blob/master/README.linux.md
该链接介绍了不同系统下, 基础依赖库的安装和一些配置, 我是 CentOS 系统, 也就是按照其中第一个区域进行操作.
因为依赖库中包括 python 库, 所以如果发现下载中有报红错一般不要急, 大多是下载超时, 多执行几遍下载脚本就可以了.
配置完 ld.so.conf 后记得 sudo ldconfig, 普通用户模式是无法创建缓存文件的.
在操作完后, 下拉 GitHub 页面会有一个 Common Platform Tasks, 继续配置环境.
如果你想用它的自动脚本创建 gpadmin 和交换密钥, 建议跳入 root 后再执行. 普通用户直接执行会失败.
然后测试 SSH 连接自己是否可以不用输密码. SSH 地址的格式是 user@ip(Eg:root@192.168.0.1), 但是这个地方其实你不用查自己的 ip, 直接用 localhost 代表自己就可以了(SSH localhost).
做到 SSH 测试这一步, 如果你发现自己明明已经把生成的密钥放入指定文件夹了, 但是连接中还是提示输入密码, 那么很可能就是你的 SSH 配置文件默认取消了密钥登录, 或者配置文件权限问题, 附参考链接(http://www.mamicode.com/info-detail-2128504.html).
配置文件默认取消密钥登录的话
vi /etc/SSH/sshd_config
确保 PubkeyAuthentication yes
现在如果你把上述操作都完成了, 那么你就到了整个安装中我碰见最坑的地方了.
GitHub 原文中这里需要你输入一些配置命令, 给的命令包含对 sysctl 和 security 的修改.
其中对 sysctl 的修改有一句话在我的尝试中证实会导致 centos7 和 centos8 在 VMvare 挂载的虚拟机中陷入无限登录问题.
vm.overcommit_memory = 2
就是上面这句话, 放到百度上搜索你会发现这句话意思是内核允许分配超过所有物理和交换空间总和的内存. 这会导致 gnome 桌面在初始化时失败, 从而反复登录.
在碰到无限登录问题时, 我用 ctrl+alt+F2 切入第二工作区, 查看 var/log/messages 系统日志, 发现了 gnome 在启动后出现无法初始化分配内存的报错. 我当时很疑惑, 难道是我虚拟机分配内存太小了吗, 我当即把内存调到上限 3G, 但是问题没有解决, 我大致猜到应该是有命令调整了内核内存利用, 然后试出这一点.
我在删除了这句话后重启系统, 系统就一切正常了.
另外关于系统配置的一点就是, 在配置完 sysctl.conf 后一般用 sysctl -p 来刷新, 和重启效果是一样的, 如果在安装步骤中你没有刷新也没有重启那么, 在安装完毕后, 如果你直接尝试项目样例架起服务器, 你可能会发现平行节点架不起来. 查看日志发现 segment 内核内存分配不足.
配置步骤结束后就到了安装 gporca 了.
第二部, 安装 gporca.
在 GitHub greenplum-db 的首页其实有讲两种方式, 一种是脚本安装, 一种是自己手动 clone gporca 项目再配置环境编译 gporca. 大家肯定会想, 脚本安装多简单啊, 四行命令直接敲完. 但是实际上的经历会有这么简单么? 我脚本安装完后, gpdb 在 configure 那一步亲切地告诉我安装的 gpoca 版本不对, 让我滚回去重新装. 这时候我才发现给了脚本又给详细手动安装步骤的八成脚本靠不住. 没有办法只有重新手动安装, 并且手动安装后需要刷新缓存也就是之前执行过的 sudo ldconfig 这步命令, 否则仍然会继续报错版本不匹配.
gporca 库(README):https://github.com/greenplum-db/gporca
关于 gporca 手动安装其实非常有趣, 因为你要手动编译它, 你就得先手动编译出它需要的库.
GP-Xerces: https://github.com/greenplum-db/gp-xerces
这个直接装就可以了, 它可能还要你 cmake3, 这个一般直接 apt 或者 yum 下也就可以了.
但是 ninja 编译器, 恭喜你 yum 不能直接下到, 得去 GitHub 上 clone 到本地然后再编译, 开不开心, 惊不惊喜.
ninja:https://github.com/ninja-build/ninja.git
ninja 的 README 里有写怎么编译, 我就不说了但是注意, ninja 需要的 re2c 这个包一般需要自己下, centos7 yum 可以解决, 故不必烦恼.
ninja 编译完后, 记得把文件夹里 ninja 这个文件搬运到 / usr/bin 下, 否则 gporca 找不到.
等这些都做完, 你终于可以开始编译 gporca 了, 完成后记得之前说的刷新缓存.
第三步, 编译 gpdb.
绕了一大圈, 终于给绕回来了, 一般按照 GitHub 上面的命令做就好了, 如果你有特殊的要求也可以往下翻翻 (不是翻我这篇文章是翻 GitHub 文档) 找找其他配置项.
到这里如果上面提到的部分都做的很好, 基本上应该不会出现问题, make 的时候可能出现权限不够写不入某些文件夹的情况, 基本上改 sudo 就可以了, 但是注意不要 root 去开服务器, 你开不起来的, 官方是不允许 root 去架服务器的, 原理很简单, 程序用你的 root 身份到处生成文件, 完事后哪个用户有权限去修改运行访问你生成的架构, 那不是平添麻烦嘛. 这也是我们 gpadmin 存在的意义.
说到 gpadmin, 我的经验是不创造 gpadmin 也可以, 你可以用自己的原用户, 但是注意把 SSH key 交换做好, 如果 gpadmin 出现无权限运行的情况, 直接用原用户执行也可以. 但是如果没交换好 SSH key 那么连接出错是肯定架不起来的, 或者在架服务器中不断让你输入密码, 这基本也就是失败了.
然后要补充的一点就是, 如果发现实测中连接主服务器超时, 连接不上, 以防万一你把防火墙给闭了最好.
sysctl stop firewalld (root 运行最好)
以上差不多是我走过的全部坑了, 写的比较零碎, 有机会再整理吧, 如果你安装 greenplum 出现问题也欢迎和我探讨.
下附参考文献:
- https://www.cnblogs.com/qiannianyuan/p/greenplum_compile.html (一定要看! 超级大佬的详细描述和我的经验可以互补)
- https://www.cnblogs.com/GO-NO-1/p/8058603.html(SSH 问题解决和一般配置)
- http://blog.chinaunix.net/uid-30401178-id-5159439.html(vm.overcommit_memory = 2 解释说明)
剩下还有好多关于一些 Linux 工具的用法和文件配置的文章我就不列了(我是真的记不起来了), 但是感谢他们的作者.
来源: http://www.jianshu.com/p/b077093398d9