【Greenplum避坑指南 II 】Greenplum 环境搭建和基本查错

在Greenplum避坑指南系列的上一篇《“我的SQL跑了很长时间没有结果怎么办?》中,我们介绍了解决SQL卡住和运行时间长的原因和解决方案。今天,我们将为大家讲一讲Greenplum用户在刚开始接触GP时经常会问的一个问题“Greenplum如何搭建?”以及一些避免掉坑的注意事项。

Greenplum 是基于postgresql 技术研发的分布式数据库,相较于传统型数据库,分布式设计能带来较大的性能收益。正常安装需要多台节点,但是从学习和测试角度,我们也可以在单节点上安装GPDB。Greenplum在不断的迭代版本,目前已经发布了v4.3.x, v5.x, v6.x 。关于这几个版本的区别,主要在于底层的postgresql 版本不同,并且每个大版本,Greenplum都有发布很多新的特性。具体可以参考对应版本的产品说明(release note):

关于安装步骤,已经有不少的研究成果可以直接使用,可以参考Greenplum中文社区网站上的文章:

CSDN,简书等渠道上也有不少相关文章:

需要强调的是,无论哪个版本安装,都建议和相应的官方文档进行核对,以确保使用正确的操作系统参数配置:

GPDB v4.3.x

(https://gpdb.docs.pivotal.io/43330/install_guide/prep_os_install_gpdb.html)

GPDB v5.x

(https://gpdb.docs.pivotal.io/5250/install_guide/prep_os_install_gpdb.html)

GPDB v6.x

(https://gpdb.docs.pivotal.io/6-4/install_guide/prep_os.html)

对于在单节点上运行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 实例进行查询和在子实例进行查询的不同结果

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 都修复了。如果在日志中发现一些错误,但是又无法理解,那么就可以通过以下途径尝试或者自助支持:

  1. Greenplum 中文社区:https://greenplum.cn;Greenplum 英文社区:https://greenplum.org/ 这里有大量的技术博文可供参考;
  2. Greenplum中文问答网站:https://askgp.chapterx.cn/;这是Greenplum中文社区为用户和开发者提供的问答和交流专区,在这里,Greenplumer可以提出、解答问题,并沉淀优质问答内容,帮助社区成员的学习和进步;英文社区:https://community.pivotal.io/s/topic/0TO0P000000IKdLWAW/pivotal-greenplum。这里有大量的Greenplum 用户的英文版提问和解答;
  3. Github 站点 :https://github.com/greenplum-db/gpdb。对于能力较强的用户,也可以直接访问Greenplum 的github 站点,这里有大量的Greenplum已公开的代码,以及问题讨论;
  4. Greenplum技术群组,这里有很多的技术大牛,扫描文章底部的二维码,或者搜索gp_assistant,将有专人拉你入群;
  5. Postgresql 社区。无论中文或者英文社区,postgresql 庞大的用户量和代码开源,都吸引力大量的用户。往往我们使用搜索引擎,就能找到很多需要的答案。

关于作者

鄢柯(Shawn), Greenplum 产品支持专家。一直致力于协助全球Greenplum用户解决各类产品问题。


关注微信公众号

VMware 中国研发中心

Greenplum官方技术交流群

扫码添加小助手即可入群,添加时请备注 “GP网站”