Elasticsearch [type=circuit_breaking_exception, reason=[parent] Data too large....]

这篇博客详细解释了Elasticsearch中遇到的内存溢出错误,涉及内存使用限制、Circuit Breaker原理,并提供了调整内存配置的解决方案,包括设置fieldData、request和total断路器限制。

前提
环境:ElasticSearch 7.6.2、kibana 7.6.2
-Xmx:1G

在这里插入图片描述

问题
根据一些条件进行query查询时出现了:
ElasticsearchStatusException[Elasticsearch exception [type=circuit_breaking_exception, reason=[parent] Data too large, data for [<http_request>] would be [1035707518/987.7mb], which is larger than the limit of [986061209/940.3mb], real usage: [1035706544/987.7mb], new bytes reserved: [974/974b], usages [request=0/0b, fielddata=1487938/1.4mb, in_flight_requests=974/974b, accounting=1545815/1.4mb]]]

分析问题
出错这种错误的确是内存方面的原因,来看下,
Data too large, data for [<http_request>] would be [1035707518/987.7mb], //A
which is larger than the limit of [986061209/940.3mb], //B
real usage: [1035706544/987.7mb], //C
new bytes reserved: [974/974b] //D

这里有4个数值:

B处的数就是上限,超过这个就报错。(缺省是它是ES最大内存的95%)
C处的数值是你的本机上ES进程已使用的内存大小
D处的数值1150就是你本次操作(或者说执行当前的任务)所需要内存
C + D = A > B,所以报错了
结论
到这里你也应该很清楚问题的最终因素,内存?对,就是内存问题!

简单粗暴解决办法
你可以增大-Xmx量(如果物理内存足够的话)
当然,最省事的做法就是关闭CircuitBreaker检查(不建议)

关于ES的内存优化配置
断路器
indices.breaker.fielddata.limit
fielddata 断路器默认设置堆的 60% 作为 fielddata 大小的上限。

indices.breaker.request.limit
request 断路器估算需要完成其他请求部分的结构大小,例如创建一个聚合桶,默认限制是堆内存的 40%。

indices.breaker.total.limit
total 揉合 request 和 fielddata 断路器保证两者组合起来不会使用超过堆内存的 70%。

indices.fielddata.cache.size
缓存回收大小,无默认值, 有了这个设置,最久未使用(LRU)的 fielddata 会被回收为新数据腾出空间

PUT /_cluster/settings
{
  "persistent": {
    "indices.breaker.fielddata.limit": "60%"
  }
} 
PUT /_cluster/settings
{
  "persistent": {
    "indices.breaker.request.limit": "40%"
  }
} 
PUT /_cluster/settings
{
  "persistent": {
    "indices.breaker.total.limit": "70%"
  }
} 

最后一项要在elasticsearch.yml中配置

#最久未使用(LRU)的 fielddata 会被回收为新数据腾出空间   
indices.fielddata.cache.size:  40%

建议
最好为断路器设置一个相对保守点的值。 记住 fielddata 需要与 request 断路器共享堆内存、索引缓冲内存和过滤器缓存。Lucene 的数据被用来构造索引,以及各种其他临时的数据结构。 正因如此,它默认值非常保守,只有 60% 。过于乐观的设置可能会引起潜在的堆栈溢出(OOM)异常,这会使整个节点宕掉。
另一方面,过度保守的值只会返回查询异常,应用程序可以对异常做相应处理。异常比服务器崩溃要好。
上面几项的关系

当前fieldData缓存区大小 < indices.fielddata.cache.size 
当前fieldData缓存区大小 + 下一个查询加载进来的fieldData < indices.breaker.fielddata.limit 
indices.breaker.request.limit + indices.breaker.fielddata.limit < indices.breaker.total.limit

Elastic官方文档:限制内存使用
————————————————
版权声明:本文为优快云博主「小小小丶老鼠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_33576276/article/details/110945364

<think>好的,我现在需要帮助用户解决Elasticsearch连接时出现的circuit_breaking_exception错误。首先,我得回忆一下这个错误通常是什么原因导致的。根据用户提供的引用内容,这个错误通常是因为查询或操作的数据量超过了Elasticsearch的断路器限制。比如引用[1]和[2]提到数据量过大,导致超过配置的内存限制,触发断路器。 接下来,我应该整理解决这个问题的步骤。首先,需要确认错误信息中的具体原因,比如是fielddata、请求还是其他部分的内存不足。用户提供的引用[2]中的错误信息显示是http_request相关的数据超过了父级断路器的限制。这说明可能需要调整父级断路器的设置。 根据引用[4],调整集群设置是一个方法,比如增加fielddata的断路器限制到40%。但用户可能还需要调整其他类型的断路器,比如请求断路器或者父级断路器。因此,解决方案可能包括临时调整配置、优化查询、增加内存或扩容集群等步骤。 然后,我需要考虑用户可能的操作环境,比如是在生产环境还是测试环境,是否能够临时调整集群设置。引用[3]提到在演示线出现异常,可能演示环境的资源配置较低,需要调整配置或优化查询。 另外,用户可能需要知道如何预防这类问题再次发生,比如监控内存使用、优化索引结构、避免大聚合查询等。例如,引用[1]建议检查查询的数据量和优化查询语句,这可能涉及到减少返回的数据量或使用分页。 在步骤中,还需要指导用户如何具体修改集群设置,使用PUT _cluster/settings API,并注意持久化和临时设置的区别。同时,提醒用户修改配置时要谨慎,避免设置过高导致节点OOM。 最后,生成的相关问题需要覆盖常见的原因和解决方法,比如调整断路器参数、优化查询、硬件升级等,这样用户可以进一步了解如何预防和彻底解决问题。</think>### 如何解决Elasticsearch的`circuit_breaking_exception`错误? `circuit_breaking_exception`是Elasticsearch的断路器机制触发的内存保护措施,表明当前操作所需内存超过配置阈值。以下是逐步解决方案: --- #### **1. 确认错误类型** 错误信息中会明确触发断路器的类型,例如: - **`[parent]`**:父级断路器(总内存限制) - **`fielddata`**:字段数据缓存限制 - **`request`**:单个请求的内存限制 例如,引用[2]的报错是父级断路器限制导致: ```plaintext Data too large for [<http_request>] would be [1.8gb], exceeding limit [1.8gb] ``` --- #### **2. 临时调整断路器配置** 通过动态更新集群设置,**临时缓解问题**(重启后失效): - **调整父级断路器**(默认95%堆内存): ```json PUT _cluster/settings { "transient": { "indices.breaker.total.limit": "60%" } } ``` - **调整字段数据断路器**(引用[4]示例): ```json PUT _cluster/settings { "persistent": { "indices.breaker.fielddata.limit": "40%" } } ``` --- #### **3. 优化查询或操作** 避免一次性加载过多数据: - **减少聚合查询的`size`**:降低返回结果量。 - **使用分页**:通过`from`和`size`分批次查询。 - **避免通配符查询**:如`*:*`可能加载全部字段数据[^1]。 --- #### **4. 增加堆内存或扩容** - **调整JVM堆内存**:在`jvm.options`中修改`-Xms`和`-Xmx`(不超过物理内存50%)[^4]。 - **垂直扩容**:提升单节点内存。 - **水平扩容**:增加节点数量,分散数据压力。 --- #### **5. 监控与预防** - **启用监控工具**:如Elasticsearch的`_nodes/stats`接口或Kibana的监控模块。 - **定期清理缓存**:调用`POST /_fielddata/clear`释放字段数据缓存。 - **优化索引设计**:对频繁聚合的字段启用`doc_values`,减少内存占用[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值