FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
Greenplum 6.9 资源队列(queue)示例

本文在Redhat 7.6环境使用Greenplum 6.9.0(部署在一台物理机上,2个segment)测试通过。

因为资源队列管理方式下,超级管理员(SUPERUSER)不受资源队列限制,所以下文将创建一个非超级管理员用户进行测试。

一、创建资源队列

snippet.sql
[gpadmin@bogon ~]$ psql -d tpch1s
-- 确认当前资源管理方式:
tpch1s=# SHOW gp_resource_manager;
 gp_resource_manager 
---------------------
 queue
(1 ROW)
 
-- 创建一个新的资源队列queue1:
tpch1s=# CREATE RESOURCE QUEUE queue1 WITH (ACTIVE_STATEMENTS=2, MEMORY_LIMIT='600MB');
CREATE QUEUE
 
-- 查询所有资源队列配置信息:
tpch1s=# SELECT * FROM pg_resqueue;
  rsqname   | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit 
------------+---------------+--------------+---------------+--------------------
 pg_default |            20 |           -1 | f             |                  0
 queue1     |             2 |           -1 | f             |                  0
(2 ROWS)

二、角色与资源队列

snippet.sql
-- 创建资源队列:
tpch1s=# CREATE ROLE fairyfar WITH LOGIN RESOURCE QUEUE queue1;
CREATE ROLE
 
-- 查询角色:
tpch1s=# \du
                                                          List OF roles
 ROLE name |                                                Attributes                                                | Member OF 
-----------+----------------------------------------------------------------------------------------------------------+-----------
 fairyfar  |                                                                                                          | {}
 gpadmin   | Superuser, CREATE ROLE, CREATE DB, Ext gpfdist TABLE, Wri Ext gpfdist TABLE, Ext http TABLE, Replication | {}
 
-- 查询角色与资源队列关联关系:
tpch1s=# SELECT rolname, rsqname FROM pg_roles, pg_resqueue WHERE pg_roles.rolresqueue = pg_resqueue.oid;
 rolname  |  rsqname   
----------+------------
 gpadmin  | pg_default
 fairyfar | queue1
(2 ROWS)
 
-- 可以尝试以下查询,试试效果:
SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status
WHERE pg_roles.rolresqueue = gp_toolkit.gp_resqueue_status.queueid;

三、配置

登录权限

默认情况下,新建用户无法登录数据库,需要修改master节点的pg_hba.conf(以下方法是开放所有用户权限)。

请参考:Greenplum新建用户无法登录问题

snippet.bash
# 仅需要修改master节点pg_hba.conf文件:
[gpadmin@bogon ~]$ vim gpAux/gpdemo/datadirs/qddir/demoDataDir-1/pg_hba.conf
# 追加:
local    all         all             trust

数据库访问查询权限

以上只是登录权限,还需要给新用户赋予数据库访问权限:

snippet.sql
tpch1s=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO fairyfar;

启用资源队列统计

如果需要使用pg_stat_resqueues视图统计资源队列状态,需要启用master节点的stats_queue_level参数:

snippet.bash
[gpadmin@bogon ~]$ vim gpAux/gpdemo/datadirs/qddir/demoDataDir-1/postgresql.conf
stats_queue_level = on

资源配置

注意statement_mem与资源组MEMORY_LIMIT关系。

snippet.sql
tpch1s=# SHOW statement_mem ;
 statement_mem 
---------------
 125MB
(1 ROW)

四、测试

测试过程:

  • 以上创建了用户fairyfar,并关联新建的资源队列queue1,该资源队列限制并发数为2。
  • 同时使用fairyfar用户执行2个长查询和1个短查询,例如,2个长查询为TPC-H q01,短查询仅查询region表。
  • 与此同时,再使用超级用户(避免查询排队)登录第4个客户端,查询资源队列状态。

第1个客户端查询:

snippet.sql
tpch1s=> \i /opt/tpch/tpch1s_sql/1.sql

第2个客户端查询:

snippet.sql
tpch1s=> \i /opt/tpch/tpch1s_sql/1.sql

第3个客户端查询:

snippet.sql
tpch1s=> SELECT COUNT(*) FROM region;

第4个客户端:

snippet.sql
tpch1s=# SELECT * FROM gp_toolkit.gp_resqueue_status; SELECT * FROM pg_stat_resqueues;
 queueid |  rsqname   | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqmemorylimit | rsqmemoryvalue | rsqwaiters | rsqholders 
---------+------------+---------------+---------------+--------------+--------------+----------------+----------------+------------+------------
    6055 | pg_default |            20 |             0 |           -1 |            0 |    3.14573e+08 |              0 |          0 |          0
   24693 | queue1     |             2 |             2 |           -1 |         2280 |    5.24288e+08 |    5.24288e+08 |          1 |          2
(2 ROWS)
 
 queueid | queuename  | n_queries_exec | n_queries_wait | elapsed_exec | elapsed_wait 
---------+------------+----------------+----------------+--------------+--------------
    6055 | pg_default |              0 |              0 |            0 |            0
   24693 | queue1     |             23 |              9 |          418 |          138
(2 ROWS)

从第4个客户端的统计信息可以看到:

  • queue1资源队列并发限制为2。
  • 客户端1和2执行查询过程中,客户端3(短查询)处于排队等待状态。

五、参考



打赏作者以资鼓励: