配置Elasticsearch集群大查询隔离
通过大查询隔离可以管理高内存或长耗时查询,保障Elasticsearch集群稳定性并避免OOM异常。
- 隔离高内存/长耗时查询:将大查询任务单独管理,避免影响正常业务。
- 堆内存阈值触发中断:当节点堆内存使用率过高时,中断隔离池中的大查询。
- 全局超时控制:设置所有查询的超时时间,自动取消超时任务。
功能介绍
- 定义大查询任务:
- 追踪记录查询任务创建大数组对象的内存开销,当内存开销大于大查询任务标准时将其标记为大查询任务。
- 周期检查各个查询任务运行时长,当查询任务运行时长大于大查询任务标准时将其标记为大查询任务。
- 中断策略:
- fair策略:综合内存和时间选择中断目标。
- mem-first策略:优先中断内存使用最大的任务。
- time-first策略:优先中断运行时间最长的任务。
- 原生Cancel接口:使用Elasticsearch原生的cancel接口中断查询任务,确保兼容性。
约束限制
Elasticsearch集群仅在7.6.2和7.10.2版本中支持大查询隔离功能,且默认启用。大查询隔离功能中的全局超时特性默认关闭,如有需要可以通过API动态配置,配置完成后将立即生效。
登录Kibana
登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍配置指导。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
- 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。
控制台左侧是命令输入框,其右侧的三角形图标为执行按钮,右侧区域则显示执行结果。
配置大查询隔离
大查询隔离会将大查询任务放入隔离池,隔离池任务会根据内存、时间阈值触发中断。大查询隔离的功能开关默认开启,用户可根据业务需求动态配置,配置后立即生效。
- 执行如下命令,开启/关闭大查询隔离的功能开关。
PUT _cluster/settings { "persistent": { "search.isolator.enabled": true } }表1 大查询隔离开关的参数说明 参数
类型
默认值
说明
search.isolator.enabled
Boolean
true
大查询隔离功能开关,开启后可以将大查询任务单独管理,避免影响正常业务。
取值范围:
- true:开启大查询隔离功能。
- false:关闭大查询隔离功能。
- 执行如下命令,设置单个分片查询任务被定义为大查询任务的阈值。
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”,通过调大参数值以容纳更多查询任务,避免因资源不足触发熔断机制(如“查询请求被频繁熔断”)。
- 执行如下命令,设置触发隔离池内查询任务中断的阈值。
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。
当集群可能存在流量高峰或浪涌时,可适当调小本参数值,以更早触发熔断机制,防止堆内存过载。
- 执行如下命令,设置中断策略。
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%
建议保持默认值或根据实际情况谨慎调整。
- 执行如下命令,设置大查询隔离日志中记录的被取消查询任务的最大数量。
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"
}
}
|
参数 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
search.isolator.time.enabled |
Boolean |
false |
全局查询超时功能开关,开启后当查询任务超过全局查询超时时间,则自动取消超时任务。 取值范围:
|
|
search.isolator.time.limit |
String |
120s |
全局查询超时时间,设置所有查询的超时时间,超过该时间则自动取消超时任务。 取值格式:数字+单位
最小值:0(所有查询被取消) |