ES模糊查询(Wildcard Query)导致CPU打满问题

麦浪2年前技术文章5716

一、概述

    Wildcard Query是es中实现模糊查询的一种方式,尤其对有SQL经验的人,会常常习惯于它,毕竟这是和SQL里like操作最相似的查询方式,最近一个客户的es集群就在这上面踩了个坑。。。

二、问题处理过程

a、问题现象

阿里云es集群三个节点cpu突然打高(100%),持续半小时,且自动恢复时间后,集群三个节点cpu再次打高(100%),期间通过监控可以看到集群qps并未有增强,且集群本身数据量较少,真正的生产索引就一个,5个主分片,2备份,总共87.6G左右。暂且不表,先上图:

阿里云监控信息显示cpu打高,期间qps已无记录(应该是集群已崩),前后qps变化不大

[MISSING IMAGE: ,  ]图片 1.png

kibana监控显示与阿里云监控显示基本一致:

[MISSING IMAGE: ,  ]图片 2.png

b、问题定位分析

这种情况一般肯定先看集群存在的热点线程啦(GET _nodes/hot_threads),果然看到有几个cpu占用较高的任务,见图如下:

[MISSING IMAGE: ,  ]图片 3.png

几个热点线程都是一样的,search任务,且是WildcardQuery任务。直接查下search任务(GET _tasks?actions=*search&detailed),果然看到了异常的WildcardQuery任务,见图如下:

[MISSING IMAGE: ,  ]图片 4.png

这样结论就比较明显了,罪魁祸首就是就是集群里出现了这种大字段的模糊匹配的查询,有人直接把一篇文章输入到了搜索框里了!!!

c、问题处理

知道原因了,处理就比较简单了,让开发对搜索框查询的字段长度做了限制,目前未再出现上述情况。

三、深度探究

笔者后来又在自己的测试环境上就行了复现,发现即使在一个很小的索引上进行此类查询,即使返回为空也需要几秒甚至几十秒,并且占用cpu较高。查了一堆资料,听的云里雾里,大概总结就是:es在进行search时会对输入的查询字段进行解析,不管这个解析怎么优化,也总是会涉及拆分词组,那么这个查询字段越大,尤其是开头有*这种匹配时,会极大的增加这个拆分的结果集,且在匹配时又是一番大结果集匹配,这就导致少量的类似查询就会打满集群cpu。更详细的解说可以参考下面大佬的文章:https://elasticsearch.cn/article/171


相关文章

Helm 控制函数

Helm 控制结构(在模板语言中称为 "actions")提供给你和模板作者控制模板迭代流的能力。 Helm 的模板语言提供了以下控制结构:if/else,用来创建条件语句with,用来指定范围ran...

Kafka Leader 和 Follower 故障

Kafka Leader 和 Follower 故障

前言:       在kafka集群工作过程中,难免会碰到某个kafka服务实例宕机或挂掉的情况,服务一旦挂掉,意味着某个分区中的leader或follower将不能正常工作了       具体来说,...

MySQL 8.0 Clone 备份恢复演练

前言上一篇文章中,我们介绍了使用 Clone 插件进行备份,相关的恢复流程将在本篇文章介绍。MySQL 8.0 Clone Plugin 详解恢复增量数据的方法,使用的是伪装为 relay log 通...

MySQL 复制-半同步搭建及原理

MySQL 复制-半同步搭建及原理

前言MySQL 半同步复制解决了什么问题?在传统主从架构中,主库实例提交事务与发送二进制日志是异步的,也就是说从库是否成功接收到二进制日志不会影响到主库事务提交,因此可能会出现  “主库发生宕机,主库...

大数据自动化巡检系统(一)

大数据自动化巡检系统(一)

一、产品简介EasyCare大数据自动化巡检平台是袋鼠云自研的一款大数据集群自动化巡检调优运维平台,支持针对各类大数据组件、服务接口、其他组件等可用性、稳定性进行自动巡检,实现主动实时监控,准确定位问...

Yarn界面详解

Yarn界面详解

1.Active Nodes:表示Yarn集群管理的节点的个数,其实就是NodeManager的个数,集群有2个NodeManager从配置中可以看到每一个NodeManager管理的内存大小是163...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。