WLM
AnalyticDB for MySQL在數(shù)據(jù)庫系統(tǒng)中提供了工作負載管理模塊,您可以使用Workload Manager命令配置工作負載管理規(guī)則,并通過多個規(guī)則對不同負載進行精細化控制,提高集群的整體運行狀態(tài)。本文介紹如何使用Workload Manager命令創(chuàng)建、修改、啟用、屏蔽和刪除工作負載管理規(guī)則。
前提條件
AnalyticDB for MySQL集群需要同時滿足以下條件:
集群系列需為數(shù)倉版。
集群的內(nèi)核版本需為3.1.6.3及以上版本。
說明查看企業(yè)版或湖倉版集群的內(nèi)核版本,請參見如何查看實例版本信息。如需升級內(nèi)核版本,請聯(lián)系技術(shù)支持。
注意事項
僅3.1.10.0及以上內(nèi)核版本的集群支持使用WLM命令修改規(guī)則。
AnalyticDB for MySQL對規(guī)則采用軟刪除策略,要求規(guī)則名稱唯一,所以重建的新規(guī)則不能與已刪除規(guī)則使用相同的規(guī)則名稱。
創(chuàng)建規(guī)則
語法
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>]
等號兩側(cè)不允許有空格。
參數(shù)說明
參數(shù)名稱 | 是否必填 | 參數(shù)說明 |
name | 是 | 規(guī)則名稱。 說明 規(guī)則名稱要求唯一,新建規(guī)則不能與已刪除規(guī)則使用相同的規(guī)則名稱。 |
type | 是 | 規(guī)則類型,固定為query。 |
action | 是 | 工作負載管理提供的控制手段,滿足匹配條件后,會觸發(fā)操作。 控制手段的詳細說明,請參見控制手段。 |
predicate | 是 | 謂詞條件。 predicate語法:
|
attrs | 否 | 當action為RESUBMIT_RESOURCE_GROUP、ADD_PROPERTIES或BLOCK_WITH_PROB時attrs為必填項。 如何填寫attrs,請參見控制手段的配置方法。 說明 填寫該參數(shù)時,兩側(cè)需要使用單引號。 |
resource_group | 否 | 資源組名稱,默認為user_default。 說明 您可以登錄云原生數(shù)據(jù)倉庫AnalyticDB MySQL控制臺,單擊目標集群ID,在資源組管理頁面查看集群的資源組。 |
description | 否 | 描述信息。 說明 填寫該參數(shù)時,兩側(cè)需要使用單引號。 |
compatible_group | 否 | 相容組。 默認情況下,匹配規(guī)則的方式是從規(guī)則的優(yōu)先級由高到低依次匹配規(guī)則,匹配到一條就直接結(jié)束。也可以將同時匹配多條規(guī)則的需求設(shè)置為同一個相容組。在規(guī)則匹配時,優(yōu)先匹配優(yōu)先級最高的規(guī)則,如果已匹配的規(guī)則存在相容組,相容組中剩余規(guī)則如有能同時匹配的,則同時匹配。 |
enabled | 否 | 是否啟用規(guī)則,取值說明:
|
priority | 否 | 啟用優(yōu)先級高的規(guī)則,默認為0。 每次匹配規(guī)則,只會匹配一條優(yōu)先級最高的規(guī)則,優(yōu)先級相同時,則根據(jù)創(chuàng)建時間越早的規(guī)則先進行匹配。 |
示例
示例1:創(chuàng)建一條規(guī)則名稱為testRule1的規(guī)則,當用戶名為test且Pattern歷史執(zhí)行時間50分位值大于60000 ms時結(jié)束查詢。
wlm add_rule name=testRule1 type=query action=kill predicate='user=test && PATTERN_RT_P50>60000';
返回結(jié)果如下:
+---------------------------------+ | result | +---------------------------------+ | insert rule 'testRule1' success | +---------------------------------+
示例2:創(chuàng)建一條規(guī)則名稱為testRule2的規(guī)則,將用戶名為test且用戶IP在(10.10.10.10,192.168.0.1,192.0.2.1)中的查詢,增加
query_priority=low
的Hint,將查詢優(yōu)先級設(shè)置為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';
返回結(jié)果如下:
+---------------------------------+ | result | +---------------------------------+ | insert rule 'testRule2' success | +---------------------------------+
示例3:為testResourceGroup資源組創(chuàng)建一條規(guī)則名稱為testRule3的規(guī)則,優(yōu)先級為5,將用戶名為test且類型為select的所有查詢?nèi)拷Y(jié)束。
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';
返回結(jié)果如下:
+---------------------------------+ | result | +---------------------------------+ | insert rule 'testRule3' success | +---------------------------------+
修改規(guī)則
僅3.1.10.0及以上內(nèi)核版本的集群支持使用WLM命令修改規(guī)則。
如何查看集群內(nèi)核版本,請參見如何查看實例版本信息。如需升級內(nèi)核版本,請聯(lián)系技術(shù)支持。
語法
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>]
等號兩側(cè)不允許有空格。
參數(shù)說明
參數(shù)名稱 | 是否必填 | 參數(shù)說明 |
id | 否 | 規(guī)則ID。規(guī)則ID是唯一的,用于匹配相應(yīng)規(guī)則,且不支持修改。 說明 您可以通過 |
name | 否 | 規(guī)則名稱。修改規(guī)則名稱時,需要使用規(guī)則ID匹配相應(yīng)規(guī)則。 說明 修改后的規(guī)則不能與已創(chuàng)建的規(guī)則使用相同的規(guī)則名稱,否則會覆蓋已創(chuàng)建的同名規(guī)則。 |
type | 否 | 規(guī)則類型,固定為query。 |
action | 否 | 工作負載管理提供的控制手段,滿足匹配條件后,會觸發(fā)操作。 控制手段的詳細說明,請參見控制手段。 |
predicate | 否 | 謂詞條件。 predicate語法:
|
attrs | 否 | 當action為RESUBMIT_RESOURCE_GROUP、ADD_PROPERTIES或BLOCK_WITH_PROB時attrs為必填項。 如何填寫attrs,請參見控制手段的配置方法。 填寫該參數(shù)時,兩側(cè)需要使用單引號。 |
resource_group | 否 | 資源組名稱,默認為user_default。 說明 您可以登錄云原生數(shù)據(jù)倉庫AnalyticDB MySQL控制臺,單擊目標集群ID,在資源組管理頁面查看集群的資源組。 |
description | 否 | 描述信息。 說明 填寫該參數(shù)時,兩側(cè)需要使用單引號。 |
compatible_group | 否 | 相容組。 默認情況下,匹配規(guī)則的方式是從規(guī)則的優(yōu)先級由高到低依次匹配規(guī)則,匹配到一條就直接結(jié)束。也可以將同時匹配多條規(guī)則的需求設(shè)置為同一個相容組。在規(guī)則匹配時,優(yōu)先匹配優(yōu)先級最高的規(guī)則,如果已匹配的規(guī)則存在相容組,相容組中剩余規(guī)則如有能同時匹配的,則同時匹配。 |
enabled | 否 | 是否啟用規(guī)則,取值說明:
|
priority | 否 | 啟用優(yōu)先級高的規(guī)則,默認為0。 每次匹配規(guī)則,只會匹配一條優(yōu)先級最高的規(guī)則,優(yōu)先級相同時,則根據(jù)創(chuàng)建時間越早的規(guī)則先進行匹配。 |
示例
示例1:將規(guī)則ID為2的規(guī)則名稱修改為Rule。
wlm update_rule id=2 name=Rule;
返回結(jié)果如下:
+-----------------+ | result | +-----------------+ | update rule 2 | +-----------------+
示例2:將testRule1規(guī)則的條件修改為當用戶名為test且Pattern歷史執(zhí)行時間50分位值大于80000 ms時結(jié)束查詢。
wlm update_rule name=testRule1 predicate='user=test && PATTERN_RT_P50>80000';
或使用testRule1規(guī)則所對應(yīng)的規(guī)則ID修改:
wlm update_rule id=1 predicate='user=test && PATTERN_RT_P50>80000';
返回結(jié)果如下:
+-----------------+ | result | +-----------------+ | update rule 1 | +-----------------+
示例3:將滿足testRule1規(guī)則的查詢投遞至testgroup資源組繼續(xù)執(zhí)行。
修改前,testRule1規(guī)則為kill掉滿足條件的查詢:
wlm add_rule name=testRule1 type=query action=kill predicate='user=test && PATTERN_RT_P50>60000';
修改testRule1規(guī)則,把當前資源組的查詢都投遞到testgroup資源組執(zhí)行:
wlm update_rule name=testRule1 action=RESUBMIT_RESOURCE_GROUP attrs='{ "resubmit":{ "resource_group": "testgroup" } }'
說明如何填寫attrs,請參見控制手段的配置方法。
返回結(jié)果如下:
+-----------------+ | result | +-----------------+ | update rule 1 | +-----------------+
查詢規(guī)則
語法
wlm list_rule
[id=<ruleID>]
[name='<ruleName>'\G]
參數(shù)說明
參數(shù)名稱 | 是否必填 | 參數(shù)說明 |
id | 否 | 規(guī)則ID。 說明 不填寫ID和name將查詢所有未被刪除的規(guī)則,包括規(guī)則ID。 |
name | 否 | 規(guī)則名稱。 說明
|
\G | 否 | 將查詢結(jié)果按列打印,將每個字段打印到單獨的行。 |
示例
示例1:查詢規(guī)則ID為testID1的規(guī)則。
wlm list_rule id=1 \G;
返回結(jié)果如下:
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:查詢規(guī)則ID為testID1,規(guī)則名稱為testRule4的規(guī)則。
mysql> wlm list_rule id=1 name='testRule4' \G;
返回結(jié)果如下:
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)
屏蔽規(guī)則
語法
wlm disable_rule id=<ruleID>
參數(shù)說明
參數(shù)名稱 | 是否必填 | 參數(shù)說明 |
id | 是 | 規(guī)則ID。 說明 您可以執(zhí)行 |
示例
示例1:屏蔽ID為testID1的規(guī)則。
wlm disable_rule id=1;
返回結(jié)果如下:
+------------------+ | result | +------------------+ | disable rule 1 | +------------------+
示例2:查詢ID為testID1的規(guī)則。
wlm list_rule id=1\G;
返回結(jié)果如下:
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"}}
啟用規(guī)則
語法
wlm enable_rule id=<ruleID>
參數(shù)說明
參數(shù)名稱 | 是否必填 | 參數(shù)說明 |
id | 是 | 規(guī)則ID。 說明 您可以執(zhí)行 |
示例
示例1:啟用ID為testID1的規(guī)則。
wlm enable_rule id=1;
返回結(jié)果如下:
+----------------+ | result | +----------------+ | enable rule 1 | +----------------+
示例2:查詢ID為testID1的規(guī)則。
wlm list_rule id=1\G;
返回結(jié)果如下:
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"}}
刪除規(guī)則
語法
wlm delete_rule id=<ruleID>
參數(shù)說明
參數(shù)名稱 | 是否必填 | 參數(shù)說明 |
id | 是 | 規(guī)則ID。 說明 您可以執(zhí)行 |
示例
示例1:刪除ID為testID1的規(guī)則。
wlm delete_rule id=1;
返回結(jié)果如下:
+----------------+ | result | +----------------+ | delete rule 1 | +----------------+
示例2:查詢ID為testID1的規(guī)則。
wlm list_rule id=1\G;
返回結(jié)果如下:
Empty set
計算pattern_hash
語法
wlm calc_pattern_hash <SQL>
參數(shù)說明
參數(shù)說明 | 是否必填 | 說明 |
SQL | 是 | SELECT語句或帶有SELECT的寫入語句。 |
示例
計算查詢語句的pattern_hash。
wlm calc_pattern_hash select * from t where a=1 and b=2;
返回結(jié)果如下:
+-----------------------------------+----------------------+
| raw_sql | pattern_hash |
+-----------------------------------+----------------------+
| select * from t where a=1 and b=2 | -4759960226441980963 |
+-----------------------------------+----------------------+
打印WLM幫助信息
不帶任何參數(shù)執(zhí)行wlm命令即會打印幫助信息。
wlm;
返回結(jié)果如下:
+---------------------------+-------------------------------------+
| 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:屬性
類別 | 字段 | 數(shù)據(jù)類型 | 說明 |
查詢屬性 | user | 字符串 | 發(fā)送查詢的用戶。 |
source_ip | 字符串 | 發(fā)送查詢的IP。 | |
query_task_type | 數(shù)值 | 查詢的類型,取值說明:
| |
query_table_list | 字符串列表 | 查詢掃描到的表。 | |
query_db_list | 字符串列表 | 查詢掃描到的數(shù)據(jù)庫。 | |
pattern_hash | 數(shù)值 | 查詢Pattern的Hash值,用于確定同類Pattern的查詢。 | |
sql | 字符串 | 查詢原始的SQL語句。 重要 僅3.1.8.3及以上內(nèi)核版本的集群支持該屬性。 | |
查詢運行時指標 說明 查詢運行時指標用于在查詢進入隊列后,對查詢進行控制。 | QUERY_PROCESS_TIME | 數(shù)值 | 查詢過程中所有Task的耗時總和,可以粗略地衡量一個查詢的計算量。單位:ms。 |
QUERY_EXECUTION_TIME | 數(shù)值 | 查詢執(zhí)行耗時(不含排隊耗時)。單位:ms。 | |
QUERY_SUBMITTED_TIME | 數(shù)值 | 創(chuàng)建查詢的時間戳。 | |
QUERY_TOTAL_TASK | 數(shù)值 | 查詢物理執(zhí)行計劃Task總數(shù)。 | |
QUERY_INPUT_DATA_SIZE | 數(shù)值 | 查詢的讀取數(shù)據(jù)量。單位:MB。 | |
QUERY_SHUFFLE_DATA_SIZE | 數(shù)值 | 查詢的Shuffle數(shù)據(jù)量。單位:MB。 | |
QUERY_OUTPUT_DATA_SIZE | 數(shù)值 | 查詢的輸出數(shù)據(jù)量。單位:MB。 | |
QUERY_PEAK_MEMORY | 數(shù)值 | 查詢的Peak Memory,單位:MB。 | |
QUERY_TOTAL_STAGES | 數(shù)值 | 查詢執(zhí)行計劃的Stages總數(shù)。 | |
查詢Pattern屬性 說明 查詢Pattern屬性可以反映查詢歷史的執(zhí)行情況。 | PATTERN_RT_P50 | 數(shù)值 | 同Pattern查詢歷史執(zhí)行時間50分位值。單位:ms。 |
PATTERN_RT_P90 | 數(shù)值 | 同Pattern查詢歷史執(zhí)行時間90分位值。單位:ms。 | |
PATTERN_EXECUTION_TIME_P50 | 數(shù)值 | 同Pattern查詢歷史執(zhí)行時間(去除排隊)50分位值。單位:ms。 | |
PATTERN_EXECUTION_TIME_P90 | 數(shù)值 | 同Pattern查詢歷史執(zhí)行時間(去除排隊)90分位值。單位:ms。 | |
PATTERN_WALL_TIME_P50 | 數(shù)值 | 同Pattern查詢歷史Wall Time50分位值。單位:ms。 | |
PATTERN_WALL_TIME_P90 | 數(shù)值 | 同Pattern查詢歷史Wall Time90分位值。單位:ms。 | |
PATTERN_SHUFFLE_SIZE_AVG | 數(shù)值 | 同Pattern查詢歷史Shuffle數(shù)據(jù)平均值。單位:單位:Byte。 | |
PATTERN_PEAK_MEMORY_AVG | 數(shù)值 | 同Pattern查詢歷史Peak Memory平均值。單位:Byte。 | |
PATTERN_INPUT_POSITION_AVG | 數(shù)值 | 同Pattern查詢歷史輸入記錄數(shù)平均值。單位:行。 | |
PATTERN_OUTPUT_POSITION_AVG | 數(shù)值 | 同Pattern查詢歷史輸出記錄數(shù)平均值。單位:行。 |
附錄2:運算符
運算符 | 適用的數(shù)據(jù)類型 | 說明 |
> | 數(shù)值 | 無 |
< | 數(shù)值 | 無 |
= | 數(shù)值、字符串 | 無 |
>= | 數(shù)值 | 無 |
<= | 數(shù)值 | 無 |
!= | 數(shù)值、字符串 | 無 |
in | 字符串列表 | 字符串列表是否存在交集。 |
contains | 字符串 | 字符串中是否包含某些特定字符串,主要用于查詢原始的SQL語句。 重要 僅3.1.8.3及以上內(nèi)核版本的集群支持該運算符。 |
附錄3:控制手段
控制手段 | 說明 | attrs配置方法 |
KILL | 結(jié)束查詢。 | 無 |
RESUBMIT_RESOURCE_GROUP | 停止當前資源組內(nèi)滿足條件查詢,并提交到另一個資源組執(zhí)行。 | { "resubmit": {"resource_group":"<resource_group_name>"}} resource_group_name:資源組名稱。 說明 您可以登錄云原生數(shù)據(jù)倉庫AnalyticDB MySQL控制臺,單擊目標集群ID,在資源組管理頁面查看集群的資源組。 |
ADD_PROPERTIES | 修改查詢的屬性。通常用于修改查詢優(yōu)先級,也可以修改Hint配置的其他查詢屬性。 | { "add_prop": {"query_priority": "<Priority level>", "force":"false"}}
|
BLOCK_WITH_PROB | 以一定概率在查詢?nèi)腙犌敖Y(jié)束查詢。通常用于限流。 | { "block_prob": {"prob":<prob_value>}} prob_value:結(jié)束查詢的概率,取值范圍為0~1。 |