elasticsearch 缓存:Node query cache、Field data cache、Shard request cache

缓存

Elasticsearch 查询的响应需要占用 CPU、内存资源,在复杂业务场景,会出现慢查询,需要花费大量的时间。

为了节省资源,提高查询效率,提出了 缓存

缓存分类

  • 节点查询缓存(Node query cache)

  • Field data 缓存

  • 分片请求缓存(Shard request cache)

节点查询缓存(Node query cache)

filter 过滤查询的结果缓存在节点查询缓存中,以便快速查找。

过期策略

缓存使用 LRU ( Least Recently Used 缓存淘汰策略)策略,当缓存已满时,优先清理最近最少使用的查询结果,以腾出空间存放新结果数据。

用户无法查看节点查询缓存的内容。

什么查询会缓存

  1. 只有Filter下的子Query才能参与Cache

  2. 不能参与Cache的Query有TermQuery/MatchAllDocsQuery/MatchNoDocsQuery/BooleanQuery/DisjunnctionMaxQuery

  3. MultiTermQuery/MultiTermQueryConstantScoreWrapper/TermInSetQuery/Point*Query的Query查询超过 2次 会被Cache,其它Query要 5次

默认每个段 大于10000个doc 或 每个段的doc数大于总doc数的 30% 时才允许参与cache

节点查询缓存内存上限

默认情况下,节点查询缓存最多可容纳 10000个查询,最多占总堆空间的 10%

为了确定查询是否符合缓存条件,Elasticsearch 维护查询历史记录以跟踪事件的发生。

如果一个段至少包含 10000 个文档,并且该段具有超过一个分片的文档总数的 3% 的文档数,则按每个段进行缓存。由于缓存是按段划分的,因此合并段可使缓存的查询无效。

节点查询缓存配置

静态配置:在配置文件(elasticsearch.yml)配置,重启后生效。

动态配置:可以通过命令行(更新 setting)配置,配置后无需重启即刻生效。

配置1:indices.queries.cache.size

静态配置,需要在集群的每个数据节点配置。
含义:控制 filter 缓存的堆内存大小。
接受百分比值(例如5%)或精确值(例如 512mb)。
默认:为10%。

配置2:index.queries.cache.enabled

静态配置,针对每个索引的配置,默认是开启
含义:控制是否启用节点查询缓存。
设置时机:只能在创建索引或者关闭索引(close)时设置。
可设置:true 或者 false。
默认:true。关闭缓存举例:

PUT my_index_0003
{
  "settings": {
    "index.queries.cache.enabled": false
  }
}

Field data Cache

主要用于 sort 以及 aggs 的字段。这会把字段的值加载到内存中,以便于快速访问。field data cache 的构建非常昂贵,因此最好能分配足够的内存以保障它能长时间处于被加载的状态。

Field data 缓存设置

设置参数:indices.fielddata.cache.size。
参数类型:静态参数。
参数含义:field data 缓存的最大值。
参数举例:
1)百分比,如:38%,代表:堆内存38%。
2)固定值,如:12 GB。

缺省值:无
设置举例:需要在:elasticsearch.yml 中设置,重启后生效

Shard Request Cache

Shard级别的缓存。默认的主要用于缓存 size=0 的请求,aggs和 suggestions,还有就是hits.total

缓存采用的也是LRU策略

相关资料:
https://blog.csdn.net/qqwwssaagg/article/details/107737680
https://www.jianshu.com/p/d23722cf2cc8
https://cloud.tencent.com/developer/article/1774772


原文出处:/show_1IX1rHkTs3kG.html