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

麦浪2年前技术文章4766

一、概述

    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


相关文章

mysql 导出 csv 参数 secure_file_priv 设置

mysql 导出 csv 参数 secure_file_priv 设置

一、功能secure_file_priv 参数是用来限制数据导入和导出操作的效果,例如由LOAD data和SELECT…INTO OUTFILE语句和LOAD_FILE()函数。只有具有“FILE”...

kafka部署

安装前准备修改环境变量vi /etc/profile export KAFKA_HOME=/opt/kafkaexport PATH=$PATH:$KAFKA_HOME/bin创建用户及用户组grou...

压测实操--kafka-consumer压测方案

压测实操--kafka-consumer压测方案

环境信息:操作系统centos7.9,kafka版本为hdp集群中的2.0版本。Consumer相关参数使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测,该脚本参...

Redis 命令行 redis-cli 介绍

前言redis-cli 是 Redis 自带的命令行工具,是运维和开发人员常用的工具,本篇文章将介绍它的使用技巧和一些有趣的功能。1. 连接 Redis 服务redis-cli 默认连接的是 127....

oracle adg容灾切换需要注意的参数

1.DG角色在线转换1.1 角色(主备)和DG有关的角色:primary database 主库,在线服务应用physical standby database 备库,物理备库,在线备份主库数据与主库...

Hadoop生产调优

一、NameNode内存生产配置1.NameNode内存计算每个文件块大概占用150byte,一台服务器128G内存为例,能存储多少文件块呢?128 * 1024 * 1024 * 1024  / 1...

发表评论    

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