負載管理最佳實踐
本文介紹工作負載管理的最佳實踐。
前提條件
AnalyticDB for MySQL集群需要同時滿足以下條件:
集群系列需為數倉版。
集群的內核版本需為3.1.6.3及以上版本。
說明查看企業版或湖倉版集群的內核版本,請參見如何查看實例版本信息。如需升級內核版本,請聯系技術支持。
事前限流
事前限流是指在查詢入隊前對查詢進行優先級判斷,從而把查詢分配進對應的隊列中,然后通過配置調整隊列并發,達到限流的效果。
優先級隊列:
相同pattern_hash的SQL限流
AnalyticDB for MySQL集群支持對相同Pattern的SQL進行限流。相同pattern_hash的SQL限流可以通過wlm calc_pattern_hash
命令計算SQL的pattern_hash并配置規則,將pattern_hash相同的所有查詢放入Low隊列,再通過修改隊列并發數進行限流。
創建以下規則,將對應Pattern的查詢放進Low隊列中。
wlm add_rule name=confine_query type=query action=ADD_PROPERTIES predicate='pattern_hash=XXXXXXXXXXXXXX' attrs='{ "add_prop": { "query_priority": "low" } }'
說明wlm calc_pattern_hash
命令的詳細信息,請參見計算pattern_hash。通過配置修改Low隊列的并發數達到限流的目的。默認并發數為20。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE=20;
對歷史執行情況中滿足一定條件的大查詢SQL限流
創建以下規則,將Pattern歷史執行時間50分位值大于2000的查詢放進Low隊列。
wlm add_rule name=confine_query type=query action=ADD_PROPERTIES predicate='PATTERN_EXECUTION_TIME_P50>2000' attrs='{ "add_prop": { "query_priority": "low" } }'
通過配置修改Low隊列的并發數達到限流的目的。默認并發數為20。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE=20;
事中控制異常查詢
當AnalyticDB for MySQL集群發生嚴重的阻塞,為了避免KILL ALL語句結束全部查詢造成的寫入任務失敗,可以通過配置對應的規則分類型結束查詢。
結束所有SELECT查詢
通常結束SELECT查詢,可以把QUERY_TASK_TYPE
設置為1,設置后所有SELECT查詢都會被結束,但是后續來的所有查詢也會被結束,所以系統負載降低后一定要刪除或屏蔽這條規則。刪除或屏蔽規則的具體操作,請參見WLM。
wlm add_rule
name=kill_select_query
type=query
action=KILL
predicate='query_task_type=1'
結束某個用戶的查詢
已定位到導致AnalyticDB for MySQL集群不可用的查詢來自某個用戶時,結束這個用戶的所有查詢。
wlm add_rule
name=kill_query_from_user
type=query
action=KILL
predicate='user=testuser1'
結束某個IP的查詢
已定位到導致AnalyticDB for MySQL集群不可用的查詢來自某個IP時,結束這個IP的所有查詢。
wlm add_rule
name=kill_query_from_ip
type=query
action=KILL
predicate='source_ip=10.10.XX.XX'
結束使用內存超過100 MB的所有查詢
已定位到AnalyticDB for MySQL集群的不穩定是由大查詢影響時,可通過配置規則結束使用內存超過100 MB的所有查詢,包括SELECT查詢和寫入。
wlm add_rule
name=kill_Big_query
type=query
action=KILL
predicate='QUERY_PEAK_MEMORY>=100'
結束使用內存超過100 MB的SELECT查詢
已定位到AnalyticDB for MySQL集群的不穩定是由大查詢影響,可通過配置規則結束使用內存超過100 MB的SELECT查詢,來限制這部分大查詢且不影響寫入任務。
wlm add_rule
name=kill_Big_query
type=query
action=KILL
predicate='QUERY_PEAK_MEMORY>100 && query_task_type=1'
日常限流(庫表查詢限流)
對掃描某些表或庫的查詢進行限流或者對掃描到某些表或庫的查詢提升優先級。
創建以下規則。
wlm add_rule name=confine_query_in_table type=query action=ADD_PROPERTIES predicate='query_table_list in database.table1, database.table2' attrs='{ "add_prop": { "query_priority": "low" } }'
通過配置修改Low隊列的并發數達到限流的目的。默認并發數為20。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE=20;