Greenplum是一款广泛应用的开源MPP数据库的产品,兼容PostgreSQL生态,被广泛应用与大数据的存储与分析。
Resource Group是Greenplum的一种资源管理方式。Resource Group由GP5开始被支持,相比于早期的Resource Queue的资源管理方式,具有支持更细粒度的资源管理、 支持组内资源共享等优点。本文会介绍Resource Group的使用方式,从源码角度分析它的实现,以及介绍一些使用中遇到的高频问题。
Resource Group简介
Resource Group是Greenplum的一种资源管理方式,能够细粒度定义对不同数据库角色(用户)的资源使用限制,支持通过SQL语句的方式进行配置。Resource Group支持进行三种类型的资源限制:并发限制、CPU限制、内存限制。
超级用户可以通过SQL在数据库内定义多个资源组,并设置每个资源组的资源限制。在一个数据库中,每个资源组可以关联一个或多个数据库用户,而每个数据库用户只能归属于单个资源组。资源组支持的资源限制配置如下:
CONCURRENCY | 资源组中允许的最大并发事务数,包括活动和空闲事务。 |
CPU_RATE_LIMIT | 此资源组可用的CPU资源百分比。 |
CPUSET | 为该资源组保留的CPU核心数。 |
MEMORY_LIMIT | 该资源组可用的内存资源百分比。 |
MEMORY_SHARED_QUOTA | 提交到该资源组的事务之间共享的内存资源百分比。 |
MEMORY_SPILL_RATIO | 内存密集型事务的内存使用阈值。当事务达到此阈值时,它将溢出到磁盘。 |
CONCURRENCY代表最大并发事务数;CPU_RATE_LIMIT代表以百分比形式限制CPU使用,各个资源组设置的CPU_RATE_LIMIT之和不超过100%;CPUSET代表以CPU核的形式限制CPU,设置具体使用哪几个CPU逻辑核;MEMORY_LIMIT代表资源组最多能占用的集群可用内存的百分比,由MEMORY_LIMIT设定的部分属于资源组的固定份额,而各个资源组MEMORY_LIMIT之和低于100%的部分,被划分所有资源组的共享内存池;MEMORY_SHARED_QUOTA代表资源组内用于各个事务共享的内存比例;MEMORY_SPILL_RATIO代表溢出到磁盘的内存使用阈值。
CREATE RESOURCE GROUP rgroup1 WITH (CONCURRENCY=10, CPU_RATE_LIMIT=20, MEMORY_LIMIT=25, MEMORY_SHARED_QUOTA=20, MEMORY_SPILL_RATIO=20);
除了Resource Group,GP早期还支持Resource Queue的资源管理方式, Resource Queue通过指定MEMORY_LIMIT、ACTIVE_STATEMENTS、PRIORITY、MAX_COST字段,配置对于各个资源队列的内存、CPU、并发限制,Resource Group相对Resource queue存在以下优势:
特性 | Resource Groups | Resource Queues |
CPU管理 | 细粒度(Cgroup) | 基于粗粒度的优先级 |
内存限制 | 细粒度 | 粗粒度 |
并发控制 | 事务级别 | 语句级别 |
管理DDL、Utility语句 | 是 | 否 |
segment级别监控 | 是 | 否 |
组内内存共享 | 是 | 否 |
Resource Group通过Master上的并发锁实现对并发的限制,通过cgroup实现对cpu的限制,支持对内存基于vmtracker和cgroup进行两种方式的限制。
Resource Group使用
创建资源组
使用CREATE RESOURCE GROUP命令创建新资源组。
为角色创建资源组时,必须提供CPU_RATE_LIMIT或CPUSET和MEMORY_LIMIT限制值。这些限制标识要分配给此资源组的数据库资源的百分比。例如,要创建名为rgroup1的资源组,其CPU限制为20,内存限制为25:
CREATE RESOURCE GROUP rgroup1 WITH (CPU_RATE_LIMIT=20, MEMORY_LIMIT=25);
CPU限制为20由rgroup1分配到的每个角色共享。同样,内存限制为25由rgroup1分配到的每个角色共享。rgroup1使用默认的MEMORY_AUDITOR vmtracker和默认的CONCURRENCY设置为20。
数据库包含两个默认资源组:admin_group和default_group。启用资源组时,将为未明确分配资源组的任何角色分配角色功能的默认组。SUPERUSER角色分配了admin_group,非管理员角色分配了名为default_group的组。
使用以下资源限制创建默认资源组admin_group和default_group:
限制类型 | admin_group | default_group |
CONCURRENCY | 10 | 20 |
CPU_RATE_LIMIT | 10 | 30 |
CPUSET | -1 | -1 |
MEMORY_LIMIT | 10 | 30 |
MEMORY_SHARED_QUOTA | 50 | 50 |
MEMORY_SPILL_RATIO | 20 | 20 |
MEMORY_AUDITOR | vmtracker | vmtracker |
默认资源组admin_group和default_group的CPU_RATE_LIMIT和MEMORY_LIMIT值对分段主机上的总百分比有贡献。
将资源组分配给角色
Greenplum资源组可用于分配给一个或多个角色(用户)。使用CREATE ROLE或ALTER ROLE命令的RESOURCE GROUP子句将资源组分配给数据库角色。如果未为角色指定资源组,则会为角色分配角色功能的默认组。SUPERUSER角色分配了admin_group,非管理员角色分配了名为default_group的组。
使用ALTER ROLE或CREATE ROLE命令将资源组分配给角色。例如:
ALTER ROLE bill RESOURCE GROUP rg_light;
CREATE ROLE mary RESOURCE GROUP exec;
用户可以将资源组分配给一个或多个角色。如果已定义角色层次结构,则将资源组分配给父角色不会向下传播到该角色组的成员。
如果要从角色中删除资源组分配并将角色分配为默认组,请将角色的组名称分配更改为NONE。例如:
ALTER ROLE mary RESOURCE GROUP NONE;