在任意时刻,OushuDB中可能有很多个并发的查询在运行。这些查询属于不同的用户。用户的优先级可能有高有低。我们需要一种方式 来合理的给各个用户分配其可以使用的系统资源,包括CPU和内存等。

OushuDB使用资源队列(Resource Queues)来管理整个系统的资源。每一个OushuDB用户都和一个资源队列关联,该用户发出的所有查询 都会使用该关联的资源队列中的资源。我们可以创建多个资源队列,资源队列之间形成一种树状结构。例如下图:

打开网易新闻 查看精彩图片

图 OushuDB资源队列

其中pg_root和pg_default系统默认已经创建的资源管理队列。pg_root是资源队列树的根。pg_default是其子队列。

当一个用户被创建的时候,默认会被分配到pg_default队列。

下面的语句创建了一个资源队列ceo_report。指定了其最大的并发查询数为20。另外,该队列使用了其父亲队列pg_root的30%内存和CPU资源。

CREATE RESOURCE QUEUE ceo_report WITH (PARENT='pg_root', ACTIVE_STATEMENTS=20,MEMORY_LIMIT_CLUSTER=30%, CORE_LIMIT_CLUSTER=30%);

其中的三个配置参数的意义如下:

  • ACTIVE_STATEMENTS:资源队列允许的最大并发查询数,超过这个并发的连接则会排队等待。资源管理器会均匀分配资源到队列中并发的查询。
  • MEMORY_LIMIT_CLUSTER:资源队列可以使用的父队列内存的比例
  • CORE_LIMIT_CLUSTER:资源队列可以使用的父队列CPU的比例

现在我们可以创建一个用户,使用该资源管理队列:

CREATE ROLE kurt WITH LOGIN RESOURCE QUEUE ceo_report;

这样的话,kurt用户发出的所有查询将使用ceo_report中的资源。

通过下面的命令可以创建上图中的其他的资源队列:

CREATE RESOURCE QUEUE department1 WITH (PARENT='pg_root', ACTIVE_STATEMENTS=10,MEMORY_LIMIT_CLUSTER=5%, CORE_LIMIT_CLUSTER=5%);CREATE RESOURCE QUEUE adhoc1 WITH (PARENT='department1', ACTIVE_STATEMENTS=5,MEMORY_LIMIT_CLUSTER=50%, CORE_LIMIT_CLUSTER=50%);CREATE RESOURCE QUEUE daily_batch WITH (PARENT='department1', ACTIVE_STATEMENTS=5,MEMORY_LIMIT_CLUSTER=50%, CORE_LIMIT_CLUSTER=50%);CREATE RESOURCE QUEUE department2 WITH (PARENT='pg_root', ACTIVE_STATEMENTS=5,MEMORY_LIMIT_CLUSTER=5%, CORE_LIMIT_CLUSTER=5%);CREATE RESOURCE QUEUE monthly_report WITH (PARENT='department2', ACTIVE_STATEMENTS=2,MEMORY_LIMIT_CLUSTER=100%, CORE_LIMIT_CLUSTER=100%);CREATE RESOURCE QUEUE department3 WITH (PARENT='pg_root', ACTIVE_STATEMENTS=5,MEMORY_LIMIT_CLUSTER=5%, CORE_LIMIT_CLUSTER=5%);CREATE RESOURCE QUEUE adhoc2 WITH (PARENT='department3', ACTIVE_STATEMENTS=3,MEMORY_LIMIT_CLUSTER=50%, CORE_LIMIT_CLUSTER=50%);CREATE RESOURCE QUEUE daily_report WITH (PARENT='department3', ACTIVE_STATEMENTS=2,MEMORY_LIMIT_CLUSTER=50%, CORE_LIMIT_CLUSTER=50%);