本文在Redhat 7.6环境使用Greenplum 6.9.0(部署在一台物理机上,2个segment)测试通过。 因为资源队列管理方式下,**超级管理员(SUPERUSER)不受资源队列限制**,所以下文将创建一个非超级管理员用户进行测试。 # 一、创建资源队列 ```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) ``` # 二、角色与资源队列 ```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新建用户无法登录问题](../安装与调试/Greenplum新建用户无法登录问题) ```bash # 仅需要修改master节点pg_hba.conf文件: [gpadmin@bogon ~]$ vim gpAux/gpdemo/datadirs/qddir/demoDataDir-1/pg_hba.conf # 追加: local all all trust ``` ## 数据库访问查询权限 以上只是登录权限,还需要给新用户赋予数据库访问权限: ```sql tpch1s=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO fairyfar; ``` ## 启用资源队列统计 如果需要使用pg\_stat\_resqueues视图统计资源队列状态,需要启用master节点的stats\_queue\_level参数: ```bash [gpadmin@bogon ~]$ vim gpAux/gpdemo/datadirs/qddir/demoDataDir-1/postgresql.conf stats_queue_level = on ``` ## 资源配置 注意statement\_mem与资源组MEMORY\_LIMIT关系。 ```sql tpch1s=# show statement_mem ; statement_mem --------------- 125MB (1 row) ``` # 四、测试 测试过程: - 以上创建了用户fairyfar,并关联新建的资源队列queue1,该资源队列限制并发数为2。 - 同时使用fairyfar用户执行2个长查询和1个短查询,例如,2个长查询为TPC-H q01,短查询仅查询region表。 - 与此同时,再使用超级用户(避免查询排队)登录第4个客户端,查询资源队列状态。 第1个客户端查询: ```sql tpch1s=> \i /opt/tpch/tpch1s_sql/1.sql ``` 第2个客户端查询: ```sql tpch1s=> \i /opt/tpch/tpch1s_sql/1.sql ``` 第3个客户端查询: ```sql tpch1s=> select count(*) from region; ``` 第4个客户端: ```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(短查询)处于排队等待状态。 # 五、参考 - [Greenplum资源队列初识](https://cloud.tencent.com/developer/article/1369185)