es 报错 Data too large 触发断路器

这篇具有很好参考价值的文章主要介绍了es 报错 Data too large 触发断路器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

事出有因

报错原因是 es 在 full GC 之前触发了默认的断路器,导致报错 [parent] Data too large,相似的报错内容如下:

Caused by: org.elasticsearch.common.breaker.CircuitBreakingException: [parent] Data too large, data for [<transport_request>] would be [1021339792/974mb], which is larger than the limit of [1020054732/972.7mb], real usage: [1021337736/974mb], new bytes reserved: [2056/2kb], usages [request=0/0b, fielddata=1730/1.6kb, in_flight_requests=88822/86.7kb, accounting=12643373/12mb]

查看当前 es 节点的 jvm 内存使用情况(ip和端口要换成自己的 es 节点)

curl -s -XGET '10.190.107.78:19200/_cat/nodes?v=true&h=name,node*,heap*' 
  • heap.current 当前使用的内存
  • heap.percent 内存使用量百分比
  • heap.max 内存最大值
name id   node.role heap.current heap.percent heap.max 
es-3 q8nd dilm           935.3mb           91      1gb 
es-2 U5GI dilm           700.2mb           68      1gb 
es-1 vgkL dilm           825mb             80      1gb 
es-0 UH0L dilm           511.6mb           49      1gb 

解决思路

  • 如果本机内存足够,并且满足官方的要求:不超过本机50%的内存或者不超过32G内存,那就可以直接通过配置 xmx 和 xms 来解决;有两种配置方法
    • 通过修改 jvm.options 文件内的 xmxxms 来实现
    • 通过环境变量 ES_JAVA_OPTS 来实现(7.x 系列是有的,具体可以看 elasticsearch 文件里面的内容来确定)
  • 如果本机内存不足以调整 jvm 内存了,那就需要通过调整 gc 垃圾回收来解决,同样的,可以通过上述两种方式来配置

ES Circuit Breaker 断路器

  • indices.breaker.total.use_real_memory - 默认为true
    • 静态设置确定父断路器是否应考虑实际内存使用情况(true)
    • 仅考虑子断路器保留的数量(false)
  • indices.breaker.total.limit - 父断路器触发上限
    • indices.breaker.total.use_real_memorytrue 时,默认为 jvm 堆内存的 95%
    • indices.breaker.total.use_real_memoryfalse 时,默认为 jvm 堆内存的 70%

jvm 常见的垃圾收集器的组合方式

  • -XX:+UseConcMarkSweepGC - 启用 CMS 垃圾收集器
  • -XX:CMSInitiatingOccupancyFraction=75 - 内存使用率达到 75% 的时候触发 full GC
  • -XX:+UseCMSInitiatingOccupancyOnly - 如果不指定,只是用设定的回收阈值 CMSInitiatingOccupancyFraction, 则 JVM 仅在第一次使用设定值,后续则自动调整会导致上面的那个参数不起作用

效果展示

我这里是通过上面三个参数,来指定 CMS 作为垃圾收集器,以此来解决 es 的报错问题

curl -s -XGET '10.190.107.78:19200/_cat/nodes?v=true&h=name,node*,heap*' 

可以从下面的数据看出,效果也是立竿见影

name id   node.role heap.current heap.percent heap.max 
es-1 vgkL dilm           431.6mb           43  989.8mb 
es-0 UH0L dilm           337.1mb           34  989.8mb 
es-2 U5GI dilm           500.5mb           50  989.8mb 
es-3 q8nd dilm           730.3mb           73  989.8mb

关于重启

重启 es 集群时,遵循从非 master 节点开始,依次重启,每一个节点起来后,再重启下一个节点;es 节点重启之前,可以先关闭 es 自动分片分配,避免多节点重启,过多分片重新分配,占用大量的 IO 把集群搞崩了

关闭自动分片分配

curl -XPUT 10.190.107.78:19200/_cluster/settings -H 'Content-Type: application/json' -d '
{
    "transient": {
        "cluster.routing.allocation.enable": "none"
    }
}'

开启自动分片分配

curl -XPUT 10.190.107.78:19200/_cluster/settings -H 'Content-Type: application/json' -d '
{
    "transient": {
        "cluster.routing.allocation.enable": "all"
    }
}'

课外扩展

限制内存使用文章来源地址https://www.toymoban.com/news/detail-801506.html

到了这里,关于es 报错 Data too large 触发断路器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud搭建微服务之Circuit Breaker断路器

    Circuit breaker是一套规范和接口,落地实现是Resilience4j,Resilience4j是一个专为函数式编程设计的轻量级容错库,Resilience4j提供高阶函数(装饰器),以通过断路器、速率限制器、重试或隔板增强任何功能接口、lambda表达式或方法引用。可以在任何函数式接口、lambda表达式或方法

    2024年04月27日
    浏览(28)
  • 微服务治理:微服务断路器(微服务故障隔离模式)详解

    微服务断路器是一种设计模式,可以保护系统免于级联故障,通过限制对故障服务的调用来实现。它的工作原理类似于电气断路器:当服务遇到问题时,它会切断请求流,使其有机会恢复,并防止其他服务被压垮。 工作原理: 闭合状态(正常运行): 断路器初始处于此状态

    2024年01月17日
    浏览(47)
  • SpringCloud学习6(Spring Cloud Alibaba)断路器Sentinel熔断降级

    SpringCloud、SpringCloudAlibaba、SpringBoot版本选择。为了避免各种千奇百怪的bug,我们还是采用官方推荐的毕业版本。 修改tomcat配置最大线程数 引入测试依赖 编写测试代码 这里同时我们在浏览器去请求该地址,响应会变得很慢 测试结论:此时会发现由于thread接口囤积大量请求,

    2023年04月08日
    浏览(51)
  • Spring Boot - 利用Resilience4j-Circuitbreaker实现断路器模式_防止级联故障

    Spring Boot - 利用Resilience4j-RateLimiter进行流量控制和服务降级 Resilience4J 是一个针对 Java 8 应用程序的轻量级容错和弹性库。它设计用于在分布式系统中的服务之间提供弹性和容错性。Resilience4J 的名字来源于它提供的核心功能,即让系统(服务)能够“弹性”(resilient)地应对各

    2024年01月19日
    浏览(99)
  • ES报错:[parent] Data too large, data for [<http_request>] would be larger than limit of XXXX

    当es这个错误的时候 : [parent] Data too large, data for [http_request] would be larger than limit of [23941899878/22.2gb], with { bytes_wanted=23941987633 bytes_limit=23941899878 } 通常原因是 在于fielddata的内存被占用完了,其他索引无法分配更多的内存。 另外,查询语句写的不好,单个请求聚合查询的数据太

    2024年02月09日
    浏览(45)
  • 查询ES报错429 circuit_breaking_exception,“reason“:“[parent] Data too large, data for \[<http_request\>\]

    查询ES报错:429 Too Many Requests;circuit_breaking_exception,”reason”:”[parent] Data too large, data for [http_request]“ 问题 :ES查询报错:429 Too Many Requests;circuit_breaking_exception,“reason”:“[parent] Data too large, data for [http_request]” 原因 :ES查询缓存占用内存过大,超过阈值(默认70%),查

    2024年02月12日
    浏览(45)
  • ES实战- data too large, data for

    客户现场业务系统突然查询不到数据,个人一开始分析以为是聚合查询报错,于是去看了下系统日志,看到如下日志打印: 尝试重启ES后系统可以恢复正常,但是运行一段时间后又会再次上报这个Data too large的错误。 PS:es版本7.10 分析报错,看日志Caused by: ElasticsearchStatusExcep

    2024年02月03日
    浏览(45)
  • ES写入数据时:circuit_breaking_exception[[parent] Data too large

    原因: (1)表面原因是在ES中大量内存被占用,GC无法对heap进行垃圾回收,导致node内存用量超出limit限制。 (2)根本原因是ES设置有问题,默认配置是JVM内存使用达到75%的时候进行full GC,默认配置总熔断器indices.breaker.total.use_real_memory 它的值直接影响JVM堆内存分配的大小,

    2024年02月04日
    浏览(40)
  • elasticsearch6.1.3查询只返回部分数据或报错Data too large

    1、ES导出报错 CircuitBreakingException[[FIELDDATA] Data too large, data for [proccessDate] would be larger than limit of [10307921510/9.5gb]] 2、ES导出丢失数据,只返回范围内部分数据,同时未报错 ES在查询时,会将索引数据缓存在内存(JVM)中。 当缓存数据到达驱逐线时,会自动驱逐掉部分数据,把缓

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包