Elasticsearch作为一个检索查询的文档数据库,在查询统计方面有着较为自由且丰富的方式方法。在满足各类查询聚合功能的同时,也会有着资源性能使用的浪费或者误区。在功能和性能使用中寻求最优解,诞生了 ES 慢查询治理这个场景问题。
本文主要介绍了 ES 慢查询自动化巡检治理的具体内容和基础逻辑,并对巡检中的判断规则进行解读和相应的解决建议。
慢查询巡检逻辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZLtLUxG-1685529037575)(文章配图/%E5%B7%A1%E6%A3%80%E9%80%BB%E8%BE%91.png “image.png”)]
1. 慢查询 DSL 获取
慢查询 DSL 的获取主要依赖于慢查询日志的清洗聚合。
主要有下面几个操作:
1.1 日志信息要素清洗
这里通过程序脚本从腾讯云同步日志信息到本地的 ES 集群,并根据日志类型进行拆分要素。
拆分主要利用 ES 的 ingest pipeline。grok表达式:
"\\[%{DATA:classname}\\] \\[%{DATA:node}\\] \\[%{DATA:indexname}\\]\\[%{NUMBER:shard_no}\\] took\\[%{DATA:took}\\], took_millis\\[%{NUMBER:took_millis}\\], total_hits\\[%{DATA:hits}\\], types\\[%{DATA:types}\\], stats\\[%{DATA:stats}\\], search_type\\[%{DATA:search_type}\\], total_shards\\[%{NUMBER:total_shards}\\], source\\[%{DATA:Message}\\], id\\[%{DATA:id}\\], "
可以获得的日志结构如下:
{
"logType": "SearchSlow",
"took": "271.7ms",
"total_shards": "12",
"types": "_doc",
"took_millis": "271",
"Message": "{\"size\":1000,\"query\":{\"bool\":{\"must\":[{\"term\":{\"type1\":{\"value\":\"type1\",\"boost\":1.0}}},{\"term\":{\"id\":{\"value\":123,\"boost\":1.0}}}],\"must_not\":[{\"terms\":{\"tag1\":[\"tag1\",\"tag2\",\"tag2\"],\"boost\":1.0}}],\"adjust_pure_negative\":true,\"boost\":1.0}},\"_source\":false}",
"Ip": "9.20.83.243",
"shard_no": "4",
"Cluster": "test-online",
"Time": "2022-06-27T22:34:59.428+08:00",
"search_type": "QUERY_THEN_FETCH",
"hits": "-1",
"node": "node1",
"classname": "i.s.s.fetch ",
"indexname":