使用慢查询隔离池
在使用Elasticsearch进行查询时,您可能经常遇到这种问题:向集群发送了一条慢查询,占满了所有的节点资源,导致CPU占满或者内存溢出,影响线上业务。针对这类问题,阿里云Elasticsearch开发了慢查询隔离池功能,实现对单条查询请求进行开销追踪及逻辑隔离,超过资源安全阈值后,自动熔断异常查询,避免单条异常查询导致集群异常,提高集群的稳定性。本文介绍慢查询隔离池的使用方法。
背景信息
慢查询隔离池(Slow Query Isolation Pool)功能的原理是,配置固定大小的资源隔离池(内存维度),当单条查询运行时申请的内存大小超过设定的阈值时,将该查询任务放到隔离池中管理。当隔离池的内存总量超过设定阈值时,通过可插拔的优先级策略熔断资源消耗最大的查询。
注意事项
慢查询隔离是阿里云Elasticsearch实例6.7.0版本且内核1.3.0版本、实例7.10.0版本的特性。
说明在使用慢查询隔离功能前,6.7.0版本实例需要将内核版本升级至1.3.0版本,支持升级的版本包括:通用商业版0.3.0、1.0.2和1.2.0,不支持1.0.1。7.10.0版本实例可以直接使用该功能。
慢查询隔离池默认为关闭(false)状态,使用前需要手动开启。
本文中的命令,均可在Kibana控制台上执行。登录Kibana控制台的具体操作步骤,请参见登录Kibana控制台。
使用流程
开启慢查询隔离功能。
PUT _cluster/settings { "persistent": { "search.isolator.enabled": true } }
说明如需关闭,将search.isolator.enabled设置为null或false即可。
配置查询拦截阈值。当查询请求大小或延时超过定义的阈值时,将其放入慢查询隔离池。
PUT _cluster/settings { "persistent": { "search.isolator.trigger.task.mem_cost": "500mb", "search.isolator.trigger.task.latency": "10s" } }
参数
默认值
说明
search.isolator.trigger.task.mem_cost
100mb
查询请求内存使用阈值。当单个查询任务使用内存超过阈值时,系统会将其放入慢查询隔离池中。
search.isolator.trigger.task.latency
10s
查询请求延迟阈值。当单个查询任务耗时超过阈值时,系统会将其放入慢查询隔离池中。
配置慢查询隔离池总内存阈值。当慢查询的内存占用达到任一阈值,将触发熔断(取消隔离池中资源消耗最大的查询请求)。
PUT _cluster/settings { "persistent": { "search.isolator.total.mem.limit": "60%", "search.isolator.total.heap.usage.limit": "75%", "search.isolator.total.tasks.limit": 1000 } }
参数
默认值
说明
search.isolator.total.mem.limit
60%
慢查询隔离池堆内存占用整个集群的比例阈值。默认为60%,表示当占用率达到60%时,通过可插拔的优先级策略,熔断隔离池中资源消耗最大的查询。
search.isolator.total.heap.usage.limit
75%
整体堆内存使用率阈值。默认为75%,表示当堆内存整体使用率达到75%时,通过可插拔的优先级策略,熔断隔离池中资源消耗最大的查询。
search.isolator.total.tasks.limit
1000
慢查询隔离池最多允许处理的任务数。默认为1000,表示隔离池中同时处理的查询数超过1000时,通过可插拔的优先级策略,熔断隔离池中资源消耗最大的查询。
查看慢查询隔离池中的查询请求列表。
GET _tasks/isolator?detailed=true
取消查询任务。
POST _tasks/<taskId>/_cancel
<taskId>需要替换为查询任务的ID,可在上一步的查询请求列表中获取。