再读greenplum的admin guide文档

来源:互联网 发布:java 局部变量表 编辑:程序博客网 时间:2024/06/05 04:10

master

The master is where the global system catalog resides. The global system catalog is the set of system tables that contain metadata about the Greenplum Database system itself.
master负责的内容包括:
* authenticates client connections
* processes incoming SQL commands
* distributes workloads among segments
* coordinates the results returned byeach segment
* presents the final results to the client program.

The key to obtaining the best performance from Greenplum Database is to distribute data and workloads evenly across a large number of equally capable segments so that all segments begin working on a task simultaneously and complete their work at the same time.

工具包

$GPHOME/bin

vacuum

每20亿事务执行后,需要执行一次数据库级别的vaccum动作,不然会导致XID wraparound
xid_warn_limitxid_stop_limit是两个可设定的值,越界后,会导致如下两种情况:

WARNING: database database_name must be vacuumed within number_of_transactions transactions
FATAL: database is not accepting commands to avoid wraparound data loss in database "database_name"

vaccum,建议每天执行一次,可以避免表空间增长过快,尤其是在进行过大量的update和delete后操作,效果更好。它的实现是根据table's free space map来进行的。
vaccum full,会重写表数据,会做的更彻底。这个操作执行的时候,一定要保证磁盘空间充足。执行的时候会锁住表,所以此命令最好在运维修复环境的时候执行。

analyze

主要用来收集元数据信息,statistics
statistics主要是optimizer在做查询计划的时候用,保存在system catalog里。
有三个办法可以触发收集信息:
1. 数据库内执行analyze
2. linux系统命令行,执行analyzedb
3. 配置gp,在收到DML操作的时候,自动进行收集

analyze的目的是收集元数据信息,进而使得optimizer做查询计划时候更合理,进而导致更快的查询速度。但是如果查询规划不符合预期效果,可以查实修改gp_analyze_relative_error,默认是0.25,可以调整的更低一些,这样收集的元数据信息会更准确,但是会带来更多的磁盘消耗和analyze执行所需的时间。

analyze还有另一个可以调整的参数,default_statistics_target,但是作用还没看明白。

analyze可以基于一个表内的几列来做。

system statistics

在执行vaccumanalyze的时候会进行收集信息的update

pg_class

收集了表信息:rows和pages
表pg_class
列:

  • reltuples
  • relpages

当reltuples和select count(*)的结果差异较大的时候,就应该执行analyze或者vaccum了
当reindex命令执行后,reltuples和relpages会被置零。

pg_statistic & pg_stats

pg_statistic保存了上一次analyze执行后各表的statistics信息。

查看无statistics信息的表

select * from gp_toolkit.gp_stats_missing;

创建了一个表,插入了一条数据,做过analyze后,missing表里还有这个表的信息,不知道为什么。

segment mirror

segment有两个角色primay和mirror,mirror就是备份的计算单元。
mirror的分布有两种,一个是group mirroring,一个是spread mirroring。第一种保证mirror不和primary分布在同一台计算节点上,其他的就没有了。第二种相当于自定义的,开源社区讨论有说用4个计算节点做一个小圈,其实就是数学上的概念,尽量均衡分布segment,可以容错更多的物理服务器宕机场景。

segment的分布有两种方案:

  • group mirroring
  • spread mirroring

group mirroring,是默认方案,spread mirroring,是自定义方案。
spread mirroring可以让用户自行配置mirror segment放置的位置。基于数学计算,可以用4个物理服务器组成一个小圈,能够达到这样一个效果:如果1个物理机宕机,这个物理机上的segment会被均衡地在其他三台机器上激活。而group mirroring方案,很有可能会导致segment负责不均衡。

legacy optimizer

legacy optimizer有如下控制参数,决定一些开关:

enable_bitmapscanenable_groupaggenable_hashaggenable_hashjoinenable_indexscanenable_mergejoinenable_nestloopenable_seqscanenable_sortenable_tidscangp_enable_adaptive_nestloopgp_enable_agg_distinctgp_enable_agg_distinct_pruninggp_enable_direct_dispatchgp_enable_fallback_plangp_enable_fast_srigp_enable_groupext_distinct_ gathergp_enable_groupext_distinct_ pruninggp_enable_multiphase_agggp_enable_predicate_ propagationgp_enable_preuniquegp_enable_sequential_window_ plansgp_enable_sort_distinctgp_enable_sort_limit

下面这些参数,是legacy optimizer的调优参数,但是参数相互之间有关联,所以官方不建议随意调整:

cpu_index_tuple_costcpu_operator_costcpu_tuple_costcursor_tuple_fractioneffective_cache_sizegp_motion_cost_per_rowgp_segments_for_plannerrandom_page_costseq_page_cost

调优可以从如下几个方面进行:
1. statistics收集(analyze相关参数调整)
2. sort
3. aggregate
4. join

增量备份

greenplum支持增量备份,备份原理是:第一次进行一次完整备份,后续仅仅对表内,有数据修改的分区数据,进行备份。
这种备份方式要求:第一次完整备份,以及后续所有的增量备份都存在,才能进行数据恢复。
所以,对分区规划合理,且数据修改量不大的场景下,增量备份很合适。

检查系统

查看状态

gpstategpstate -sgpstate -mgpstate -cgpstate -f

磁盘使用

磁盘水位设定为70%比较合适,过多数据需要告警。整体磁盘使用情况:

test=# SELECT * FROM gp_toolkit.gp_disk_free ORDER BY dfsegment; dfsegment | dfhostname | dfdevice  |   dfspace   -----------+------------+-----------+-------------         0 |  c1        |  /dev/sdb | 27310544940         1 |  c2        |  /dev/sdb | 27310407392         2 |  c1        |  /dev/sdb | 27310544940         3 |  c1        |  /dev/sdb | 27310544940         4 |  c1        |  /dev/sdb | 27310544940         5 |  c1        |  /dev/sdb | 27310544940         6 |  c1        |  /dev/sdb | 27310544940         7 |  c1        |  /dev/sdb | 27310544940         8 |  c1        |  /dev/sdb | 27310544940         9 |  c2        |  /dev/sdb | 27310407392        10 |  c2        |  /dev/sdb | 27310407392        11 |  c2        |  /dev/sdb | 27310407392        12 |  c2        |  /dev/sdb | 27310407392        13 |  c2        |  /dev/sdb | 27310407392        14 |  c2        |  /dev/sdb | 27310407392        15 |  c2        |  /dev/sdb | 27310407392(16 rows)

数据库的磁盘使用情况:

test=# SELECT * FROM gp_toolkit.gp_size_of_database ORDER BY sodddatname;   sodddatname   | sodddatsize -----------------+------------- bi_test         |   178258150 db1             |   178257994 db_jiaotongting |   929011582 expand          |   179568878 gelu_test       |   183533798 test            | 18948220574 test4           |   178356302 test5           |   178257994(8 rows)

表的磁盘使用情况:

test=# SELECT relname AS name, sotdsize AS size, sotdtoastsize test-#    AS toast, sotdadditionalsize AS other test-#    FROM gp_toolkit.gp_size_of_table_disk as sotd, pg_catalog.pg_class test-#    WHERE sotd.sotdoid=pg_class.oid ORDER BY relname;          name           |    size     | toast  |   other    -------------------------+-------------+--------+------------ liqingyue_2step2_dxttmp |       32768 | 557056 |          0 t1                      |           0 |      0 |          0 t1                      |       32768 |      0 |          0 test_gpfdist_import     |   147324928 |      0 |          0 test_import_twl         |    73793536 |      0 |          0 test_insert_row         |    81330176 |      0 |          0 test_insert_row_a       |   124588216 |      0 | 2041380864 test_insert_row_c       |    42385000 |      0 | 1586626560 test_insert_row_f1      |   119013376 |      0 |          0 test_scp_import         | 14221213696 |      0 |          0(10 rows)

索引的磁盘使用情况:

test-#    FROM pg_catalog.pg_class, gp_toolkit.gp_size_of_indextest-#    WHERE pg_class.oid=gp_size_of_index.soioid test-#    AND pg_class.relkind='i'; soisize  |       indexname       ----------+----------------------- 47513600 | test_insert_row_a_f1 47742976 | test_insert_row_f1_f5 47611904 | test_insert_row_f1_f4 47284224 | test_insert_row_f1_f3 47611904 | test_insert_row_f1_f2 47874048 | test_insert_row_f1_f1  7110656 | test_insert_row_c_f5  7110656 | test_insert_row_c_f4  7110656 | test_insert_row_c_f3  7110656 | test_insert_row_c_f2  7143424 | test_insert_row_c_f1   589824 | t1_pkey(12 rows)

检查数据分布

查看某表的结构,包含distributed key情况:

test=# \d+ t1;                          Table "public.t1" Column |         Type          | Modifiers | Storage  | Description --------+-----------------------+-----------+----------+------------- i1     | integer               | not null  | plain    |  i2     | integer               |           | plain    |  s1     | character varying(40) |           | extended | Indexes:    "t1_pkey" PRIMARY KEY, btree (i1)Has OIDs: noDistributed by: (i1)

查看表t1在各个segment上的数据分布情况

test=#  SELECT gp_segment_id, count(*) test-#    FROM t1 GROUP BY gp_segment_id; gp_segment_id | count ---------------+-------             4 |     1            14 |     1            15 |     1             3 |     1             8 |     1            10 |     1             9 |     1(7 rows)

检查各连接session的内存使用

当有sql语句因为内存异常的时候,我们可以通过这个方法去检查内存使用情况。
1. 输入数据库名字,执行

$ psql -d db_name -f $GPHOME/share/postgresql/contrib/gp_session_state.sql
  1. 查询
test=# SELECT * from session_state.session_level_memory_consumption ;     datname     | sess_id | usename |                         current_query                          | segid | vmem_mb | is_runaway | qe_count | active_qe_count | dirty_qe_count | runaway_vmem_mb | runaway_command_cnt -----------------+---------+---------+----------------------------------------------------------------+-------+---------+------------+----------+-----------------+----------------+-----------------+--------------------- test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     0 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     8 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     4 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |    10 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |    11 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |    15 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     6 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     3 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |    13 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     5 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     2 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |    12 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     1 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     7 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |     9 |       2 | f          |        1 |               1 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |    14 |       2 | f          |        1 |               1 |             -1 |               0 |                   0                 |       6 |         |                                                                |    -1 |       1 | f          |        1 |               1 |             -1 |               0 |                   0 postgres        |       9 | gpadmin | <IDLE>                                                         |    -1 |       1 | f          |        1 |               0 |             -1 |               0 |                   0 db_jiaotongting |      18 | gpadmin | <IDLE>                                                         |    -1 |       2 | f          |        1 |               0 |             -1 |               0 |                   0 db_jiaotongting |      19 | gpadmin | <IDLE>                                                         |    -1 |       2 | f          |        1 |               0 |             -1 |               0 |                   0 test4           |     473 | gpadmin | <IDLE>                                                         |    -1 |       2 | f          |        1 |               0 |             -1 |               0 |                   0 test            |      79 | gpadmin | SELECT * from session_state.session_level_memory_consumption ; |    -1 |       9 | f          |        1 |               1 |             -1 |               0 |                   0 postgres        |      76 | gpadmin | <IDLE>                                                         |    -1 |       4 | f          |        1 |               0 |             -1 |               0 |                   0 postgres        |     472 | gpadmin | <IDLE>                                                         |    -1 |       2 | f          |        1 |               0 |             -1 |               0 |                   0 db_jiaotongting |     474 | gpadmin | <IDLE>                                                         |    -1 |       2 | f          |        1 |               0 |             -1 |               0 |                   0(25 rows)test=# SHOW   runaway_detector_activation_percent; runaway_detector_activation_percent ------------------------------------- 90(1 row)

blocksize

在创建表的时候,可以选择blocksize,也可以为个别列指定blocksize。
blocksize过大,会导致内存消耗过大,而且磁盘IO也有影响。如果对于客户数据量不大的情况,为了提升性能,可以考虑手工配置blocksize为较小的值。
配置范围:8192 到 2097152字节,默认是32768

数据库操作

不支持跨库查询(cross-query between databases)。
所有数据库都支持作为模板,新建的数据库会包含模板库的所有主体(objects)和数据。

常用系统模式system schemas

pg_catalog
information_schema
pg_toast
pg_bitmapindex
pg_aoseg
gp_toolkit

0 0
原创粉丝点击