更新时间:2025-09-05 GMT+08:00

配置OpenSearch集群大查询隔离

通过大查询隔离可以管理高内存或长耗时查询,保障OpenSearch集群稳定性并避免OOM异常。

随着业务规模扩大,OpenSearch集群面临的查询压力日益增加。部分复杂查询可能占用大量节点内存,导致机器频繁垃圾回收甚至发生OOM异常,严重影响集群性能和稳定性。为保障集群稳定运行,CSS服务提供了大查询隔离功能,帮助用户有效管理高内存、长耗时的查询请求。通过大查询隔离,可以解决以下问题:
  • 隔离高内存/长耗时查询:将大查询任务单独管理,避免影响正常业务。
  • 堆内存阈值触发中断:当节点堆内存使用率过高时,中断隔离池中的大查询。
  • 全局超时控制:设置所有查询的超时时间,自动取消超时任务。

原理介绍

  • 隔离池管理:大查询任务被放入隔离池,独立于普通查询。隔离池任务会根据内存、时间阈值触发中断。
  • 中断策略:
    • fair策略:综合内存和时间选择中断目标。
    • mem-first策略:优先中断内存使用最大的任务。
    • time-first策略:优先中断运行时间最长的任务。
  • 原生Cancel接口:使用OpenSearch原生的cancel接口中断查询任务,确保兼容性。

约束限制

  • OpenSearch集群仅2.19.0版本支持大查询隔离功能。
  • 大查询隔离特性默认开启,全局超时特性默认关闭,用户可根据需要实时配置,配置后立即生效。

登录OpenSearch Dashboards

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

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

配置大查询隔离

大查询隔离会将大查询任务放入隔离池,隔离池任务会根据内存、时间阈值触发中断。大查询隔离特性默认开启,用户可根据需要实时配置,配置后立即生效。

  1. 执行如下命令,开启大查询隔离。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.enabled": true
      }
    }
    表1 大查询隔离的参数说明

    参数

    参数类型

    描述

    search.isolator.enabled

    Boolean

    大查询隔离功能开关,开启后可以将大查询任务单独管理,避免影响正常业务。

    • true(默认值):开启大查询隔离功能。
    • false:关闭大查询隔离功能。
  2. 执行如下命令,设置单个分片查询任务被定义为大查询任务的阈值。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.memory.task.limit": "50MB",
        "search.isolator.time.management": "10s"
      }
    }
    表2 大查询阈值的参数说明

    参数

    参数类型

    描述

    search.isolator.memory.task.limit

    String

    大查询任务内存阈值,用于控制查询任务申请的大内存,超过此阈值将被隔离观察。

    取值范围:0b~节点最大堆内存

    单位:MB、GB等OpenSearch支持的单位。

    默认值为50MB。

    说明:

    查询集群堆内存使用情况和最大值的命令参考:

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

    search.isolator.time.management

    String

    查询时长阈值,用于控制查询任务执行时间(从开始使用集群资源进行查询算起),超过此阈值将被隔离观察。

    取值范围:≥ 0ms

    支持的单位包括s(秒)、ms(毫秒)、m(分钟)、h(小时)

    默认值为10s。

  3. 执行如下命令,触发隔离池内查询任务中断的阈值。
    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”两个参数控制查询任务进入到隔离池的数量。

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

    参数

    参数类型

    描述

    search.isolator.strategy

    String

    查询中断策略,用于定义触发中断控制程序时选取查询任务的策略。

    • fair(默认值):综合考虑内存和运行时间,如果查询内存差异≤“最大堆内存 x fair策略的阈值”,则优先中断运行时间长的查询;如果查询内存差异>“最大堆内存 x fair策略的阈值”,则优先中断内存占用大的查询。
    • mem-first:优先中断内存占用最大的查询。
    • time-first:优先中断运行时间最长的查询。

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

    search.isolator.strategy.ratio

    String

    fair策略的阈值,用于衡量内存差异与最大堆内存的比例关系。当大查询任务内存相差不超过该阈值时,优先中断运行时间长的任务;否则优先中断内存占用大的任务。

    仅当“search.isolator.strategy”“fair”时生效。

    取值范围:0.0-100.0%

    默认值为1%。

配置全局超时控制

全局超时控制可以设置所有查询的超时时间,并自动取消超时任务。全局查询超时功能默认关闭,用户可根据需要实时配置,配置后立即生效。

执行如下命令,开启全局查询超时功能并设置全局查询超时时间。
PUT _cluster/settings
{
  "persistent": {
    "search.isolator.time.enabled": true,
    "search.isolator.time.limit": "110s"
  }
}
表5 参数说明

参数

参数类型

描述

search.isolator.time.enabled

Boolean

全局查询超时功能开关,开启后当查询任务超过全局查询超时时间,则自动取消超时任务。

  • true:开启全局查询超时功能。
  • false(默认值):关闭全局查询超时功能。

search.isolator.time.limit

String

全局查询超时时间,设置所有查询的超时时间,超过该时间则自动取消超时任务。

取值范围:≥ 0ms

默认值为120s。

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

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

参数名

数据类型

说明

search.isolator.log.count

Integer

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

仅当“search.isolator.enabled”“true”时生效。

取值范围:0~5000

默认值为100。

可通过以下接口查询取消请求日志:

  • 查询所有节点
    GET /_isolator_metrics
  • 查询单个节点
    GET /_isolator_metrics/{nodeId}
  • 查询所有节点被取消查询请求的详细信息
    GET /_isolator_metrics?detailed
  • 查询单个节点被取消查询请求的详细信息
    GET /_isolator_metrics/{nodeId}?detailed

其中nodeId为节点ID。