更新时间:2025-08-22 GMT+08:00
分享

配置Elasticsearch集群大查询隔离

场景描述

大查询隔离支持对查询请求进行独立管理,将高内存、长耗时的查询请求进行隔离,保证节点内存安全。在节点堆内存使用率过高时,触发中断控制程序,根据选择的中断策略将其中一条大查询请求进行中断,取消其正在运行的查询任务。大查询隔离同时支持全局查询超时配置,用户可实时配置所有查询请求的超时时间,中断超时查询请求。其中,中断能力采用的是Elasticsearch原生cancel接口。

大查询隔离可以有效解决以下问题,提升集群的搜索能力。
  • 部分查询占用了很高的节点堆内存,导致机器频繁Garbage Collect,甚至引发OOM异常。
  • 频繁Garbage Collect导致节点脱离,查询迟迟无法响应甚至失败。
  • 查询量过大导致CPU爆满,线上业务受到影响。

约束限制

仅Elasticsearch 7.6.2、Elasticsearch 7.10.2集群支持大查询隔离。

登录Kibana

登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍配置指导。

  1. 登录云搜索服务管理控制台
  2. 在左侧导航栏,选择“集群管理 > Elasticsearch”
  3. 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
  4. 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。

配置大查询隔离开关

大查询隔离特性默认开启,全局超时特性默认关闭,用户可根据需要实时配置,配置后立即生效。

执行如下命令,开启大查询隔离和全局查询超时的特性开关。
PUT _cluster/settings
{
  "persistent": {
    "search.isolator.enabled": true,
    "search.isolator.time.enabled": true
  }
}

以上两个开关是独立功能,当开关打开后,支持配置的参数请参见表1

表1 大查询隔离和全局超时的参数配置

特性开关

配置参数

参数说明

search.isolator.enabled

search.isolator.memory.task.limit

search.isolator.time.management

单个分片查询任务被定义为大查询任务的阈值。

search.isolator.memory.pool.limit

search.isolator.memory.heap.limit

search.isolator.count.limit

触发隔离池内查询任务中断的阈值。

说明:

参数“search.isolator.memory.heap.limit”定义了节点实际堆内存的使用限制,包括写入和查询等操作,超过限制时将选取隔离池内的大查询任务进行中断。

search.isolator.strategy

search.isolator.strategy.ratio

中断隔离池中某一条查询任务的选取策略。

search.isolator.time.enabled

search.isolator.time.limit

全局查询任务超时设置。

配置大查询隔离阈值

  • 执行如下命令,设置单个分片查询任务被定义为大查询任务的阈值。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.memory.task.limit": "50MB",
        "search.isolator.time.management": "10s"
      }
    }
    表2 大查询任务阈值的参数说明

    参数

    参数类型

    描述

    search.isolator.memory.task.limit

    String

    查询任务用于聚合等操作向节点申请的大内存,申请内存超过此阈值将进行隔离观察。

    • 取值范围:0b~节点最大堆内存
    • 默认值:50MB
    说明:

    可以通过如下命令查询集群堆内存使用情况和最大值。

    GET _cat/nodes?&h=id,ip,port,r,ramPercent,ramCurrent,heapMax,heapCurrent

    search.isolator.time.management

    String

    查询任务创建至今的时长(即开始使用集群资源进行查询),超过阈值将被隔离观察。

    • 取值范围:≥ 0ms
    • 默认值:10s
  • 执行如下命令,触发隔离池内查询任务中断的阈值。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.memory.pool.limit": "50%",
        "search.isolator.memory.heap.limit": "90%",
        "search.isolator.count.limit": 1000
      }
    }
    表3 隔离池阈值的参数说明

    参数

    参数类型

    描述

    search.isolator.memory.pool.limit

    String

    当前节点最大堆内存百分比,当隔离池所有大查询任务申请的内存超过此阈值将触发中断控制程序,取消执行隔离池其中一条大查询任务。

    • 取值范围:0.0~100.0%
    • 默认值:50%

    search.isolator.memory.heap.limit

    String

    当前节点堆内存的实际使用阈值,当节点堆内存使用超过阈值百分比时触发中断控制程序,取消执行隔离池其中一条大查询任务。

    • 取值范围:0.0~100.0%
    • 默认值:90%

    search.isolator.count.limit

    Integer

    当前节点隔离池的大查询任务数阈值,被观察的查询任务数超过此阈值将触发中断控制程序,不再接受新的大查询。如果继续触发大查询请求,则直接取消该请求。

    • 取值范围:10~50000
    • 默认值:1000

    根据业务设置“search.isolator.memory.pool.limit”“search.isolator.count.limit”参数时,可结合“search.isolator.memory.task.limit”“search.isolator.time.management”两个参数控制查询任务进入到隔离池的数量。

  • 执行如下命令,中断隔离池中某一条查询任务的选取策略。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.strategy": "fair",
        "search.isolator.strategy.ratio": "0.5%"
      }
    }
    表4 中断策略的参数说明

    参数

    参数类型

    描述

    search.isolator.strategy

    String

    触发中断控制程序时大查询选取的策略。根据策略选取一条查询进行中断。

    说明:

    大查询隔离池每秒检查一次,直至堆内存下降到安全范围。

    取值范围:fair、mem-first、time-first
    • mem-first策略是指触发中断时,选取隔离池中堆内存使用最大的一条查询任务进行中断。
    • time-first策略是指触发中断时,选取隔离池中已运行时间最长的一条查询任务进行中断。
    • fair策略是综合考虑内存和时间两种因素,如果分片查询的堆内存申请大小相差不超过“最大堆内存乘search.isolator.strategy.ratio”的大小,则认为时间较长的查询更应该中断。否则认为堆内存使用较大的查询更应该中断。

    默认值:fair

    search.isolator.strategy.ratio

    String

    fair策略的阈值,仅当“search.isolator.strategy”值为“fair”生效。综合考虑大查询的运行时间及内存,当大查询任务内存相差不超过此阈值时,考虑选取运行时间长的大查询进行中断。当查询内存相差超过此阈值时,选取大内存查询任务进行中断。

    • 取值范围:0.0-100.0%
    • 默认值:1%

配置全局查询超时时间

执行如下命令,设置全局查询任务超时时间。
PUT _cluster/settings
{
  "persistent": {
    "search.isolator.time.limit": "120s"
  }
}
表5 参数说明

参数

参数类型

描述

search.isolator.time.limit

String

当全局查询超时功能开启时,所有已创建的查询任务超过此时长将被取消执行。

  • 取值范围:≥ 0ms
  • 默认值:120s

配置取消查询请求的日志记录

执行如下命令,设置取消查询请求的日志记录的最大记录条数。
PUT _cluster/settings
{
  "persistent": {
    "search.isolator.log.count": "100"
  }
}

参数名

数据类型

说明

search.isolator.log.count

Integer

被取消的查询请求,会记录在内存中,此值限制最大的记录条数。

  • 取值范围:0~5000
  • 默认值:100
说明:

可以用以下接口查询被发起cancel的请求。

  • GET /_isolator_metrics查询所有节点
  • GET /_isolator_metrics/{nodeId}查询单个节点
  • GET /_isolator_metrics?detailed查询所有节点cancel详情
  • GET /_isolator_metrics/{nodeId}?detailed查询单个节点cancel详情

其中nodeId为节点ID。

相关文档