索引请求缓存
OpenSearch 索引请求缓存是一种专门的缓存机制,旨在通过在分片级别存储频繁执行的搜索查询结果来提高搜索性能。这可以减少集群负载并改善重复搜索的响应时间。此缓存默认启用,对于频繁执行某些查询的读密集型工作负载特别有用。
缓存会在配置的刷新间隔自动失效。失效操作包括文档更新(包括文档删除)和索引设置更改。这确保了缓存不会返回过时的结果。当缓存大小超出其配置限制时,最近最少使用的条目将被逐出,为新条目腾出空间。
某些查询不符合请求缓存的条件。这些查询包括剖析查询、滚动查询以及具有非确定性特征(例如使用 Math.random()
或 DFS 查询)或相对时间(例如 now
或 new Date()
)的搜索请求。默认情况下,只有 size=0
的请求才能被缓存。在 OpenSearch 2.19 及更高版本中,此行为可以使用 indices.requests.cache.maximum_cacheable_size
进行更改。
配置请求缓存
您可以通过在 opensearch.yml
配置文件中设置参数或使用 REST API 来配置索引请求缓存。有关更多信息,请参阅索引设置。
设置
下表列出了索引请求缓存设置。有关动态设置的更多信息,请参阅索引设置。
设置 | 数据类型 | 默认值 | 级别 | 静态/动态 | 描述 |
---|---|---|---|---|---|
indices.cache.cleanup_interval | 时间单位 | 1m (1 分钟) | 集群 | 静态 | 以指定的时间间隔安排一个定期后台任务,清理缓存中过期的条目。 |
indices.requests.cache.size | 百分比 | 1% | 集群 | 静态 | 缓存大小占堆大小的百分比(例如,使用 1% 的堆,请指定 1% )。 |
index.requests.cache.enable | 布尔型 | true | 索引 | 动态 | 启用或禁用请求缓存。 |
indices.requests.cache.maximum_cacheable_size | 整数 | 0 | 集群 | 动态 | 设置要添加到请求缓存中的查询的最大 size 。 |
示例
要禁用某个索引的请求缓存,请发送以下请求
PUT /my_index/_settings
{
"index.requests.cache.enable": false
}
缓存特定请求
除了提供索引级别或集群级别的请求缓存设置外,您还可以通过将 request_cache
查询参数设置为 true
来选择性地缓存特定的搜索请求
GET /students/_search?request_cache=true
{
"query": {
"match": {
"name": "doe john"
}
}
}
监控请求缓存
监控缓存使用情况和性能对于维持高效的缓存策略至关重要。OpenSearch 提供了多种 API 来帮助监控缓存。
检索所有节点的缓存统计信息
通过 节点统计 API 可返回集群中所有节点的缓存统计信息
GET /_nodes/stats/indices/request_cache
响应包含请求缓存统计信息
{
"nodes": {
"T7aqO6zaQX-lt8XBWBYLsA": {
"indices": {
"request_cache": {
"memory_size_in_bytes": 10240,
"evictions": 0,
"hit_count": 50,
"miss_count": 10
}
}
}
}
}
检索特定索引的缓存统计信息
通过 索引统计 API 可返回特定索引的缓存统计信息
GET /my_index/_stats/request_cache
响应包含请求缓存统计信息
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"_all": {
"primaries": {
"request_cache": {
"memory_size_in_bytes": 2048,
"evictions": 1,
"hit_count": 30,
"miss_count": 5
}
},
"total": {
"request_cache": {
"memory_size_in_bytes": 4096,
"evictions": 2,
"hit_count": 60,
"miss_count": 10
}
}
},
"indices": {
"my_index": {
"primaries": {
"request_cache": {
"memory_size_in_bytes": 2048,
"evictions": 1,
"hit_count": 30,
"miss_count": 5
}
},
"total":{
"request_cache": {
"memory_size_in_bytes": 4096,
"evictions": 2,
"hit_count": 60,
"miss_count": 10
}
}
}
}
}
最佳实践
使用索引请求缓存时,请考虑以下最佳实践
- 合适的缓存大小:根据您的查询模式配置缓存大小。较大的缓存可以存储更多结果,但可能会消耗大量资源。
- 查询优化:确保频繁执行的查询经过优化,以便它们可以从缓存中受益。
- 监控:定期监控缓存命中率和缓存未命中率,以了解缓存效率并进行必要的调整。