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文件内的xmx和xms来实现- 通过环境变量
ES_JAVA_OPTS来实现(7.x 系列是有的,具体可以看elasticsearch文件里面的内容来确定)- 如果本机内存不足以调整 jvm 内存了,那就需要通过调整 gc 垃圾回收来解决,同样的,可以通过上述两种方式来配置
indices.breaker.total.use_real_memory-默认为true
静态设置确定父断路器是否应考虑实际内存使用情况(true)仅考虑子断路器保留的数量(false)indices.breaker.total.limit-父断路器触发上限
indices.breaker.total.use_real_memory为true时,默认为 jvm 堆内存的95%indices.breaker.total.use_real_memory为false时,默认为 jvm 堆内存的70%
-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"
}
}'

浙公网安备 33010602011771号