GaussDB(DWS)的query_band工作负载识别和使用详解
概述query_band
GaussDB(DWS)基于query_band实现工作负载识别和优先级排序。一方面,它提供了更灵活的货物识别方式,不再受到限制。提供键值资源数据库路由方法,根据用户-资源池映射关系将任务路由到合适的资源组;另一方面,它实现了任务优先调度,在到达队列时根据优先级进行调度。手术。
管理员用户可以根据业务场景和作业类别配置query_band关联的资源组和优先级,实现更灵活的负载管理。如果公司没有配置query_band或者用户没有将query_band与行为关联,则任务将默认使用与用户关联的资源池和默认优先级(中)。
什么是query_band?
query_band 是会话级 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包含多个有效键值对时,按照以下规则选择有效键值对来标识负载:
- 键值对 当匹配顺序不同时,匹配最小的键值对序列是货物识别中优先的编号;
- 当所有键值对按相同顺序匹配时,选择前面的键值对来标识负载。 1;a=3;c=1'同样如此,则选择b=1来识别负载;假设您设置 query_band='b=1;a=3;c=1 ',其中阶数 b=1 为 -1,阶数 a=3 为 4,阶数 c=1 为 1,则选择 c =1 来标识加载。
识别能力
管理员用户可以根据业务场景和负载变化调整企业使用的资源组和调度优先级(不同企业对应不同的query_band键值对)。业务运行时工作负载识别和query_band的工作机制如下:
- 在会话中设置query_band,示例:SET query_band='JobName=abc;UserName=elk';
- 加载处理程序解析query_band以确定它是否包含有效的键值对;
- query_band不包含有效的键值对,则使用“用户-资源池”方法将作业引导到合适的资源池执行,并将作业的优先级设置为Medium;
- query_band 包含有效的键值对,使用“键值对-资源-组”方法将任务引导到合适的资源池执行,并将任务的优先级设置为键关联的优先级-值对;
- 任务在相应的资源池中,按照设定的优先级排队等待查询调度。
优先级调度
query_band 支持三个优先级:高/中/低,并且还提供 Rush 作为特殊优先级(绿色通道)。默认优先级为“中”。在实际应用中,建议大多数任务使用中优先级,优先级较低的任务使用低优先级,特权任务使用高优先级。不建议担任过多的高职位。紧急福利是为了特殊情况下的紧急使用,不建议正常使用。
调度时,首先调度高质量的作业,当所有高质量的作业都调度完后,才调度低质量的作业。 GaussDB(DWS)包含多个优先级队列。除动态负载管理场景外,CN全局并发控制队列不支持优先级调度,以下队列支持优先级调度(优先顺序调度):
- 静态负载管理场景下,CN全局并发控制队列;
- 动态负载管理场景下CCN全局队列进行内存管理;
- 资源池并发控制和内存管理队列。 (支持动态和静态)
作业运行过程中,可以通过pgxc_session_wlmstat/pg_session_wlmstat视图查询作业优先级。视图中的优先级显示为 INT 类型。编号与优先级的对应关系如下:
extern 接口 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",关联资源 Pool 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 key对-value不能使用相同的匹配顺序,设置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:加载名称 name
- action:关联加载
query_band 目前支持以下加载行为,match order(序列号)query_band键值对也作为加载行为存储在系统表中。
注:默认值不需要存储在系统表中;资源集合存储OID。
示例:假设query_band键值对“UserName=elk”设置关联资源组p1、优先级Rush、匹配顺序1; “UserName=on”与资源池p1关联,优先级为中,匹配顺序为-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关联,优先级为中,匹配顺序为-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”的加载行为设置为高优先级。用户 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执行,优先级为中。
设置优先级键值对query_band“UserName=elk”为High;将query_band键值对“UserName=on”的优先级设置为低。
注:“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的优先级为中(默认优先级),任务user_2的优先级为高(对应键值对“UserName=elk”),任务user_3的优先级为低(对应键值对“UserName=elk”)。在”)。
另外,用户还可以设置包含多个键值对的query_band。在不同场景(或不同时间段),根据不同的键值对进行工作负载识别,实现更自适应的工作负载控制。这里不涉及这一点。没有更多细节。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。