Elasticsearch 的缓存主要分成三大类
- Node Query Cache (Filter Context)
- Shard Query Cache (Cache Query的结果)
- Fielddata Cahce
Node Query Cache
每一个节点有要给Node Query 缓存
- 由该节点的所有Shard 共享,只缓存Filter Context 相关内容
区别1
Filter:在查询过程中,Filter只判断该文档是否满足条件,只有YES或者NO。
Query:除了问YES或NO,还会问匹配的程度。
区别2
FIlter就是用来做数据过滤的,ES会对它的结果进行缓存,所以相较于Query而言Filter的速度会更快。
- Cache采用LRU算法
静态配置,需要设置在每个Data Node 上
Node Level - indices.queries.cache.size: “10%”
index Level: index.queries.cache.enabled:true
Shard Request Cache
- 缓存每个分片上的查询结果
只会缓存设置了size = 0 的查询对应的结果,不会缓存hitst。
但是会缓存Aggregations 和 Suggestions - Cahce Key
LRU 算法,将整个JSON 查询串作为key,与json对象的顺序相关 - 静态配置
数据节点: indices.requests.cache.size:“1%”
缓存失效
Node Query Cache
保存的是Segment级缓存命中的结果。Segment被合并后,缓存会失效
Shard Request Cache
分片Refresh时候,Shard Request Cache会失效,如果Shard 对应的数据频繁发生比变化,该缓存的失效很差
Fielddata Cache
Segment 被合并后,会失效
GET _nodes/stats/indices?pretty
GET _cat/nodes?v&h=name,queryCacheMemory,queryCacheEvictions,requestCacheMemory,requestCacheHitCount,rquest_cache.miss_count
GET _cat/nodes?h=name,port,segments.memory,segments.index_writer_memory,fielddata.memory_size,query_cache.memory_size,request_cache.memory_size&v
GET /_nodes/stats/breaker?
GET /_nodes/stats/breaker?
Tripped 大于0 说明由过熔断
Limit size 与 estimated size 约接近,越可能引发熔断
增加了 indices.breaker.total.use_real_memory 配置项,可以更加精准的分析内存状况,避免OOM