深入理解ElasticSearch慢查询日志
[toc]
# 深入理解 Elasticsearch 慢查询日志
在现代搜索引擎和数据分析领域,Elasticsearch 无疑是其中的佼佼者。它以其强大的搜索能力、灵活的配置和高可用性而闻名。然而,随着数据量的增长和查询复杂性的提高,性能问题也时常困扰着开发者。为了解决这个问题,Elasticsearch 提供了慢查询日志功能,帮助开发者发现并优化性能瓶颈。
# 什么是慢查询日志
慢查询日志是 Elasticsearch 中的一项监控功能,它允许我们记录那些执行时间超过指定阈值的查询。通过分析这些日志,我们可以识别出那些性能不佳的查询,并采取相应的优化措施。
# 如何启用慢查询日志
启用慢查询日志主要分为两步:配置阈值和重启服务。
- 配置阈值:
在 Elasticsearch 的配置文件
elasticsearch.yml
中,我们可以设置查询和获取阶段的慢查询阈值。例如:这些设置将记录执行时间超过指定阈值的查询。# 设置查询阶段的慢查询阈值 index.search.slowlog.threshold.query.warn: 10s index.search.slowlog.threshold.query.info: 5s index.search.slowlog.threshold.query.debug: 2s index.search.slowlog.threshold.query.trace: 500ms # 设置获取阶段的慢查询阈值 index.search.slowlog.threshold.fetch.warn: 10s index.search.slowlog.threshold.fetch.info: 5s index.search.slowlog.threshold.fetch.debug: 2s index.search.slowlog.threshold.fetch.trace: 500ms
1
2
3
4
5
6
7
8
9
10warn
,info
,debug
,trace
是日志级别,可以根据需要调整。 - 重启 Elasticsearch 服务: 修改配置文件后,需要重启 Elasticsearch 服务以使配置生效。
# 慢查询日志位置
慢查询日志位于设置的 path.logs
目录,文件名默认为 index_search_slowlog_rolling
。如需修改,可调整 Elasticsearch 配置目录下的 log4j2.properties
文件。
log4j2.properties
配置样例
...
######## Search slowlog JSON ####################
appender.index_search_slowlog_rolling.type = RollingFile
appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling
appender.index_search_slowlog_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs\
.cluster_name}_index_search_slowlog.json
appender.index_search_slowlog_rolling.layout.type = ESJsonLayout
appender.index_search_slowlog_rolling.layout.type_name = index_search_slowlog
appender.index_search_slowlog_rolling.layout.esmessagefields=message,took,took_millis,total_hits,types,stats,search_type,total_shards,source,id
appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs\
.cluster_name}_index_search_slowlog-%i.json.gz
appender.index_search_slowlog_rolling.policies.type = Policies
appender.index_search_slowlog_rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.index_search_slowlog_rolling.policies.size.size = 1GB
appender.index_search_slowlog_rolling.strategy.type = DefaultRolloverStrategy
appender.index_search_slowlog_rolling.strategy.max = 4
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 慢查询日志分析
慢查询日志通常包含了查询的详细信息,如执行时间、索引名称、节点信息、查询 DSL 等。分析慢查询日志可以帮助我们找到性能瓶颈,并采取相应的优化措施。
- 日志格式:
慢查询日志的格式通常如下:通过这些信息,我们可以了解到查询的详细情况,包括执行时间、索引名称、节点信息、查询 DSL 等。
[日期和时间戳] [日志级别] [节点名称] [索引名称][分片ID] took[执行时间], took_millis[执行时间(毫秒)], total_hits[总命中数], types[文档类型], stats[查询统计信息], search_type[查询类型], total_shards[总分片数], source[查询 DSL]
1 - 分析工具:
可以使用日志分析工具或编写脚本来自动化日志的分析过程。例如,可以使用
grep
、awk
等命令行工具,或者编写 Python 脚本来提取和分析日志数据。 - Kibana: 如果你的环境中安装了 Kibana,可以使用它来可视化慢查询日志。可以通过 Filebeat 导入日志数据到 Elasticsearch,然后在 Kibana 中创建 Dashboard 来展示和分析慢查询。
# 慢查询日志样例
以下是一个慢查询日志的样例:
[2023-04-11T12:36:01,123][WARN ][o.e.t.SearchService] [node-1] [my_index][0] took[6.2s], took_millis[6200], total_hits[1000], types[my_type], stats[...], search_type[QUERY_THEN_FETCH], total_shards[5], source[{"query":{"match_all":{}}}]
在这个样例中,我们可以看到:
日期和时间戳:
[2023-04-11T12:36:01,123]
日志级别:
[WARN]
节点名称:
[node-1]
索引名称:
[my_index]
分片ID:
[0]
查询类型:
[QUERY_THEN_FETCH]
执行时间:
took[6.2s]
,表示查询执行了6.2秒总命中数:
total_hits[1000]
查询 DSL:
source[{"query":{"match_all":{}}}]
,表示这是一个match_all
查询
通过分析这些信息,我们可以确定哪些查询需要优化,并采取措施来提高 Elasticsearch 集群的性能。