[ElasticSearch填坑] 聚合请求导致GC故障

故障描述:

某天对Es做多次查询请求,发现Es集群经常挂掉,无法响应。

定位问题:

我们的Es在之前较长时间内未出现故障,所以可认为时近期内的变更导致的。最近我们新运行了一个bulk index程序生产Es数据。

1.index方面:首先我们怀疑可能是这个bulk index程序可能触发Es某些问题。但是关闭该程序并重启Es集群,该故障仍然会发生。

2.search方面:故障是发生在Es数据快速增长之后,那么有很大的可能是数据量增长之后,某个search请求触发es问题。因为我们的系统构建于Es之上,且较为复杂,无法很快的定位是哪次请求导致Es故障。很难从这里下手定位问题。但是query/filter,aggs几类请求中,最可能的是不合理aggs请求导致的。

确认问题:

查看日志,在当天的日志中,发现出现故障时Es在频繁的Full GC

甚至可能会OOM

Es本质上是一个java程序,在进行GC时整个程序无法响应。长时间GC时,集群其它节点在无法获得某个节点的心跳响应时,集群会认为这个这个节点退出了集群。可是从其它节点日志发现这一点:

丢失整个节点的分片数据后,由于Es高可用自平衡机制,集群开始平衡分片等任务。集群长时间处于不健康状态。

现在可以确定是某次查询请求导致节点内存被大量使用,触发Full GC(Es默认会在内存使用75%时发生FullGc -XX:CMSInitiatingOccupancyFraction=75),而该内存又不能被GC回收掉,接着频繁GC。甚至可能直接OOM。结果该节点长时间无法响应外部请求。

问题请求:

经过不断排查,发现可疑请求search dsl为:

该聚合请求将数据按分钟分桶,每个桶计算top 1的文档,当时间范围横跨较大时,会相当吃内存。 该请求横跨一天的数据,数据量为0.75M,并且同时并发7次类似请求,数据内容不一致(_msearch)。经测试如果请求一个月数据必然复现故障问题。

问题原因:

ElasticSearch在收集文档用于返回时非常的耗内存,所以才有from+size<=10000的默认设定。但是在bucket agg的子agg使用top_hits agg时,可以突破这个限制(ElasticSearch没有这个限制)。所以当bucket数量非常大时,非常容易导致OOM。假设请求10天的数据,每秒分桶,每个桶内取top 10,那么这个数量级为10*24*60*60*10=8640000,即你可以取到864万条数据,再大的内存也无法完成这个计算。而且这只是一个分片shard的数据,而协调节点(请求的那个节点)需要将所有分片节点的数据集合到一起再做reduce,内存使用是其它节点的倍数,更加容易OOM。我们这次故障就是发生在协调节点reduce数据时。

解决问题:

对于上面的请求,业务上实际没有必要每个桶都取top1,所以完全可以将top1提升为父聚合的兄弟来避免这个问题。而对于无法改进的dsl,则应该将所有数据切片,比如按时间分片,多次请求来避免这个问题。

思考:

1.对于分桶数量太大的聚合请求,应该将所有数据切片,比如按时间分片,多次请求来避免内存OOM。

2.集群中应该有独立的协调节点,专门用于数据请求(node.master=false node.data=false),并给它们设置足够的内存。通过数据节点与协调节点分离,可以避免节点挂掉之后,导致整个集群不可用,或者长时间响应迟钝。

3.在探究Es的故障时,能实时看Es各项指标非常有用。比如,对于本文中的这种故障,能看到jvm的内存使用是非常有帮助的。所以最好能有一个对Es的专门的监控系统。如何监控Elasticsearch?

4.使用docvalue是解决该类问题的王道。es2.x版本,使用string类型保存字符串,string类型默认分词analyzed。分词的string是无法利用docvalue的。那么问题来了,怎么即想分词,又想利用docvalue呢:


PS:有人可能会说CMS垃圾回收在大内存情况下表现不如G1,但是Elasticsearch官方文档不建议使用官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容