Elasticsearch 性能优化详解( 四 )


Cache的设置及使用

  • QueryCache: ES查询的时候,使用filter查询会使用query cache, 如果业务场景中的过滤查询比较多,建议将querycache设置大一些,以提高查询速度 。
indices.queries.cache.size:10%(默认) , 可设置成百分比,也可设置成具体值,如256mb 。
当然也可以禁用查询缓存(默认是开启), 通过index.queries.cache.enabled:false设置 。
  • FieldDataCache: 在聚类或排序时 , field data cache会使用频繁,因此,设置字段数据缓存的大小,在聚类或排序场景较多的情形下很有必要,可通过indices.fielddata.cache.size:30% 或具体值10GB来设置 。但是如果场景或数据变更比较频繁,设置cache并不是好的做法,因为缓存加载的开销也是特别大的 。
  • ShardRequestCache: 查询请求发起后,每个分片会将结果返回给协调节点(Coordinating Node), 由协调节点将结果整合 。如果有需求 , 可以设置开启; 通过设置index.requests.cache.enable: true来开启 。不过,shard request cache只缓存hits.total, aggregations, suggestions类型的数据,并不会缓存hits的内容 。也可以通过设置indices.requests.cache.size: 1%(默认)来控制缓存空间大小 。
更多查询优化经验
  • query_string 或 multi_match的查询字段越多 ,  查询越慢 。可以在mApping阶段 , 利用copy_to属性将多字段的值索引到一个新字段,multi_match时,用新的字段查询 。
  • 日期字段的查询 ,  尤其是用now 的查询实际上是不存在缓存的,因此,可以从业务的角度来考虑是否一定要用now, 毕竟利用query cache 是能够大大提高查询效率的 。
  • 查询结果集的大小不能随意设置成大得离谱的值, 如query.setSize不能设置成 Integer.MAX_VALUE, 因为ES内部需要建立一个数据结构来放指定大小的结果集数据 。
  • 避免层级过深的聚合查询 ,  层级过深的aggregation , 会导致内存、CPU消耗 , 建议在服务层通过程序来组装业务,也可以通过pipeline的方式来优化 。
  • 复用预索引数据方式来提高AGG性能:
如通过 terms aggregations 替代 range aggregations,如要根据年龄来分组,分组目标是: 少年(14岁以下) 青年(14-28) 中年(29-50) 老年(51以上), 可以在索引的时候设置一个age_group字段,预先将数据进行分类 。从而不用按age来做range aggregations, 通过age_group字段就可以了 。
通过开启慢查询配置定位慢查询不论是数据库还是搜索引擎,对于问题的排查,开启慢查询日志是十分必要的,ES 开启慢查询的方式有多种,但是最常用的是调用模板 API 进行全局设置:
PUT/_template/{TEMPLATE_NAME}{"template":"{INDEX_PATTERN}","settings" : {"index.indexing.slowlog.level": "INFO","index.indexing.slowlog.threshold.index.warn": "10s","index.indexing.slowlog.threshold.index.info": "5s","index.indexing.slowlog.threshold.index.debug": "2s","index.indexing.slowlog.threshold.index.trace": "500ms","index.indexing.slowlog.source": "1000","index.search.slowlog.level": "INFO","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": "1s","index.search.slowlog.threshold.fetch.info": "800ms","index.search.slowlog.threshold.fetch.debug": "500ms","index.search.slowlog.threshold.fetch.trace": "200ms"},"version": 1} PUT {INDEX_PAATERN}/_settings{"index.indexing.slowlog.level": "INFO","index.indexing.slowlog.threshold.index.warn": "10s","index.indexing.slowlog.threshold.index.info": "5s","index.indexing.slowlog.threshold.index.debug": "2s","index.indexing.slowlog.threshold.index.trace": "500ms","index.indexing.slowlog.source": "1000","index.search.slowlog.level": "INFO","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": "1s","index.search.slowlog.threshold.fetch.info": "800ms","index.search.slowlog.threshold.fetch.debug": "500ms","index.search.slowlog.threshold.fetch.trace": "200ms"}


推荐阅读