23、Elasticsearch-fielddata内存使用陡增解决方案

千里之行,始于足下

 


正文

利用searchAfter分页方式代替From-Size查询或Scroll滚动查询,解决From-Size查询存在的深度翻页问题与Scroll滚动查询存在数据量大响应慢的问题。由于searchAfter分页需要保证排序聚合唯一,当使用_id 字段进行排序聚合时,可能会导致fielddata内存使用指标陡增,从而导致集群的内存使用率上升,一旦内存使用率超过90%即会对集群的性能产生影响,进而抛出FielddataMemoryUsedBytes内存不足异常。
 
回到顶部

一、异常:

java.util.concurrent.ExecutionException: CircuitBreakingException[[fielddata] Data too large, data for [_id] would be [xxxx/x.xgb], which is larger than the limit of [xxxx/x.xgb]]

 

 

回到顶部

二、原因:

由于复杂的查询涉及到对 _id的某种内存密集型处理时,会将大量的 _id 相关数据加载到内存中的fielddata结构里,以便可以快速执行访问,但fielddata不是临时缓存,它是驻留在内存里的数据结构,垃圾回收是不会回收这部分缓存的,因此当数据量多的时候(多个索引),其大小突破会系统设定的阈值。

 

回到顶部

三、处理方案:

回到顶部

1、定位什么字段导致的fielddata突增:

# 显示每个节点字段所占的堆空间 并按照所占空间降序排列
GET _cat/fielddata?v&s=size:desc
# indices:查看集群中所有index的详细信息
GET _cat/indices?v&h=index,fielddata.memory_size&s=fielddata.memory_size:desc

回到顶部

2、修改排序聚合方案:

在达到报警水位线之前将“对text类型字段、_id 字段进行排序聚合”的业务进行修改或使用其它方案替代,保证集群的稳定性

回到顶部

3、清理指定索引fielddata缓存:

可能导致该索引的查询变慢,引起业务抖动,需提前和客户说明风险:

#单个: 
POST /索引名/_cache/clear?fielddata=true
#全量:
POST /_cache/clear?fielddata=true 

 

posted on   爱文(Iven)  阅读(38)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示

目录导航