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。 |