Elasticsearch2.x 三种缓存介绍:Query Cache、Request Cache、Fielddata Cache

本文介绍了Elasticsearch2.x中的三种缓存机制:Query Cache用于缓存查询结果,Request Cache存储请求级别的信息,Fielddata Cache处理字段数据的检索。详细讨论了缓存的失效、使用及Cache Key,并总结了Request Cache的应用。

一、Query Cache

Query Cache也称为Filter Cache,顾名思义它的作用就是对一个查询中包含的过滤器执行结果进行缓存。
比如我们常用的term,terms,range过滤器都会在满足某种条件后被缓存,注意,这里的bool过滤器是不会被缓存的,但bool过滤器包含的子query clause会被缓存,我们可以用下面的命令来查询Query Cache的情况。
http://192.168.0.109:9200/_stats/query_cache?pretty&human
举个栗子,看下面的查询
{
  "from": 0,
  "size": 5,
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "productID": "JODL-X-1937-#pV7"
              }
            },
            {
              "range": {
                "price": {
                  "from": 20,
                  "to": null,
                  "include_lower": true,
                  "include_upper": true
                }
              }
            }
          ]
        }
      }
    }
  }
}
上面有两个过滤器一个Term过滤器用来过滤productID为“JODL-X-1937-#pV7” 的产品,一个range过滤器用来过滤价格在20以上的产品,在这个例子中这两个过滤器执行的结果会分别作为一个BitSet(位图)缓存,返回的查询结果则是这两个位图交集。
上面提到Filter Cache只会在满足某种条件下才会被缓存,至于是哪些条件这里就不介绍了,想了解的童鞋戳下面链接。
关于Filter执行流程及缓存原理 ,请参看此文: 《Elasticsearch2.X Filter执行流程及缓存原理》

二、Request Cache

当一个查询发送到ES集群的某个节点上时
### 三级标题:Elasticsearch 内存熔断机制配置与优化 Elasticsearch 使用断路器(Circuit Breaker)机制来防止内存溢出,确保集群稳定性。当 JVM 内存使用接近上限时,断路器会阻止进一步的内存分配操作,并抛出 `CircuitBreakingException` 异常。用户可以通过配置 `indices.breaker.total.limit`、`indices.breaker.fielddata.limit` 和 `indices.breaker.request.limit` 等参数来调整内存熔断阈值。 例如,设置 `indices.breaker.total.limit` 为 95%,表示允许使用的总堆内存上限为堆大小的 95%。而 `indices.breaker.fielddata.limit` 和 `indices.breaker.request.limit` 分别控制字段值数据和请求数据所使用的内存上限,设置为 40% 和 60% 是一种常见配置方式: ```yaml indices.breaker.total.limit: 95% indices.breaker.fielddata.limit: 40% indices.breaker.request.limit: 60% ``` 需要注意的是,断路器限制不能超过堆内存的总容量,否则仍然可能触发内存熔断异常。此外,`indices.fielddata.cache.size` 也可用于控制 fielddata 缓存的最大大小,例如设置为 40%,以避免内存被大量占用[^3]。 在实际应用中,高内存压力可能来源于多个方面,包括过多的小分片、复杂的聚合查询、批量索引操作、字段映射爆炸等。因此,在调整断路器配置的同时,也应结合查询优化、分片策略调整等手段,以提升整体系统稳定性[^5]。 ### 三级标题:相关配置建议 为了有效管理内存使用,Elasticsearch 提供了动态调整断路器限制的能力。例如,可以通过集群设置 API 将 `indices.breaker.fielddata.limit` 设置为 60%,`indices.breaker.request.limit` 设置为 40%,并确保 `indices.breaker.total.limit` 不超过 70%,以避免内存压力过大: ```json PUT /_cluster/settings { "persistent": { "indices.breaker.fielddata.limit": "60%", "indices.breaker.request.limit": "40%", "indices.breaker.total.limit": "70%" } } ``` 上述配置可以作为生产环境的推荐设置,但应根据实际负载情况进行调整。同时,应避免在 `text` 类型字段上启用 `fielddata`,因为其会占用大量 JVM 内存。建议使用 `keyword` 类型字段进行聚合操作,以减少内存消耗[^5]。 ### 三级标题:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值