其他
Elasticsearch高级调优方法论之——根治慢查询!
1、引言
2、Elasticsearch慢查询六大症状及解决方案
2.1 症状1:非活动(检索/写入)状态资源利用率也非常高
2.1.1 问题描述
2.1.2 解决方案
1、部署之前,设计先行。
正如VIVO搜索技术总监振涛兄所说:“集群规划核心是容量预估,就好比你建个楼,必须规划好容量,不然说用多少就建多高,吃在地基撑不住!!”。任何部署的良好开端都是执行适当的容量规划,以帮助确定每个搜索用例的最佳分片数。 2、减少分片数,实施冻结索引或添加其他节点以实现负载均衡。 3、考虑冷热数据分离架构(适用于基于时间的索引)以及Elasticsearch中的翻转索引(rollover)/压缩索引(shrink)功能,以有效管理分片计数。
https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster
https://www.elastic.co/cn/blog/hot-warm-architecture-in-elasticsearch-5-x
https://www.elastic.co/guide/en/elasticsearch/guide/master/capacity-planning.html
2.2 症状2:线程池存在大量rejected
2instance-0000000001 search 0 10 0
3instance-0000000002 search 0 20 0
4instance-0000000003 search 0 30 0
2.2.1 问题描述
2.2.2 解决方案
使用索引模板是在创建索引阶段做好设置是个好方法。(7.0及更高版本默认1主1副)。
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/tune-for-indexing-speed.html#_use_faster_hardware
2.3 症状3:高CPU和索引化延迟
2.3.2 解决方案
1)数据初始化阶段refresh设置 -1、副本设置为 0,以提升写入速度;写入完毕后复原。
2)关闭swapping。
3)使用文件系统缓存。
4)使用自动生成ID。
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/tune-for-indexing-speed.html#_disable_refresh_and_replicas_for_initial_loads
2.4 症状4:副本增加后延时增大
2.4.1 问题描述
2.4.2 解决方案
2{ "index.requests.cache.enable": true }
2.5 症状5:共享硬件资源时的高资源利用率。
2.5.1 问题描述
2.5.2 解决方案
2.6 症状6:聚合N多唯一值引起的高内存使用率
2.6.1 问题原因
高基数——列中有很多唯一值(),如主键 低基数——与之相反,如性别列(只有男、女)。
2.6.2 解决方案
3 偶发慢查询解决方案
3.1 偶发慢查询关联监控指标
1)CPU负载 2)索引吞吐量 3)搜索吞吐量 4)垃圾收集(GC)活动 5)搜索线程池队列大小
3.2 ARS提升检索吞吐率
4 非偶发慢查询解决方案
4.1 “拆解DSL”排查慢查询根源
1)没有高亮显示它仍然很慢吗? 2)没有聚合,它仍然很慢吗? 3)如果size设置为0,它仍然很慢吗?
当size设置为0时,Elasticsearch会缓存搜索请求的结果,以便更快地进行搜索
4.2 参考官方搜索优化建议,看是否凑效?
4.3 慢查询排除实践
1)启用"profile:true"。
2{
3 "profile": true,
4 "query" : {
5 "match" : { "message" : "some number" }
6 }
7}
2)查看节点的热点线程。
3)使用kibana可视化profile分析工具
5 捕获慢查询、耗费资源查询
5.1 慢查询、耗费资源查询难捕获
5.2 dump堆内存分析
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/heap-dump-path.html
5.3 Elasticsearch的保护设置
该最大桶聚合设置停止执行并且使搜索请求失败。
5.4 断路器设置
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/circuit-breaker.html#request-circuit-breaker
5.5 慢日志分析
1)查询需要多长时间? 2)查询请求正文的内容是什么?
2search_type[QUERY_THEN_FETCH], total_shards[10], source[{"size":0,"query":{"bool":{"must":[{"range":{"timestamp":{"from":1549266459837,"to":1549871259837,"include_lower":true,
3"include_upper":true,"format":"epoch_millis","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},"_source":{"includes":[],"excludes":[]},"stored_fields":"*","docvalue_fields":
4[{"field":"timestamp","format":"date_time"},{"field":"utc_time","format":"date_time"}],"script_fields":{"hour_of_day":{"script":{"source":"doc['timestamp'].value.getHourOfDay()",
5"lang":"painless"},"ignore_failure":false}},"aggregations":{"maxAgg":{"max":{"field":"bytes"}},"minAgg":{"min":{"field":"bytes"}}}}], id[]],
日志拆分项 | 描述 |
5.6 日志审计(高阶功能,低版本非付费会员建议跳过)
1)查询是什么时候发生的? 2)谁执行了查询? 3)查询的内容是什么?
1)启用安全审计日志: 在elasticsearch.yml中设置 xpack.security.audit.enabled:true。 2)在安全审计输出中启用日志或索引: 在elasticsearch.yml中设置 xpack.security.audit.outputs:[logfile,index]。
3)在事件列表中包含authentication_success访问权限
在elasticsearch.yml中设置xpack.security.audit.logfile.events.include: authentication_success
6、小结
更短时间更快习得更多干货!