AnalyticDB for MySQL在数据库系统中提供了工作负载管理模块,您可以使用Workload Manager命令配置工作负载管理规则,并通过多个规则对不同负载进行精细化控制,提高集群的整体运行状态。本文介绍如何配置工作负载管理规则。
前提条件
AnalyticDB for MySQL集群需要同时满足以下条件:
集群系列需为数仓版。
集群的内核版本需为3.1.6.3及以上版本。
说明如何查看和升级集群内核版本,请参见查看和升级版本。
注意事项
仅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命令修改规则。
如何查看集群内核版本,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。
语法
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。 |