分层缓存

这是一项实验性功能,不建议在生产环境中使用。有关该功能进展的更新或如果您想提供反馈,请参阅相关的 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_onheapehcache_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