本文介绍工作负载管理的最佳实践。
前提条件
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;