在使用Elasticsearch进行查询时,您可能经常遇到这种问题:向集群发送了一条慢查询,占满了所有的节点资源,导致CPU占满或者内存溢出,影响线上业务。针对这类问题,阿里云Elasticsearch开发了慢查询隔离池功能,实现对单条查询请求进行开销追踪及逻辑隔离,超过资源安全阈值后,自动熔断异常查询,避免单条异常查询导致集群异常,提高集群的稳定性。本文介绍慢查询隔离池的使用方法。

背景信息

慢查询隔离池功能的原理是,配置固定大小的资源隔离池(内存维度),当单条查询运行时申请的内存大小超过设定的阈值时,将该查询任务放到隔离池中管理。当隔离池的内存总量超过设定阈值时,通过可插拔的优先级策略熔断资源消耗最大的查询。

注意事项

  • 慢查询隔离是阿里云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控制台

使用流程

  1. 开启慢查询隔离功能。
    PUT _cluster/settings
    {
      "persistent": {   
         "search.isolator.enabled": true
       }
    }
    说明 如需关闭,将search.isolator.enabled设置为nullfalse即可。
  2. 配置查询拦截阈值。当查询请求大小或延时超过定义的阈值时,将其放入慢查询隔离池。
    PUT _cluster/settings
    {
       "persistent": {
          "search.isolator.trigger.task.mem_cost": "500mb",  
          "search.isolator.trigger.task.latency": "10s" 
       }
    }
    参数 默认值 说明
    search.isolator.trigger.task.mem_cost 500mb 查询请求内存使用阈值。当单个查询任务使用内存超过阈值时,系统会将其放入慢查询隔离池中。
    search.isolator.trigger.task.latency 10s 查询请求延迟阈值。当单个查询任务耗时超过阈值时,系统会将其放入慢查询隔离池中。
  3. 配置慢查询隔离池总内存阈值。当慢查询的内存占用达到任一阈值,将触发熔断(取消隔离池中资源消耗最大的查询请求)。
    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时,触发慢查询熔断。
  4. 查看慢查询隔离池中的查询请求列表。
    GET _tasks/isolator?detailed=true
  5. 取消查询任务。
    POST _tasks/<taskId>/_cancel