写点什么

详解 GaussDB(DWS) 的 query_band 负载识别与应用

  • 2023-04-13
    广东
  • 本文字数:4651 字

    阅读完需:约 15 分钟

详解GaussDB(DWS)的query_band负载识别与应用

本文分享自华为云社区《GaussDB(DWS)的query_band负载识别与应用》,作者:门前一棵葡萄树。

query_band 概述


GaussDB(DWS)实现了基于 query_band 的负载识别和优先级调度,一方面提供了更为灵活的负载识别手段,不再局限于依据“用户-资源池”的映射关系将作业路由至对应资源池,提供了“键值对-资源池”的路由方式;另一方面实现了作业优先级调度,出现排队时按照优先级调度作业。


管理员用户可根据业务场景及作业类别配置 query_band 关联的资源池和优先级等实现更为灵活的负载管理。如果业务未配置 query_band 或用户未将 query_band 关联行为时,作业会默认使用用户关联的资源池和默认优先级(Medium)。

query_band 是什么?


query_band 是一个会话级别(session)的 GUC 参数,本身是字符串类型,支持任意形式字符组合。query_band 用于负载识别时,为了便于区分、解决无意义字符串难以理解的问题,仅支持识别键值对形式的字符串。query_band 键值对有以下限制:


  • 仅支持识别键值对形式的字符串,即:“key=value”;

  • 有效字符:数字 0~9、大写字母 A~Z、小写字母 a~z 以及部分符号(‘.’、‘-’、‘_’ 以及‘#’);

  • 单个键值对最大长度 1024;

  • 支持多个键值对组合,键值对之间使用分号分隔;

  • 示例:SET query_band = ‘JobName=abc;AppName=test;ApplicationName=jdbc’。

query_band 负载识别


GaussDB(DWS)提供的资源管理功能,从资源池维度实现了资源隔离管控和查询调度,借此实现了不同业务间的资源隔离。资源池作为资源管控和查询调度的基本单位,查询运行前需要确定使用哪个资源池,在查询调度和查询运行过程中使用该资源池资源(计算资源/并发等)。


查询是由用户发起运行的,而且一般情况下用户都是按业务划分的,因此理所当然地就想到将用户和资源池关联起来,以此实现用户的查询在对应资源池运行的效果。GaussDB(DWS)提供了用户-资源池关联的能力,默认情况下用户关联默认资源池,可根据业务需求创建自定义资源,并将用户关联至自定义资源池,用户查询依据“用户-资源池”的关联关系将查询路由至对应资源池执行,以此实现对查询并发、内存及 CPU 资源的管控。从而实现对不同业务之间的资源限制和隔离,满足数据库混合负载需求,保证查询执行时资源调度的有序可控。


“用户-资源池”提供的用户和资源池的关联关系,对于用户和业务混合交叉(多个用户均对应多个业务)的场景就不适用了。此外一个资源池内不同用户的作业可能有不同优先级,此时就需要给不同用户或业务配置不同优先级,实现优先级调度。因此就需要提供一种能力,一方面不再局限于“用户-资源池”的关联方式,一方面还可以实现资源池内的优先级调度。这种情况下,query_band 负载识别应运而生。


query_band 负载识别提供了两方面能力:


  • 一方面提供了更为灵活的负载识别手段,不再局限于依据“用户-资源池”的映射关系将作业路由至对应资源池,提供了“键值对-资源池”的路由方式;

  • 另一方面实现了优先级调度,支持为不同用户或业务设置不同的优先级,实现资源池内的优先级调度。

query_band 功能实现

工作原理


query_band 负载识别以键值对为单位,用户使用的键值对可能有很多,但实际上关联负载行为的键值对只有很少的一部分,为方便后续理解,这里按是否关联负载行为,将键值对分为有效键值对和无效键值对:


有效键值对:有关联负载行为;


无效键值对:未关联任何负载行为。


会话内设置的 query_band 可能包含多个键值对,不同场景下可能要使用不同的键值对进行负载识别,以实现负载控制(分时/分天)。当 query_band 内包含唯一有效键值对时,使用该键值对进行负载识别;当 query_band 内包含多个有效键值对时,按以下规则选择有效键值对进行负载识别:


  • 键值对匹配顺序不同时,优先选择匹配序号最小的键值对进行负载识别;

  • 所有键值对匹配顺序相同时,按照先后顺序选择靠前的键值对进行负载识别


示例:假设 set query_band='b=1;a=3;c=1'中所有键值对匹配顺序都一样,则选择 b=1 进行负载识别;假设 set query_band=‘b=1;a=3;c=1’ ,其中 b=1 顺序为-1,a=3 顺序为 4,c=1 顺序为 1,则选择 c=1 进行负载识别。

识别能力


管理员用户根据业务场景和负载变化,调整业务(不同业务对应不同 query_band 键值对)使用的资源池和调度优先级。业务运行过程中负载识别与 query_band 工作机制如下:


  1. 会话内设置 query_band,示例:SET query_band='JobName=abc;UserName=elk';

  2. 负载管理模块解析 query_band,判断其中是否包含有效键值对;

  3. query_band 内不包含有效键值对,则使用"用户-资源池"的方式将作业路由至对应资源池运行,同时设置作业优先级为 Medium;

  4. query_band 内包含有效键值对,则使用“键值对-资源池”的方式将作业路由至对应资源池运行,同时设置作业优先级为键值对关联优先级;

  5. 作业在对应资源池,按照设置的优先级进行排队,等待查询调度。

优先级调度


query_band 支持高中低(High/Medium/Low)三个优先级,同时提供 Rush 作为特殊优先级(绿色通道),默认优先级为 Medium。实践过程中,建议大部分作业使用 Medium 优先级,优先级较低作业使用 Low 优先级,特权作业使用 High 优先级,High 作业不建议过多。Rush 优先级作为特殊场景下应急使用,平时不建议使用。


调度时优先调度高优作业,高优作业全部调度完才调度低优作业,GaussDB(DWS)包含多个优先级队列。除动态负载管理场景下,CN 全局并发控制队列不支持优先级调度外,以下队列均支持优先级调度(按优先级顺序调度):


  • 静态负载管理场景下,CN 全局并发控制队列;

  • 动态负载管理场景下,CCN 全局内存管控队列;

  • 资源池并发控制和内存管控队列。(动态静态均支持)


作业运行过程中可通过 pgxc_session_wlmstat/pg_session_wlmstat 视图查询作业优先级,视图中优先级显示为 INT 类型,数字和优先级对应关系如下:


query_band 对外接口

gs_wlm_set_queryband_action


提供 FUNCTION:gs_wlm_set_queryband_action(query_band cstring, action cstring, order int4)用于设置 query_band 负载行为,函数返回值类型为 bool,表示函数调用是否成功,包含三个入参,含义如下:


  • query_band:query_band 键值对

  • action:负载行为

  • order:匹配顺序(序号),缺省参数,默认值-1


应用示例:设置 query_band 键值对“UserName=elk”关联资源池 p1、优先级 Rush、匹配顺序为 1。


SELECT * FROM gs_wlm_set_queryband_action('UserName=elk','respool=p1;priority=rush',1);
复制代码

gs_wlm_set_queryband_order


提供 FUNCTION:gs_wlm_set_queryband_order(query_band cstring, order int4)用于修改 query_band 匹配顺序,函数返回值类型为 bool,表示函数调用是否成功,包含两个入参,含义如下:


  • query_band:query_band 键值对

  • order:匹配顺序(序号),缺省参数,默认值-1


除-1 外,不允许两个 query_band 键值对使用相同匹配顺序,设置 query_band 键值对匹配顺序时,如果存在 query_band 持有该匹配顺序,则其顺序自动+1,重复上述步骤直至无相同匹配顺序的 query_band 键值对存在。匹配顺序中-1 最大,代表匹配优先级最低,最小值为 0,代表匹配优先级最高。


应用示例:假设 query_band 键值对“UserName=elk”的匹配顺序为 1,“UserName=bin”的匹配顺序为 2,“UserName=yagao”的匹配顺序为 3,此时设置 query_band 键值对“UserName=on”匹配顺序为 1。


SELECT * FROM gs_wlm_set_queryband_order('UserName=on',1);
复制代码


设置完成后,query_band 键值对匹配顺序如下:


系统表 pg_workload_action


query_band 支持多种负载行为,使用系统表 pg_workload_action 存储不同 query_band 键值对对应的负载行为。为了后续扩展性(新增负载行为不需要新增字段),系统表设计采用一行对应一个负载行为的方式存储,当一个 query_band 键值对关联多个负载行为时,每个负载行为存储一行数据。系统表包含四个字段:


  • qband:键值对

  • class:负载行为类别

  • object:负载行为名称

  • action:关联的负载行为


query_band 目前支持以下负载行为,其中 query_band 键值对的匹配顺序(序号)也作为一种负载行为存储在系统表中。



备注:默认值不需要存储在系统表中;资源池保存的是 OID。


示例:假设已经设置 query_band 键值对“UserName=elk”关联资源池 p1、优先级 Rush、匹配顺序为 1;“UserName=on”关联资源池 p1、优先级 Medium、匹配顺序为-1。查询 pg_workload_action 结果如下:


postgres=# select * from pg_workload_action order by 1,2;    qband     | classname | objname  | action--------------+-----------+----------+-------- UserName=elk | order     | respool  | 1 UserName=elk | workload  | respool  | 16722 UserName=elk | workload  | priority | rush UserName=on  | workload  | respool  | 16722(4 rows)
复制代码

pg_queryband_action 视图


pg_workload_action 系统表用于存储 query_band 键值对负载行为,查询 query_band 行为可以直接查询该表,但是随着每一个负载行为显示一行的方式易用性较差,因此我们提供了 pg_queryband_action 用于查询所有 query_band 键值对的负载行为,每一行对应一个键值对的所有负载行为。


示例:假设已经设置 query_band 键值对“UserName=elk”关联资源池 p1、优先级 Rush、匹配顺序为 1;“UserName=on”关联资源池 p1、优先级 Medium、匹配顺序为-1。查询 pg_queryband_action 结果如下:


postgres=# select * from pg_queryband_action;    qband     | respool_id | respool | priority | qborder--------------+------------+---------+----------+--------- UserName=on  |      16722 | p1      | Medium   |      -1 UserName=elk |      16722 | p1      | rush     |       1(2 rows)
复制代码

query_band 应用

基础应用


创建资源池 respool_1,并创建用户 user_1 关联资源池 respool_1、respool_2。不设置 query_band 负载行为场景下,使用 user_1 用户运行作业,此时 user_1 作业全部路由至 respool_1 运行,优先级为 Medium。


设置 query_band 键值对"JobName=elk"的负载行为为关联资源池 respool_2,优先级为 Medium;设置 query_band 键值对"JobName=on"的负载行为为优先级 High。user_1 用户分别设置不同的 query_band 运行作业,不同作业运行方式、关联资源池及作业优先级如下表所示:


扩展应用(用户优先级调度)


创建资源池 respool_1,并创建用户 user_1、user_2、user_3 关联资源池 respool_1。不设置 query_band 负载行为场景下,使用 user_1、user_2 和 user_3 用户运行作业,此时 user_1、user_2 和 user_3 作业全部路由至 respool_1 运行,优先级均为 Medium。


设置 query_band 键值对"UserName=elk"的优先级为 High;设置 query_band 键值对"UserName=on"的优先级为 Low。


备注:“UserName=elk”、“UserName=on”只用于用户标识,没有特殊含义,用户可按需配置。

按以下方式设置用户默认 query_band:


ALTER USER user_2 SET query_band='UserName=elk';ALTER USER user_3 SET query_band='UserName=on'; 
复制代码


会话内不单独设置 query_band,使用 user_1、user_2 和 user_3 用户运行作业,此时 user_1 作业优先级为 Medium(默认优先级),user_2 作业优先级为 High(对应键值对“UserName=elk”),user_3 作业优先级为 Low(对应键值对“UserName=on”)。


此外,用户还可设置包含多个键值对的 query_band,在不同场景下(或不同时间段),按照不同键值对进行负载识别,实现更为灵活的负载控制,这里就不再赘述了。

相关博客:


GaussDB(DWS)资源管理排队原理与问题定位:https://bbs.huaweicloud.com/blogs/386595

GaussDB(DWS)网络调度与隔离管控能力:https://bbs.huaweicloud.com/blogs/393327

GaussDB(DWS)的 CPU 资源隔离管控能力:https://bbs.huaweicloud.com/blogs/355346


点击关注,第一时间了解华为云新鲜技术~

发布于: 20 小时前阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
详解GaussDB(DWS)的query_band负载识别与应用_数据库_华为云开发者联盟_InfoQ写作社区