1
头图

一、参考

elasticsearch 学习系列目录——更新ing

关于 Elasticsearch 的查询缓存,你想知道的都在这里

二、Shard request cache

分片级别的查询缓存,每个分片都有自己的缓存

image.png

2.1 缓存策略

并不是所有的分片级查询都会被缓存

image.png

2.2 缓存设置

image.png

三、Node Query Cache

NodeQueryCache是在Lucene层面实现的,默认开启,ES层面会进行一些策略控制和信息统计

image.png

3.1 queryCache使用示例

3.2 缓存策略

并不是所有的filter查询都会被缓存

image.png

3.3 缓存设置

image.png

四、ShardRequestCacheNodeQueryCache的比较

ShardRequestCacheES层级的实现,缓存机制为 LRU, 访问一次,就会考虑缓存,主要用途是对聚合结果进行缓存

NodeQueryCacheLucene层级的实现,缓存机制为 LRU, 访问达到一定频率,才会考虑缓存,主要用途是对filter子查询的缓存

image.png

五、其他缓存

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

一曲广陵散
76 声望21 粉丝

柴米油盐酱醋茶