es实战-查询性能优化

本文主要讨论es查询速度的优化。
网络中大部分的性能优化方案基本源于官网,如下位置:
官网查询速度优化建议

1. 文档进行建模

避免使用nested和parent child类型
尽量先计算再将计算结果存储进es
尽量使用filter context查询
结合profile api分析查询慢的问题
严禁使用*开头的terms查询
谨慎使用通配符匹配和agg聚合
避免terms过多,成百上千

2. 定期对不再更新的索引做force merge

段数目太多会带来较大的麻烦。
1.消耗资源:每一个段都会消耗文件句柄、内存和cpu运行周期;
2.搜索变慢:每个搜索请求都必须轮流检查每个段;所以段越多,搜索也就越慢

段合并的时候会将那些旧的已删除文档从文件系统中清除。
被删除的文档(或被更新文档的旧版本)不会被拷贝到新的大段中。
forcemerge非常耗时!对read only索引进行merge。

设置merge时最大的线程数:
index.merge.scheduler.max_thread_count。
固态硬盘——默认最大值 Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2))
机械磁盘——设置为1

1.运行merge任务

POST /test/_forcemerge?max_num_segments=1//每个分片一个段

注:可以从10-5-1逐步将段合并到1个,防止一次合并任务占用资源时间过长
2.查看merge情况

GET /_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r

3. 自定义路由机制Routing

默认会将文档的ID值作为依据将其哈希到相应的主分片上,这种算法基本上会保持所有数据在所有分片上的一个平均分布,而不会产生数据热点。
指定Routing:告诉Elasticsearch我们的数据存哪个分片上,查询的时候指定某个分片查询,这样还有一个好处就是聚合结果会准确。

4. Query cache相关设置

查看cache:

curl 'localhost:9200/<indexname>/_stats/query_cache?pretty&human'
curl 'localhost:9200/_nodes/stats/indices/query_cache?pretty&human'

返回结果:
memory_size
(字节值)跨分配给节点的所有分片用于查询缓存的内存总量。
memory_size_in_bytes
(整数)用于分 配给该节点的所有分片上的查询缓存的内存总量(以字节为单位)。
total_count
(整数)查询缓存中的命中,未命中和缓存的查询的总数。
hit_count
(整数)查询缓存命中数。
miss_count
(整数)查询高速缓存未命中的数量。
cache_size
(整数)查询缓存的大小(以字节为单位)。
cache_count
(整数)查询缓存中的查询计数。
evictions
(整数)查询缓存逐出的数量。

5. 打开自适应副本

应打开自适应副本选择。该请求将被重定向到响应最快的节点。当存在多个数据副本时,elasticsearch可以使用一组称为自适应副本选择的标准,根据包含每个分片副本的节点的响应时间,服务时间和队列大小来选择数据的最佳副本。这样可以提高查询吞吐量并减少搜索量大的应用程序的延迟。
这个配置默认是关闭的,实战打开方法:

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.use_adaptive_replica_selection": true
  }
}

6. 给filesystem cache更多的内存

7. 使用constant_keyword

es7.7.0版本推出新类型constant_keyword,用于将某个keyword的值独立出来为单独索引去查询。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值