WLM
AnalyticDB for MySQL在数据库系统中提供了工作负载管理模块,您可以使用Workload Manager命令配置工作负载管理规则,并通过多个规则对不同负载进行精细化控制,提高集群的整体运行状态。本文介绍如何使用Workload Manager命令创建、修改、启用、屏蔽和删除工作负载管理规则。
前提条件
AnalyticDB for MySQL集群的内核版本需为3.1.6.3及以上版本。
请在云原生数据仓库AnalyticDB MySQL控制台集群信息页面的配置信息区域,查看和升级内核版本。
注意事项
仅3.1.10.0及以上内核版本的集群支持使用WLM命令修改规则。
AnalyticDB for MySQL对规则采用软删除策略,要求规则名称唯一,所以重建的新规则不能与已删除规则使用相同的规则名称。
创建规则
语法
wlm add_rule
name=<ruleName>
type=query      
action=<ruleAtion>    
predicate='<property><operator><value> && <property><operator><value>'
[attrs='<ruleAttrs>']
[resource_group=<ruleResource_group>]
[description='<ruleDescription>']
[compatible_group=<compatible_group_name>]
[enabled=<ruleEnabled>]
[priority=<rulePriority>]等号两侧不允许有空格。
参数说明
参数名称  | 是否必填  | 参数说明  | 
name  | 是  | 规则名称。 说明  规则名称要求唯一,新建规则不能与已删除规则使用相同的规则名称。  | 
type  | 是  | 规则类型,固定为query。  | 
action  | 是  | 工作负载管理提供的控制手段,满足匹配条件后,会触发操作。 控制手段的详细说明,请参见控制手段。  | 
predicate  | 是  | 谓词条件。 predicate语法: 
  | 
attrs  | 否  | 当action为RESUBMIT_RESOURCE_GROUP、ADD_PROPERTIES或BLOCK_WITH_PROB时attrs为必填项。 如何填写attrs,请参见控制手段的配置方法。 说明  填写该参数时,两侧需要使用单引号。  | 
resource_group  | 否  | 资源组名称,默认为user_default。 说明  您可以登录云原生数据仓库AnalyticDB MySQL控制台,单击目标集群ID,在资源组管理页面查看集群的资源组。  | 
description  | 否  | 描述信息。 说明  填写该参数时,两侧需要使用单引号。  | 
compatible_group  | 否  | 相容组。 默认情况下,匹配规则的方式是从规则的优先级由高到低依次匹配规则,匹配到一条就直接结束。也可以将同时匹配多条规则的需求设置为同一个相容组。在规则匹配时,优先匹配优先级最高的规则,如果已匹配的规则存在相容组,相容组中剩余规则如有能同时匹配的,则同时匹配。  | 
enabled  | 否  | 是否启用规则,取值说明: 
  | 
priority  | 否  | 启用优先级高的规则,默认为0。 每次匹配规则,只会匹配一条优先级最高的规则,优先级相同时,则根据创建时间越早的规则先进行匹配。  | 
示例
示例1:创建一条规则名称为testRule1的规则,当用户名为test且Pattern历史执行时间50分位值大于60000 ms时结束查询。
wlm add_rule name=testRule1 type=query action=kill predicate='user=test && PATTERN_RT_P50>60000';返回结果如下:
+---------------------------------+ | result | +---------------------------------+ | insert rule 'testRule1' success | +---------------------------------+示例2:创建一条规则名称为testRule2的规则,将用户名为test且用户IP在(10.10.10.10,192.168.0.1,192.0.2.1)中的查询,增加
query_priority=low的Hint,将查询优先级设置为low。wlm add_rule name=testRule2 type=query action=ADD_PROPERTIES attrs='{"add_prop":{"query_priority":"low"}}' predicate='user=test && source_ip in 10.10.10.10,192.168.0.1,192.0.2.1';返回结果如下:
+---------------------------------+ | result | +---------------------------------+ | insert rule 'testRule2' success | +---------------------------------+示例3:为testResourceGroup资源组创建一条规则名称为testRule3的规则,优先级为5,将用户名为test且类型为select的所有查询全部结束。
wlm add_rule name=testRule3 type=query resource_group=testResourceGroup description='just a test' priority=5 action=kill predicate='user=test && query_task_type=1';返回结果如下:
+---------------------------------+ | result | +---------------------------------+ | insert rule 'testRule3' success | +---------------------------------+
修改规则
仅3.1.10.0及以上内核版本的集群支持使用WLM命令修改规则。
请在云原生数据仓库AnalyticDB MySQL控制台集群信息页面的配置信息区域,查看和升级内核版本。
语法
wlm update_rule
id=<ruleId>
name=<ruleName>
type=query 
action=<ruleAtion> 
predicate='<property><operator><value> && <property><operator><value>'
[attrs='<ruleAttrs>']
[resource_group=<ruleResource_group>]
[description='<ruleDescription>']
[compatible_group=<compatible_group_name>]
[enabled=<ruleEnabled>]
[priority=<rulePriority>]等号两侧不允许有空格。
参数说明
参数名称  | 是否必填  | 参数说明  | 
id  | 否  | 规则ID。规则ID是唯一的,用于匹配相应规则,且不支持修改。 说明  您可以通过  | 
name  | 否  | 规则名称。修改规则名称时,需要使用规则ID匹配相应规则。 说明  修改后的规则不能与已创建的规则使用相同的规则名称,否则会覆盖已创建的同名规则。  | 
type  | 否  | 规则类型,固定为query。  | 
action  | 否  | 工作负载管理提供的控制手段,满足匹配条件后,会触发操作。 控制手段的详细说明,请参见控制手段。  | 
predicate  | 否  | 谓词条件。 predicate语法: 
  | 
attrs  | 否  | 当action为RESUBMIT_RESOURCE_GROUP、ADD_PROPERTIES或BLOCK_WITH_PROB时attrs为必填项。 如何填写attrs,请参见控制手段的配置方法。 填写该参数时,两侧需要使用单引号。  | 
resource_group  | 否  | 资源组名称,默认为user_default。 说明  您可以登录云原生数据仓库AnalyticDB MySQL控制台,单击目标集群ID,在资源组管理页面查看集群的资源组。  | 
description  | 否  | 描述信息。 说明  填写该参数时,两侧需要使用单引号。  | 
compatible_group  | 否  | 相容组。 默认情况下,匹配规则的方式是从规则的优先级由高到低依次匹配规则,匹配到一条就直接结束。也可以将同时匹配多条规则的需求设置为同一个相容组。在规则匹配时,优先匹配优先级最高的规则,如果已匹配的规则存在相容组,相容组中剩余规则如有能同时匹配的,则同时匹配。  | 
enabled  | 否  | 是否启用规则,取值说明: 
  | 
priority  | 否  | 启用优先级高的规则,默认为0。 每次匹配规则,只会匹配一条优先级最高的规则,优先级相同时,则根据创建时间越早的规则先进行匹配。  | 
示例
示例1:将规则ID为2的规则名称修改为Rule。
wlm update_rule id=2 name=Rule;返回结果如下:
+-----------------+ | result | +-----------------+ | update rule 2 | +-----------------+示例2:将testRule1规则的条件修改为当用户名为test且Pattern历史执行时间50分位值大于80000 ms时结束查询。
wlm update_rule name=testRule1 predicate='user=test && PATTERN_RT_P50>80000';或使用testRule1规则所对应的规则ID修改:
wlm update_rule id=1 predicate='user=test && PATTERN_RT_P50>80000';返回结果如下:
+-----------------+ | result | +-----------------+ | update rule 1 | +-----------------+示例3:将满足testRule1规则的查询投递至testgroup资源组继续执行。
修改前,testRule1规则为kill掉满足条件的查询:
wlm add_rule name=testRule1 type=query action=kill predicate='user=test && PATTERN_RT_P50>60000';修改testRule1规则,把当前资源组的查询都投递到testgroup资源组执行:
wlm update_rule name=testRule1 action=RESUBMIT_RESOURCE_GROUP attrs='{ "resubmit":{ "resource_group": "testgroup" } }'说明如何填写attrs,请参见控制手段的配置方法。
返回结果如下:
+-----------------+ | result | +-----------------+ | update rule 1 | +-----------------+
查询规则
语法
wlm list_rule
[id=<ruleID>]
[name='<ruleName>'\G]参数说明
参数名称  | 是否必填  | 参数说明  | 
id  | 否  | 规则ID。 说明  不填写ID和name将查询所有未被删除的规则,包括规则ID。  | 
name  | 否  | 规则名称。 说明  
  | 
\G  | 否  | 将查询结果按列打印,将每个字段打印到单独的行。  | 
示例
示例1:查询规则ID为testID1的规则。
wlm list_rule id=1 \G;返回结果如下:
id: 1 name: testRule4 description: NULL type: QUERY resource_group: user_default enabled: 1 priority: 0 version: 1 life_cycle: BEFORE_QUEUEING compatible_group: valid_begin: null valid_end: null creator: kepler update_user: kepler create_time: 2022-09-16 14:00:18 update_time: 2022-09-16 14:00:18 predicate: [{"property":"${session.user}","value":"test","operator":"equal"},{"property":"${session.source_ip}","value":"1,2,3","operator":"in"}] action: ADD_PROPERTIES attrs: {"add_prop":{"query_priority":"low"}} 1 row in set (0.11 sec)示例2:查询规则ID为testID1,规则名称为testRule4的规则。
mysql> wlm list_rule id=1 name='testRule4' \G;返回结果如下:
id: 1 name: testRule4 description: NULL type: QUERY resource_group: user_default enabled: 1 priority: 0 version: 1 life_cycle: BEFORE_QUEUEING compatible_group: valid_begin: null valid_end: null creator: kepler update_user: kepler create_time: 2022-09-16 14:00:18 update_time: 2022-09-16 14:00:18 predicate: [{"property":"${session.user}","value":"test","operator":"equal"},{"property":"${session.source_ip}","value":"1,2,3","operator":"in"}] action: ADD_PROPERTIES attrs: {"add_prop":{"query_priority":"low"}} 1 row in set (0.09 sec)
屏蔽规则
语法
wlm disable_rule id=<ruleID>参数说明
参数名称  | 是否必填  | 参数说明  | 
id  | 是  | 规则ID。 说明  您可以执行  | 
示例
示例1:屏蔽ID为testID1的规则。
wlm disable_rule id=1;返回结果如下:
+------------------+ | result | +------------------+ | disable rule 1 | +------------------+示例2:查询ID为testID1的规则。
wlm list_rule id=1\G;返回结果如下:
id: 1 name: testRule4 description: NULL type: QUERY resource_group: user_default enabled: 0 priority: 0 version: 1 life_cycle: BEFORE_QUEUEING compatible_group: valid_begin: null valid_end: null creator: kepler update_user: kepler create_time: 2022-09-16 14:00:18 update_time: 2022-09-16 14:00:18 predicate: [{"property":"${session.user}","value":"test","operator":"equal"},{"property":"${session.source_ip}","value":"1,2,3","operator":"in"}] action: ADD_PROPERTIES attrs: {"add_prop":{"query_priority":"low"}}
启用规则
语法
wlm enable_rule id=<ruleID>参数说明
参数名称  | 是否必填  | 参数说明  | 
id  | 是  | 规则ID。 说明  您可以执行  | 
示例
示例1:启用ID为testID1的规则。
wlm enable_rule id=1;返回结果如下:
+----------------+ | result | +----------------+ | enable rule 1 | +----------------+示例2:查询ID为testID1的规则。
wlm list_rule id=1\G;返回结果如下:
id: 1 name: testRule4 description: NULL type: QUERY resource_group: user_default enabled: 1 priority: 0 version: 1 life_cycle: BEFORE_QUEUEING compatible_group: valid_begin: null valid_end: null creator: kepler update_user: kepler create_time: 2022-09-16 14:00:18 update_time: 2022-09-16 14:00:18 predicate: [{"property":"${session.user}","value":"test","operator":"equal"},{"property":"${session.source_ip}","value":"1,2,3","operator":"in"}] action: ADD_PROPERTIES attrs: {"add_prop":{"query_priority":"low"}}
删除规则
语法
wlm delete_rule id=<ruleID>参数说明
参数名称  | 是否必填  | 参数说明  | 
id  | 是  | 规则ID。 说明  您可以执行  | 
示例
示例1:删除ID为testID1的规则。
wlm delete_rule id=1;返回结果如下:
+----------------+ | result | +----------------+ | delete rule 1 | +----------------+示例2:查询ID为testID1的规则。
wlm list_rule id=1\G;返回结果如下:
Empty set
计算pattern_hash
语法
wlm calc_pattern_hash <SQL>参数说明
参数说明  | 是否必填  | 说明  | 
SQL  | 是  | SELECT语句或带有SELECT的写入语句。  | 
示例
计算查询语句的pattern_hash。
wlm calc_pattern_hash select * from t where a=1 and b=2;返回结果如下:
+-----------------------------------+----------------------+
| raw_sql                           | pattern_hash         |
+-----------------------------------+----------------------+
| select * from t where a=1 and b=2 | -4759960226441980963 |
+-----------------------------------+----------------------+打印WLM帮助信息
不带任何参数执行wlm命令即会打印帮助信息。
wlm;返回结果如下:
+---------------------------+-------------------------------------+
| command                   | description                         |
+---------------------------+-------------------------------------+
| calc_pattern_hash         | calculate pattern_hash of query     |
| add_rule                  | add a new rule                      |
| list_rule id=[x]|name=[x] | list all rules OR filter by id/name |
| disable_rule id=[x]       | disable a rule by id                |
| enable_rule id=[x]        | enable a rule by id                 |
| delete_rule id=[x]        | delete a rule by id                 |
| update_rule id=[x]        | update a rule by id                 |
+---------------------------+-------------------------------------+附录
附录1:属性
类别  | 字段  | 数据类型  | 说明  | 
查询属性  | user  | 字符串  | 发送查询的用户。  | 
source_ip  | 字符串  | 发送查询的IP。  | |
query_task_type  | 数值  | 查询的类型,取值说明: 
  | |
query_table_list  | 字符串列表  | 查询扫描到的表。  | |
query_db_list  | 字符串列表  | 查询扫描到的数据库。  | |
pattern_hash  | 数值  | 查询Pattern的Hash值,用于确定同类Pattern的查询。  | |
sql  | 字符串  | 查询原始的SQL语句。 重要  仅3.1.8.3及以上内核版本的集群支持该属性。  | |
查询运行时指标 说明  查询运行时指标用于在查询进入队列后,对查询进行控制。  | QUERY_PROCESS_TIME  | 数值  | 查询过程中所有Task的耗时总和,可以粗略地衡量一个查询的计算量。单位:ms。  | 
QUERY_EXECUTION_TIME  | 数值  | 查询执行耗时(不含排队耗时与生成执行计划耗时)。单位:ms。 重要  
  | |
QUERY_SUBMITTED_TIME  | 数值  | 创建查询的时间戳。  | |
QUERY_TOTAL_TASK  | 数值  | 查询物理执行计划Task总数。  | |
QUERY_INPUT_DATA_SIZE  | 数值  | 查询的读取数据量。单位:MB。  | |
QUERY_SHUFFLE_DATA_SIZE  | 数值  | 查询的Shuffle数据量。单位:MB。  | |
QUERY_OUTPUT_DATA_SIZE  | 数值  | 查询的输出数据量。单位:MB。  | |
QUERY_PEAK_MEMORY  | 数值  | 查询的Peak Memory,单位:MB。  | |
QUERY_TOTAL_STAGES  | 数值  | 查询执行计划的Stages总数。  | |
查询Pattern属性 说明  查询Pattern属性可以反映查询历史的执行情况。  | PATTERN_RT_P50  | 数值  | 同Pattern查询历史执行时间50分位值。单位:ms。  | 
PATTERN_RT_P90  | 数值  | 同Pattern查询历史执行时间90分位值。单位:ms。  | |
PATTERN_EXECUTION_TIME_P50  | 数值  | 同Pattern查询历史执行时间(去除排队)50分位值。单位:ms。  | |
PATTERN_EXECUTION_TIME_P90  | 数值  | 同Pattern查询历史执行时间(去除排队)90分位值。单位:ms。  | |
PATTERN_WALL_TIME_P50  | 数值  | 同Pattern查询历史Wall Time50分位值。单位:ms。  | |
PATTERN_WALL_TIME_P90  | 数值  | 同Pattern查询历史Wall Time90分位值。单位:ms。  | |
PATTERN_SHUFFLE_SIZE_AVG  | 数值  | 同Pattern查询历史Shuffle数据平均值。单位:单位:Byte。  | |
PATTERN_PEAK_MEMORY_AVG  | 数值  | 同Pattern查询历史Peak Memory平均值。单位:Byte。  | |
PATTERN_INPUT_POSITION_AVG  | 数值  | 同Pattern查询历史输入记录数平均值。单位:行。  | |
PATTERN_OUTPUT_POSITION_AVG  | 数值  | 同Pattern查询历史输出记录数平均值。单位:行。  | 
附录2:运算符
运算符  | 适用的数据类型  | 说明  | 
>  | 数值  | 无  | 
<  | 数值  | 无  | 
=  | 数值、字符串  | 无  | 
>=  | 数值  | 无  | 
<=  | 数值  | 无  | 
!=  | 数值、字符串  | 无  | 
in  | 字符串列表  | 字符串列表是否存在交集。  | 
contains  | 字符串  | 字符串中是否包含某些特定字符串,主要用于查询原始的SQL语句。 重要  仅3.1.8.3及以上内核版本的集群支持该运算符。  | 
附录3:控制手段
控制手段  | 说明  | attrs配置方法  | 
KILL  | 结束查询。  | 无  | 
RESUBMIT_RESOURCE_GROUP  | 停止当前资源组内满足条件查询,并提交到另一个资源组执行。  | { "resubmit": {"resource_group":"<resource_group_name>"}} resource_group_name:资源组名称。 说明  您可以登录云原生数据仓库AnalyticDB MySQL控制台,单击目标集群ID,在资源组管理页面查看集群的资源组。  | 
ADD_PROPERTIES  | 修改查询的属性。通常用于修改查询优先级,也可以修改Hint配置的其他查询属性。  | { "add_prop": {"query_priority": "<Priority level>", "force":"false"}} 
  | 
BLOCK_WITH_PROB  | 以一定概率在查询入队前结束查询。通常用于限流。  | { "block_prob": {"prob":<prob_value>}} prob_value:结束查询的概率,取值范围为0~1。  |