缓存
Elasticsearch 查询的响应需要占用 CPU、内存资源,在复杂业务场景,会出现慢查询,需要花费大量的时间。
为了节省资源,提高查询效率,提出了 缓存
缓存分类
节点查询缓存(Node query cache)
Field data 缓存
分片请求缓存(Shard request cache)
节点查询缓存(Node query cache)
filter 过滤查询的结果缓存在节点查询缓存中,以便快速查找。
过期策略
缓存使用 LRU ( Least Recently Used 缓存淘汰策略)策略,当缓存已满时,优先清理最近最少使用的查询结果,以腾出空间存放新结果数据。
用户无法查看节点查询缓存的内容。
什么查询会缓存
只有Filter下的子Query才能参与Cache
不能参与Cache的Query有TermQuery/MatchAllDocsQuery/MatchNoDocsQuery/BooleanQuery/DisjunnctionMaxQuery
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