Elasticsearch缓存机制
Elasticsearch 的缓存机制是提升查询性能的关键组成部分,主要包括节点级缓存和索引级缓存。以下是其核心缓存机制的详细说明:
1. 节点级缓存
查询结果缓存(Query Result Cache)
- 作用:缓存聚合(aggregations)和过滤器(filters)的结果,避免重复计算。
- 适用场景:
- 频繁执行且结果相对稳定的聚合查询(如统计每日销售数据)。
- 过滤条件不变的查询(如 term、range 过滤器)。
- 配置:
yaml
indices.queries.cache.size: 20% # 缓存大小,默认堆内存的10%
indices.queries.cache.type: concurrent_map # 缓存类型
- 注意:
- 仅缓存小结果集(默认文档数少于 10,000 且占比低于结果集的 3%)。
- 对实时性要求高的查询可通过 request_cache=false 参数禁用。
字段数据缓存(Field Data Cache)
- 作用:将字段的倒排索引转换为列存结构(DocValues),加速排序、聚合和脚本操作。
- 适用场景:
- 对 text 字段执行排序或聚合(需先通过 fielddata=true 启用)。
- 动态生成字段统计信息。
- 配置:
yaml
indices.fielddata.cache.size: 40% # 缓存上限,默认无限制
indices.fielddata.cache.expire: 60m # 缓存过期时间(可选)
2. 索引级缓存
过滤器缓存(Filter Cache)
- 作用:缓存常用过滤器(如 term、range)的文档 ID 集合(Bitset)。
- 触发条件:
- 过滤器被频繁使用(默认查询 5 次后缓存)。
- 索引段合并后自动重建缓存。
- 配置:
yaml
index.cache.filter.size: 10% # 缓存大小,默认无限制
index.cache.filter.allow_cache_null: false # 是否缓存null值
段缓存(Segment Cache)
- 作用:缓存文件系统中常用的索引段数据(如倒排索引、DocValues)。
- 依赖:
- 操作系统的文件系统缓存(Linux 的 page cache)。
- 建议为 ES 分配不超过 50% 的物理内存,保留足够空间给系统缓存。
- 优化:
yaml
.throttle.max_bytes_per_sec: 100mb # 限制索引时的IO,避免冲掉缓存
3. 堆内存分配建议
- 公式:总内存 ≈ 堆内存(Xmx=Xms) + 文件系统缓存
- 示例:
- 若服务器有 64GB 内存,建议分配 30GB 给 ES 堆内存,剩余 34GB 由系统缓存使用。
- 注意:
- 堆内存超过 32GB 会触发指针压缩失效(UseCompressedOops),降低性能。
4. 监控与调优
关键监控指标
# 查看节点缓存统计
GET _nodes/stats/indices/query_cache,fielddata
# 查看索引级缓存
GET my_index/_stats/fielddata,query_cache
# 清空字段数据缓存
POST _cache/clear?fielddata=true
性能优化策略
- 避免大结果集缓存:对返回大量数据的查询禁用 request_cache。
- 预加载字段数据:通过 _field_stats API 预热常用字段。
- 控制段数量:通过 index.number_of_segments 限制每个分片的段数量。
- 冷热架构:对历史数据使用 searchable_snapshot 减少内存占用。
5. 缓存失效机制
- 自动失效:
- 数据更新(文档增删改)会触发相关缓存失效。
- 段合并后重建过滤器缓存。
- 手动清理:
bash
# 清空所有缓存
POST _cache/clear
总结
合理配置缓存可显著提升 ES 查询性能,但需结合业务场景调整参数:
- 读多写少场景:增大查询结果缓存和过滤器缓存。
- 聚合密集型场景:优化字段数据缓存,优先使用 DocValues。
- 内存有限环境:减少段数量,利用系统缓存提升段访问效率。
通过监控工具持续观察缓存命中率和内存使用情况,是保持 ES 高性能的关键。

浙公网安备 33010602011771号