分层缓存
这是一项实验性功能,不建议在生产环境中使用。有关该功能进展的更新或如果您想提供反馈,请参阅相关的 GitHub 问题(相关文档可联系售前工作人员获取)。
分层缓存是一种多层缓存,其中每一层都有自己的特性和性能水平。通过组合不同的层级,您可以在缓存性能和大小之间取得平衡。
分层缓存的类型
UDB-SX 提供了 _tiered 溢出 cache_ 的实现。此实现将从上层移除的任何项目溢出到缓存的下层。上层,例如堆上层级,尺寸较小但提供更好的延迟。下层,例如磁盘缓存,尺寸较大但在延迟方面较慢。UDB-SX 同时提供堆上和磁盘层级。
启用分层缓存
要启用分层缓存,请在 udbsx.yml 中配置以下设置:
udbsx.experimental.feature.pluggable.caching.enabled: true
有关启用实验性功能的方法的更多信息,请参阅实验性功能标志 。
安装所需插件
要使用分层缓存,请安装一个分层缓存插件。唯一可用的缓存插件是 cache-ehcache 插件。此插件提供了磁盘缓存的实现,可用作分层缓存中的磁盘层。
如果未安装 cache-ehcache 插件或未设置磁盘缓存属性,分层缓存将无法初始化。
分层缓存设置
在 UDB-SX 中,请求缓存可用于分层缓存。首先,在 udbsx.yml 文件中配置以下设置。
缓存存储名称
要使用 UDB-SX 提供的分层溢出缓存实现,请将缓存存储名称设置为 tiered_spillover,如下例所示:
indices.requests.cache.store.name: tiered_spillover
设置堆上和磁盘存储层级
将堆上和磁盘存储层级分别设置为 opensearch_onheap 和 ehcache_disk,如下例所示:
indices.requests.cache.tiered_spillover.onheap.store.name: opensearch_onheap
indices.requests.cache.tiered_spillover.disk.store.name: ehcache_disk
opensearch_onheap 设置使用 UDB-SX 中内置的堆上缓存。
ehcache_disk 设置是来自 Ehcache 的磁盘缓存实现,需要安装 cache-ehcache 插件。
配置堆上和磁盘存储
下表列出了 opensearch_onheap 存储的缓存存储设置。
| 设置 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
indices.requests.cache.opensearch_onheap.size |
百分比 | 堆大小的 1% | 堆上缓存的大小。可选。 |
indices.requests.cache.opensearch_onheap.expire |
时间单位 | MAX_VALUE(禁用) |
为缓存结果指定生存时间(TTL)。可选。 |
下表列出了 ehcache_disk 存储的磁盘缓存存储设置。
| 设置 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
indices.requests.cache.ehcache_disk.max_size_in_bytes |
长整型 | 1073741824(1 GB) |
定义磁盘缓存的大小。可选。 |
indices.requests.cache.ehcache_disk.storage.path |
字符串 | {data.paths}/nodes/{node.id}/request_cache |
定义磁盘缓存的存储路径。可选。 |
indices.requests.cache.ehcache_disk.expire_after_access |
时间单位 | MAX_VALUE(禁用) |
为缓存结果指定 TTL。可选。 |
indices.requests.cache.ehcache_disk.alias |
字符串 | ehcacheDiskCache#INDICES_REQUEST_CACHE |
指定磁盘缓存的别名。可选。 |
indices.requests.cache.ehcache_disk.segments |
整数 | 16 |
定义磁盘缓存被分割成的段数。用于并发。可选。 |
indices.requests.cache.ehcache_disk.concurrency |
整数 | 1 |
为磁盘存储创建的独立写入队列的数量,其中一组段共享一个写入队列。可选。 |
tiered_spillover 存储的附加设置
下表列出了 tiered_spillover 存储设置的附加设置。
| 设置 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
indices.requests.cache.tiered_spillover.disk.store.policies.took_time.threshold |
时间单位 | 10ms |
用于根据查询的执行时间(took time)决定是否将查询缓存到磁盘缓存的策略。这是一个动态设置。可选。 |
indices.requests.cache.tiered_spillover.disk.store.enabled |
布尔值 | True |
在分层溢出缓存中动态启用或禁用磁盘缓存。注意:禁用磁盘缓存后,条目不会自动移除,需要手动清除缓存。可选。 |
indices.requests.cache.tiered_spillover.onheap.store.size |
百分比 | 堆大小的 1% | 定义分层缓存中堆上缓存的大小。可选。 |
indices.requests.cache.tiered_spillover.disk.store.size |
长整型 | 1073741824(1 GB) |
定义分层缓存中磁盘缓存的大小。可选。 |
indices.requests.cache.tiered_spillover.segments |
整数 | 2 ^ (ceil(log2(CPU_CORES * 1.5))) |
这决定了分层缓存中的段数,每个段由一个可重入的读/写锁保护。这些锁允许多个并发读取器无争用,而分段允许多个写入器同时操作,从而实现更高的写入吞吐量。可选。 |
删除过期条目的设置
下表列出了与从缓存中删除过期条目相关的设置。
| 设置 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
indices.requests.cache.cleanup.staleness_threshold |
字符串 | 0% |
定义识别后缓存中过期键的百分比。之后,所有过期的缓存条目都将被删除。可选。 |
indices.requests.cache.cleanup.interval |
时间单位 | 1m |
定义删除请求缓存中过期条目的频率。可选。 |
获取 tiered_spillover 存储的统计信息
要评估使用分层溢出缓存的影响,请使用节点统计信息 API,如下例所示:
GET /_nodes/stats/caches/request_cache?level=tier