更新时间:2026-01-28 GMT+08:00
分享

配置Elasticsearch集群大查询隔离

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

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

功能介绍

  • 定义大查询任务:
    • 追踪记录查询任务创建大数组对象的内存开销,当内存开销大于大查询任务标准时将其标记为大查询任务。
    • 周期检查各个查询任务运行时长,当查询任务运行时长大于大查询任务标准时将其标记为大查询任务。
  • 中断策略:
    • fair策略:综合内存和时间选择中断目标。
    • mem-first策略:优先中断内存使用最大的任务。
    • time-first策略:优先中断运行时间最长的任务。
  • 原生Cancel接口:使用Elasticsearch原生的cancel接口中断查询任务,确保兼容性。

约束限制

Elasticsearch集群仅在7.6.2和7.10.2版本中支持大查询隔离功能,且默认启用。大查询隔离功能中的全局超时特性默认关闭,如有需要可以通过API动态配置,配置完成后将立即生效。

登录Kibana

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

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

    控制台左侧是命令输入框,其右侧的三角形图标为执行按钮,右侧区域则显示执行结果。

配置大查询隔离

大查询隔离会将大查询任务放入隔离池,隔离池任务会根据内存、时间阈值触发中断。大查询隔离的功能开关默认开启,用户可根据业务需求动态配置,配置后立即生效。

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

    参数

    类型

    默认值

    说明

    search.isolator.enabled

    Boolean

    true

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

    取值范围:

    • 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

    50MB

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

    取值格式:数字+单位

    • 数字:自然数
    • 单位:B、K、KB、M、MB、G、GB、T、TB、P、PB(不区分大小写)

    最小值:0(所有查询都被隔离)

    最大值:节点最大堆内存

    如果将参数值调小,可能导致更多查询任务被纳入大查询隔离池,从而增加隔离池的内存占用比例。此时建议同步调整参数“search.isolator.memory.pool.limit”“search.isolator.count.limit”,通过调大参数值以容纳更多查询任务,避免因资源不足触发熔断机制(如“查询请求被频繁熔断”)。

    search.isolator.time.management

    String

    10s

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

    取值格式:数字+单位

    • 数字:自然数
    • 单位:nanos(纳秒)、micros(微秒)、ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)

    最小值:0(所有查询都被隔离)

    如果将参数值调小,可能导致更多查询任务被纳入大查询隔离池,从而增加隔离池的内存占用比例。此时建议同步调整参数“search.isolator.memory.pool.limit”“search.isolator.count.limit”,通过调大参数值以容纳更多查询任务,避免因资源不足触发熔断机制(如“查询请求被频繁熔断”)。

  3. 执行如下命令,设置触发隔离池内查询任务中断的阈值。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.memory.pool.limit": "50%",
        "search.isolator.count.limit": 1000,
        "search.isolator.memory.heap.limit": "90%"
      }
    }
    表3 任务中断阈值的参数说明

    参数

    类型

    默认值

    说明

    search.isolator.memory.pool.limit

    String

    50%

    隔离池内存占用率阈值,表示隔离池所需内存占当前节点最大堆内存的百分比。当隔离池所有大查询任务申请的内存总和的占用率超过该阈值时,将触发中断控制程序,并根据预设策略取消隔离池中的一条大查询任务,以释放资源并防止内存溢出。

    取值范围:0.0~100.0%

    如果集群中以大查询任务为主(内存占用高或执行时间长),可以适当调大本参数值,并结合参数“search.isolator.memory.task.limit”“search.isolator.time.management”控制隔离池中的查询任务数量。

    search.isolator.count.limit

    Integer

    1000

    隔离池查询数量阈值,表示当前节点的隔离池中大查询任务的最大数量。当隔离池中被隔离的大查询任务数量超过此阈值时,将触发中断控制程序,不再接受新任务到隔离池,以防止资源耗尽。

    取值范围:10~50000

    如果集群中以大查询任务为主(内存占用高或执行时间长),可以适当调大本参数值,并结合参数“search.isolator.memory.task.limit”“search.isolator.time.management”控制隔离池中的查询任务数量。

    search.isolator.memory.heap.limit

    String

    90%

    堆内存使用率阈值,表示当前节点堆内存的使用率。当节点实际堆内存使用率超过该阈值时,将触发中断控制程序,并根据预设策略取消隔离池中的一条大查询任务,以释放资源并防止内存溢出。

    取值范围:0.0~100.0%

    在启用indices.breaker.total.use_real_memory时,本参数值必须小于indices.breaker.total.limit才能生效。否则,系统将优先触发Elasticsearch原生的熔断机制。详细请参见Circuit breaker settings

    当集群可能存在流量高峰或浪涌时,可适当调小本参数值,以更早触发熔断机制,防止堆内存过载。

  4. 执行如下命令,设置中断策略。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.strategy": "fair",
        "search.isolator.strategy.ratio": "0.5%"
      }
    }
    表4 中断策略的参数说明

    参数

    类型

    默认值

    说明

    search.isolator.strategy

    String

    fair

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

    • fair:综合考虑内存和运行时间,如果查询内存差异≤“Elasticsearch进程的最大堆内存 x fair策略的阈值”,则优先中断运行时间长的查询;如果查询内存差异>“Elasticsearch进程的最大堆内存 x fair策略的阈值”,则优先中断内存占用大的查询。其中Elasticsearch进程的最大堆内存为“min(31, 节点总内存/2) ”,单位是GB。
    • mem-first:优先中断内存占用最大的查询。
    • time-first:优先中断运行时间最长的查询。

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

    search.isolator.strategy.ratio

    String

    1%

    fair策略的阈值,用于衡量内存差异与最大堆内存的比例关系。

    • 当大查询任务的内存差异不大时,通过优先中断运行时间长的任务来维护公平性。
    • 当大查询任务的内存差异显著时,通过优先中断内存占用高的任务能更有效地释放资源,最大化系统性能。

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

    取值范围:0.0-100.0%

    建议保持默认值或根据实际情况谨慎调整。

  5. 执行如下命令,设置大查询隔离日志中记录的被取消查询任务的最大数量。
    PUT _cluster/settings
    {
      "persistent": {
        "search.isolator.log.count": "100"
      }
    }
    表5 参数说明

    参数

    类型

    默认值

    说明

    search.isolator.log.count

    Integer

    100

    控制大查询隔离日志中记录的被取消查询任务的最大数量。

    当大查询隔离机制触发中断控制程序并取消某一大查询任务时,系统会将这些查询请求信息记录到日志中,用于分析和优化查询性能。当被取消的查询任务数量超过此阈值时,系统会自动删除最早的记录,仅保留最新的记录,从而避免日志文件无限增长,占用过多内存。

    取值范围:0~5000

    0表示关闭日志记录功能。

    通过以下接口可以查询被取消查询任务的日志信息:

    • 查询所有节点被取消查询任务的统计信息
      GET /_isolator_metrics
    • 查询指定节点被取消查询任务的统计信息
      GET /_isolator_metrics/{nodeId}
    • 查询所有节点被取消查询任务的详细信息
      GET /_isolator_metrics?detailed
    • 查询指定节点被取消查询任务的详细信息
      GET /_isolator_metrics/{nodeId}?detailed
    表6 参数说明

    参数

    类型

    默认值

    说明

    node_id

    String

    指定集群节点ID。

    • 单个节点:直接输入节点ID。
    • 多个节点:用英文逗号分隔多个ID。
    节点ID可以通过如下命令获取:
    GET _cat/nodes?s=n&h=n,id&v=true&full_id=true

    返回结果示例:

    {
      "_nodes": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "cluster_name": "test",
      "nodes": {
        "CTqrZFXWTzmLonSZyNMKkQ": {
          "name": "test-ess-esn-1-1",
          "host": "172.16.101.116",
          "total_cancel": 0,	//被取消的查询任务总数
          "isolator_cancel": 0,	//因超隔离池阈值被取消的查询任务个数
          "out_of_time_cancel": 0	//因查询超时被取消的查询任务个数
        }
      }
    }

配置全局超时控制

全局超时控制可以设置所有查询的超时时间,并自动取消超时任务(返回“cancel cause by global time limit”),以确保长时间运行的查询不会占用过多资源。全局查询超时的功能开关默认关闭,用户可根据业务需求动态配置,配置后立即生效。

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

参数

类型

默认值

说明

search.isolator.time.enabled

Boolean

false

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

取值范围:

  • true:开启全局查询超时功能。
  • false:关闭全局查询超时功能。

search.isolator.time.limit

String

120s

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

取值格式:数字+单位

  • 数字:自然数
  • 单位:nanos(纳秒)、micros(微秒)、ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)

最小值:0(所有查询被取消)

相关文档