因为想帮忙师兄做实验, 需要编译搭建greenplum数据库环境, 故在师兄建议下于2020/2/26写下此文.
Greenplum是一个采取MPP架构(分布式), 用于大数据的开源新型数据库, 底层采取了传统关系数据库postgreSQL进行存储与操作。
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工具的用法和文件配置的文章我就不列了(我是真的记不起来了),但是感谢他们的作者。