本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载。

可以加我问问题,免费解答,有问题可以先私聊我,本人每天都在线,会帮助需要的人。

但是本博主因为某些原因,心灰意冷了,决心打死不写免费了。不想解释了。。

文章目录

  • 1.概述

1.概述

转载:模糊查询导致Elasticsearch服务宕机

之前我在社区里写过 《ElasticSearch集群故障案例分析: 警惕通配符查询》一文,讲的是关于通配符查询可能引起ES集群负载过高的问题。 当时提到wildcard query构造的non-deterministic automaton要经历一个determinize的过程,其间如果生成的状态数量过高,可能引起集群负载彪高,影响对外服务。 但因为determinize的过程中,Lucene对生成的状态数量做了限制,因此在问题查询过去以后,集群还是可以恢复常态。

然而近期我们线上的另外一起故障,使我意识到,Prefix/Regex/Fuzzy一类的模糊查询可能直接让整个集群直接挂掉。

问题出现时,ES服务端日志有如下报错:

[2017-06-14T21:06:39,330][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [xx.xx.xx.xx] fatal error in thread [elasticsearch[xx.xx.xx.xx][search][T#29]], exiting
java.lang.StackOverflowErrorat org.apache.lucene.util.automaton.Operations.isFinite(Operations.java:1053) ~[lucene-core-6.2.1.jar:6.2.1 43ab70147eb494324a1410f7a9f16a896a59bc6f - shalin - 2016-09-15 05:15:20]at org.apache.lucene.util.automaton.Operations.isFinite(Operations.java:1053) ~[lucene-core-6.2.1.jar:6.2.1 43ab70147eb494324a1410f7a9f16a896a59bc6f - shalin - 2016-09-15 05:15:20]at org.apache.lucene.util.automaton.Operations.isFinite(Operations.java:1053) ~[lucene-core-6.2.1.jar:6.2.1 43ab70147eb494324a1410f7a9f16a896a59bc6f - shalin - 2016-09-15 05:15:20]at org.apache.lucene.util.automaton.Operations.isFinite(Operations.java:1053) ~[lucene-core-6.2.1.jar:6.2.1 43ab70147eb494324a1410f7a9f16a896a59bc6f - shalin - 2016-09-15 05:15:20]

调查后发现,Prefix/Regex/Fuzzy一类的Query,是直接构造的deterministic automaton,如果查询字符串过长,或者pattern本身过于复杂,构造出来的状态过多,之后一个isFinite的Lucene方法调用可能产生堆栈溢出。

一个可以复现问题的regex query如下:

POST /test_index/_search
{"query": {"regexp": {"test": "t{1,9500}"}}
}

我的执行报错如下

{"error" : {"root_cause" : [{"type" : "query_shard_exception","reason" : "failed to create query: input automaton is too large: 1001","index_uuid" : "pFxnWiwdSFSt9V6l35fPzQ","index" : "test_index"}],"type" : "search_phase_execution_exception","reason" : "all shards failed","phase" : "query","grouped" : true,"failed_shards" : [{"shard" : 0,"index" : "test_index","node" : "ZiR6PjzPSX6NI99Awisr2g","reason" : {"type" : "query_shard_exception","reason" : "failed to create query: input automaton is too large: 1001","index_uuid" : "pFxnWiwdSFSt9V6l35fPzQ","index" : "test_index","caused_by" : {"type" : "illegal_argument_exception","reason" : "input automaton is too large: 1001"}}}]},"status" : 400
}

Github上的issue链接: issues/24553。

对于我们这次特定的问题,是因为prefix Query里没有限制用户输入的长度。 看ES的源码,PrefixQuery继承自Lucene的AutomatonQuery,在实例化的时候,maxDeterminizedStates传的是Integer.MAX_VALUE, 并且生成automaton之前,prefix的长度也没有做限制。 个人认为这里可能应该限制一下大小,避免产生过多的状态:

public class PrefixQuery extends AutomatonQuery {/** Constructs a query for terms starting with <code>prefix</code>. */public PrefixQuery(Term prefix) {// It's OK to pass unlimited maxDeterminizedStates: the automaton is born small and determinized:super(prefix, toAutomaton(prefix.bytes()), Integer.MAX_VALUE, true);if (prefix == null) {throw new NullPointerException("prefix must not be null");}

最终抛出异常的代码是

org.apache.lucene.util.automaton.Operations.isFinite,

可以看到这段代码里用了递归,递归的深度取决于状态转移的数量。根据注释的说明,这是一段待完善的代码,因为使用了递归,可能导致堆栈溢出:

  // TODO: not great that this is recursive... in theory a// large automata could exceed java's stackprivate static boolean isFinite(Transition scratch, Automaton a, int state, BitSet path, BitSet visited) {path.set(state);int numTransitions = a.initTransition(state, scratch);for(int t=0;t<numTransitions;t++) {a.getTransition(state, t, scratch);if (path.get(scratch.dest) || (!visited.get(scratch.dest) && !isFinite(scratch, a, scratch.dest, path, visited))) {return false;}}path.clear(state);visited.set(state);return true;}

由此可见,在项目里使用了模糊查询的同学,一定一定要注意限制用户输入长度,否则可能导致集群负载过高或者整个挂掉。

虽然Lucene/Elasticsearch应该在代码层面做一些限制,确保有问题的query不会导致stack overflow,但是当用到这类查询的时候,程序员的思维方式还局限在RDBMS开发的时代。 我们应该多在数据索引阶段下功夫,确保尽量用最高效的term query来完成绝大多数的查询。

Elasticsearch】es 模糊查询导致Elasticsearch服务宕机相关推荐

  1. linux内存不足宕机,记一次linux机器内存占用太多导致的服务宕机

    背景 最近我们测试环境部署的一个项目总是不停的宕机,之前也有过,但是最近特别频繁 猜测 可能是因为cup或者内存占用太大导致的服务宕机 执行 1.登录linux服务器 2.top命令 下面是对每一行信 ...

  2. 一次region过多导致HBase服务宕机事件

    具体情况是,甲方有10个节点的HBase集群,主要业务表共10张,region总数达23000+,平均每台RegionServer(RS)的region数量2300左右,每台RS堆内存配置96G(初始 ...

  3. close_wait过多服务器无响应,记一次大量CLOSE_WAIT连接导致的服务宕机

    最近线上服务出现了一段时间的无法响应,在此总结一下问题的排查过程. 监控信息 监控显示CPU和内存没有异常波动,TCP连接中有大量的CLOSE_WAIT状态的连接. 看一下TCP连接断开的过程: 也就 ...

  4. es java 模糊查询_java使用elasticsearch进行模糊查询-已在项目中实际应用

    java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...

  5. Java分词工具模糊查询_Java如何使用elasticsearch进行模糊查询

    这篇文章主要介绍了java如何使用elasticsearch进行模糊查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用环境上篇文章本人已书写过 ...

  6. 记-ItextPDF+freemaker 生成PDF文件---导致服务宕机

    摘要:已经上线的项目,出现服务挂掉的情况. 介绍:该服务是专门做打印的,业务需求是生成PDF文件进行页面预览,主要是使用ItextPDF+freemaker技术生成一系列PDF文件,其中生成流程有:解 ...

  7. Es 模糊查询 match,wildcard

    Es 模糊查询的方式 要求: Es查询: 查询工单信息, 输入 "测试",查出 form_name 为字段中有查询出含有符合内容的数据 match:分词模糊查询: 比如" ...

  8. neutron服务宕机导致nova无法创建云主机

    情况:服务器重启后,创建云主机失败·,查看日志,我们发现是neutron导致nova创建云主机失败,我们查看neutron服务状态,发现neutron中的openvswitch和metadate服务宕 ...

  9. java项目宕机出现原因,java服务宕机原因查询

    在JAVA服务项目上线之后经常会出现宕机的情况 常见原因 内存溢出 1.查到服务进程号 [root@wms ~]# ps -ef|grep java root 6399 6069 0 08:57 pt ...

最新文章

  1. 小程序代理加盟实现月入1800到50K
  2. leetcode 24: 两两交换链表中的节点
  3. Quartz-中断正在执行的任务
  4. 用python实现结构体数组
  5. 可以在xml中靠增加属性来实现分组
  6. 计蒜客NOIP2017提高组模拟赛(四)day1
  7. GCC4.8对new和delete的参数匹配新要求
  8. RPC与RMI的区别
  9. swift4 label显示html,Swift:在标签或textView中显示HTML数据
  10. paip.程序调试的几种方式大总结
  11. 福建省c语言上机题库,二级c语言上机题库
  12. hackerrank Java Data Structures
  13. 一个前端写的php博客系统--支持markdown哦
  14. 答案原文翻译解释《避凶就吉精明鬼,千变万化心不变》这句话是指什么意思?...
  15. “神奇小子”于品海 再展零成本收购绝技
  16. Rap2 模拟接口 常见规则示例
  17. linux命令手册安卓版,linux手册app-linux手册 安卓版v3.0.0-PC6安卓网
  18. 智慧家安监控系统——用Java + html、css、js实现
  19. form标签的enctype属性
  20. 基于RFID技术的考勤系统设计

热门文章

  1. FTC再度对Facebook提起反垄断诉讼,要求其出售Instagram和WhatsApp
  2. 华为P50系列确定29日发布:但遗憾的是...
  3. 小鹏NGP自动导航辅助驾驶Beta版体验:论软件,这台量产车可能是第一
  4. 爱库存:已实名举报唯品会不正当竞争行为
  5. 苹果公司官方证实,iPhone12延期!
  6. “天玑1000Plus”加持iQOO Z1评测:突破价位的极致体验
  7. 丰巢强制收费引吐槽,杭州硬核小区用行动抵制:停用!
  8. 点赞!这4款你常用的App已上线隐私政策
  9. 锐龙5 3600偷跑 性能直逼酷睿i9-9900K
  10. 阿里半跪过、任正非差点跳楼、京东被骗光钱:成年人的生活哪有容易二字?...