在Greenplum避坑指南系列的上一篇《“个人SQL跑了很长时间没有结果怎么办?》中,咱们介绍了解决SQL卡住和运行时间长的缘由和解决方案。今天,咱们将为你们讲一讲Greenplum用户在刚开始接触GP时常常会问的一个问题“Greenplum如何搭建?”以及一些避免掉坑的注意事项。html
Greenplum 是基于postgresql 技术研发的分布式数据库,相较于传统型数据库,分布式设计能带来较大的性能收益。正常安装须要多台节点,可是从学习和测试角度,咱们也能够在单节点上安装GPDB。Greenplum在不断的迭代版本,目前已经发布了v4.3.x, v5.x, v6.x 。关于这几个版本的区别,主要在于底层的postgresql 版本不一样,而且每一个大版本,Greenplum都有发布不少新的特性。具体能够参考对应版本的产品说明(release note):git
GPDB版本 | Postgresql 版本 | 产品说明 |
---|---|---|
4.3.x | 8.2.15 | 传送门 |
5.x | 8.3.23 | 传送门 |
6.x | 9.4.20 | 传送门 |
关于安装步骤,已经有很多的研究成果能够直接使用,能够参考Greenplum中文社区网站上的文章:github
https://greenplum.cn/2019/11/30/how-to-set-up-greenplum-6-1-cluster/sql
https://greenplum.cn/2019/04/29/greenplum-compile-install/docker
CSDN,简书等渠道上也有很多相关文章:数据库
https://blog.csdn.net/qq_15758463/article/details/75305138segmentfault
https://www.jianshu.com/p/5df4b37f4d5ccentos
https://www.lagou.com/lgeduarticle/70026.html
https://gitop.cc/posts/install-greenplum-in-docker/
https://www.jianshu.com/p/1d07d3a703b8bash
须要强调的是,不管哪一个版本安装,都建议和相应的官方文档进行核对,以确保使用正确的操做系统参数配置: session
对于在单节点上运行GPDB的用户,在运行gpinitsystem 的时候,能够添加一个参数 --max_connections=20,这会相应下降Greenplum对系统资源的占用。当设置master 实例最大链接数为20时,运行gpinitsystem时,Greenplum也会自动下降对应的segment 实例上的最大链接数。官方建议segment 实例的最大链接数为master 实例的3-5倍。
gpconfig -s max_connections
Values on all segments are consistent
GUC: max_connections
Master value: 20
Segment value: 60
若是须要后期对这个参数进行调整,可使用如下命令:
gpconfig -c max_connections -v 300 -m 60 (segment 300, master 50,重启后生效)
当运行gpinitsystem 成功后,为了下次访问更方便,咱们还须要设置一下环境变量。一个典型的环境设置以下:
source /usr/local/greenplum-db-x.x.x.x/greenplum_path.sh (GPDB库文件的所在地) export MASTER_DATA_DIRECTORY=/xxx/xxx/gpseg-xxx (主目录) export PGPORT=xxxx (master 实例的访问端口,不设就默认5432) export PGDATABASE=xxxx (默认链接的数据库,这个无关紧要)
若是这一个环境里只有一个集群,能够将以上信息写入~/.bashrc 中。若是一个环境里有多个集群,每次会手动选择启动须要的集群,那么能够分别建立不一样的环境变量文件。确保是文本文件便可。而后每次启动GPDB前,先载入对应的设置,好比:
source env_5100
source env_600
系统启动后,就可使用了。Greenplum 是一个分布式的数据库系统,用户数据都保存在各个子节点上。若是但愿调查数据分布状况,可使用Greenplm 自带的gp_dist_random() 函数。示例以下:
gpadmin=# select count(1), gp_segment_id from gp_dist_random('pg_class') group by 2; count | gp_segment_id -------+--------------- 440 | 9 440 | 14 440 | 19 440 | 3 gpadmin=# select oid,relname,gp_segment_id from gp_dist_random('pg_class') where relname='gp_pgdatabase_invalid'; oid | relname | gp_segment_id -------+-----------------------+--------------- 11968 | gp_pgdatabase_invalid | 11 11968 | gp_pgdatabase_invalid | 12 11968 | gp_pgdatabase_invalid | 13 11968 | gp_pgdatabase_invalid | 14
另外若是但愿单独链接到一个子实例上进行调查,能够用如下命令:
gpadmin=# select * from gp_segment_configuration where content=1 and role='p'; dbid | content | role | preferred_role | mode | status | port | hostname | address | replication_port ------+---------+------+----------------+------+--------+-------+----------+---------+------------------ 3 | 1 | p | p | s | u | 20134 | sdw3 | sdw3 | 24322 (1 row)
[gpadmin@mdw ~]$ gpstart -?|grep PG PGOPTIONS='-c gp_session_role=utility' psql
[gpadmin@mdw ~]$ PGOPTIONS='-c gp_session_role=utility' psql -h sdw3 -p 20134 gpadmin psql (8.3.23) Type "help" for help.
Master:
gpadmin=# select count(1) from test2; count ------- 9999 (1 row)
Segment (子实例):
gpadmin=# select count(1) from test2; count ------- 402 (1 row)
由于Greenplum 数据库也继承了很大部分的postgresql数据库的特性,日志系统也是如此。正常使用中,GPDB会分别在master 日志和各个segment 主实例中写入对应的日志。日志就保存在各个实例的pg_log/目录下。若是须要集中获取全部节点的segment 实例路径,能够经过如下语句完成:
gpadmin=# select e.fsedbid "segment id", e.fselocation "segment location",c.hostname "segment server" from pg_filespace_entry e, gp_segment_configuration c where e.fsedbid=c.dbid; segment id | segment location | segment server ------------+-------------------------------+---------------- 1 | /data/master_519/gpseg_519_-1 | mdw 2 | /data1/primary/gpseg_519_0 | sdw3 8 | /data1/primary/gpseg_519_6 | sdw4
通常出现问题,咱们能够先去master 实例的pg log 中查找PANIC /FATAL/ WARNING/ ERROR这些关键字。若是发现master 中提到了某个实例没法链接或者再也不响应,那么咱们就须要再到对应的segment 实例去查看日志信息。
说到日志,就不得不提日志等级。GPDB也使用log_min_messages 参数来控制pg log中产生日志的详细程度。默认这个参数设为WARNING,意思是WARNING 等级以上的错误才会记录下。若是须要更详细的信息,能够设为“INFO”。若是设到更高的DEBUG1 - DEBUG5 等级,那么日志文件中的信息就成倍增长。须要当心使用。
在segment 节点上的日志,每每会有不少重复出现的信息,咱们能够手动过滤一下,最标准的就是gpperfmon相关的日志。
cat gpdb-xxx.csv |grep -v perfmon |less
若是要调查primary 或者mirror 实例掉线的缘由,能够查找关键字 filerep 就会特别有效。
cat gpdb-xxx.csv |grep -v perfmon |grep filerep |less
拿到日志后,就能够分析错误缘由了。由于Greenplum 不只继承了许多postgresql 的特性,也包括了一部分bug。虽然在各个版本中在不断修复,可是也不能保证全部postgresql 的bug 都修复了。若是在日志中发现一些错误,可是又没法理解,那么就能够经过如下途径尝试或者自助支持:
关于做者
鄢柯(Shawn), Greenplum 产品支持专家。一直致力于协助全球Greenplum用户解决各种产品问题。