一、参考
二、Shard request cache
分片级别的查询缓存,每个分片都有自己的缓存
2.1 缓存策略
并不是所有的分片级查询都会被缓存
2.2 缓存设置
三、Node Query Cache
NodeQueryCache
是在Lucene
层面实现的,默认开启,ES
层面会进行一些策略控制和信息统计
3.1 queryCache
使用示例
3.2 缓存策略
并不是所有的filter
查询都会被缓存
3.3 缓存设置
四、ShardRequestCache
和 NodeQueryCache
的比较
ShardRequestCache
是ES
层级的实现,缓存机制为 LRU
, 访问一次,就会考虑缓存,主要用途是对聚合结果进行缓存
NodeQueryCache
是Lucene
层级的实现,缓存机制为 LRU
, 访问达到一定频率,才会考虑缓存,主要用途是对filter
子查询的缓存
五、其他缓存
5.1 fielddata
对于 text
类型的字段聚合查询,会使用 fielddata
获取该字段的字段值,
(1) fielddata
会占用大量的内存,默认是关闭
(2) text
类型的聚合查询,一般没有意义,慎用
5.2 pagecache
在查询过程中,lucene
文件会被操作系统的 pagecache
进行缓存,
(1) pagecache
使用类似LRU
的策略缓存文件
(2) pagecache
完全由操作系统控制
六、监控缓存
缓存的监控指标,通常关注:(1) 缓存空间的大小;(2)缓存命中率
下面分为 节点和索引级别进行分析
6.1 节点级别监控
(1) requestCache
# 通过 hitCount / (hitCount + missCount) 可以计算命中率
GET /_cat/nodes?v&h=name,queryCacheMemory,fielddataMemory,requestCacheMemory,requestCacheHitCount,requestCacheMissCount
name queryCacheMemory fielddataMemory requestCacheMemory requestCacheHitCount requestCacheMissCount
es-0001 2.9gb 16.8mb 304.5mb 1138314 1084754
es-0002 2.2gb 5.2mb 242.6mb 789616 985675
es-0003 757.6mb 250kb 264mb 597872 641255
(2) queryCache
GET _nodes/stats/indices/query_cache,request_cache,fielddata?pretty&human
"indices" : {
"query_cache" : {
"memory_size" : "2.8mb",
"memory_size_in_bytes" : 2969952,
"total_count" : 1572593,
"hit_count" : 217873,
"miss_count" : 1354720,
"cache_size" : 891,
"cache_count" : 5066,
"evictions" : 4175
},
"fielddata" : {
"memory_size" : "264.8kb",
"memory_size_in_bytes" : 271168,
"evictions" : 0
},
"request_cache" : {
"memory_size" : "8.2mb",
"memory_size_in_bytes" : 8603352,
"evictions" : 0,
"hit_count" : 107345,
"miss_count" : 26116
}
}
6.2 索引级别的监控
GET kibana_sample_data_logs/_stats/query_cache,fielddata,request_cache?pretty&human
"total" : {
"query_cache" : {
"memory_size" : "0b",
"memory_size_in_bytes" : 0,
"total_count" : 0,
"hit_count" : 0,
"miss_count" : 0,
"cache_size" : 0,
"cache_count" : 0,
"evictions" : 0
},
"fielddata" : {
"memory_size" : "512.3kb",
"memory_size_in_bytes" : 524696,
"evictions" : 0
},
"request_cache" : {
"memory_size" : "64.2kb",
"memory_size_in_bytes" : 65808,
"evictions" : 0,
"hit_count" : 0,
"miss_count" : 16
}
}
七、手动清除缓存
不建议在生产环境中进行手动清除缓存,
(1) 因为手动清除会对查询性能有较大的影响,
(2) 一般手动清除只用于测试和验证
7.1 清除指定索引或者全部索引的缓存
POST _cache/clear
POST kibana_sample_data_logs/_cache/clear
7.2 清除指定类型的缓存
POST _cache/clear?query=true
POST _cache/clear?request=true
POST _cache/clear?fielddata=true
POST kibana_sample_data_logs/_cache/clear?query=true
POST kibana_sample_data_logs/_cache/clear?request=true
POST kibana_sample_data_logs/_cache/clear?fielddata=true
7.3 清除部分字段的缓存
POST kibana_sample_data_logs/_cache/clear?fields=clientip,geo
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。