6.8. 基于文件的缓存存储
基于文件的缓存存储可在运行 Data Grid 的本地主机文件系统上提供持久存储。对于集群缓存,基于文件的缓存存储对于每个 Data Grid 节点都是唯一的。
切勿将基于文件系统的缓存存储在共享文件系统上,如 NFS 或 Samba 共享,因为它们不提供文件锁定功能和数据损坏。
另外,如果您试图将事务缓存与共享文件系统搭配使用,在提交阶段写入文件时可能会出现不可恢复的故障。
soft-Index File Stores
SoftIndexFileStore 是基于文件的缓存存储的默认实现,并将数据存储在一组仅附加文件中。
当只附加文件时:
- 达到其最大大小时,Data Grid 会创建一个新文件并开始写入该文件。
- 达到低于 50% 的压缩阈值,Data Grid 将条目覆盖新文件,然后删除旧文件。
在集群缓存中使用 SoftIndexFileStore 应该在启动时启用清除,以确保不会重新恢复过时的条目。
b+ 树
为提高性能,SoftIndexFileStore 中仅附加文件使用可保存在磁盘和内存中的 B+ Tree 进行索引。内存中索引使用 Java 软引用来确保如果由 Garbage Collection (GC)删除,则可以重新构建它,然后再次请求。
由于 SoftIndexFileStore 使用 Java 软引用来在内存中保留索引,因此这有助于防止内存不足异常。GC 在消耗太多内存前删除索引,同时仍然回退到磁盘。
SoftIndexFileStore 为每个配置的缓存段创建一个 B+ 树。这提供了一个额外的 "index",因为它只有多个元素,并为索引更新提供额外的并行性。目前,我们允许一个基于缓存片段数量的 6 个并行数量。
B+ 树中的每个条目都是节点。默认情况下,每个节点的大小限制为 4096 字节。如果密钥在序列化发生后较长,SoftIndexFileStore 会抛出异常。
文件限制
SoftIndexFileStore 将使用两个以及给定时间配置的 openFilesLimit 数量。为新更新的数据保留两个额外的文件指针,为日志附加器保留另一个用于压缩条目到新文件中。
为索引分配的打开的文件量是配置的 openFilesLimit 的总数之一。这个数字至少为 1 或缓存片段数。为打开数据文件本身分配从配置的限制中重新处理的任何数字。
分段
软索引文件存储始终是网段的。附加日志不是直接分段的,分段直接由索引处理。
过期
SoftIndexFileStore 对过期条目及其要求有全面支持。
单个文件缓存存储
单个文件缓存存储现已弃用,并计划删除。
单个文件缓存存储,SingleFileStore,将数据保留到文件。Data Grid 还维护一个键的内存中索引,而键和值则存储在文件中。
由于 SingleFileStore 保留一个键的内存索引和值位置,因此需要额外的内存,具体取决于密钥大小和键数量。因此,对于密钥较大或者数量较大,我们不推荐使用 SingleFileStore。
在某些情况下,SingleFileStore 也可以变得碎片。如果值大小持续增加,则不会使用单个文件中的可用空间,但该条目会附加到文件末尾。只有在条目可以适合时,才会使用文件中的可用空间。同样,如果您从内存中删除所有条目,则单个文件存储不会减小或进行碎片整理。
分段
默认情况下,单个文件缓存存储被分段为为每个片段有一个单独的实例,这会导致多个目录。每个目录都是代表数据映射段的数字。
6.8.1. 配置基于文件的缓存存储 复制链接链接已复制到粘贴板!
将基于文件的缓存存储到 Data Grid,以在主机文件系统中保留数据。
先决条件
- 如果您要配置嵌入式缓存,请启用全局状态并配置全局持久位置。
流程
-
在您的缓存配置中添加
persistence元素。 -
(可选)指定
true作为passivation属性的值,以便仅在数据从内存中驱除时写入基于文件的缓存存储。 -
包含
file-store元素,并根据情况配置属性。 指定
false作为shared属性的值。基于文件的缓存存储对于每个 Data Grid 实例应始终是唯一的。如果要在集群中使用相同的持久性,请配置基于 JDBC 字符串的缓存存储等共享存储。
-
配置
索引和数据元素,以指定 Data Grid 创建索引并存储数据的位置。 -
如果要使用
write-behind模式配置缓存存储,请包含 write-behind 元素。
基于文件的缓存存储配置
XML
JSON
YAML
ConfigurationBuilder
6.8.2. 配置单个文件缓存存储 复制链接链接已复制到粘贴板!
如果需要,您可以将 Data Grid 配置为创建单个文件存储。
单个文件存储已弃用。与单个文件存储相比,您应该使用 soft-index 文件存储来提高性能和数据一致性。
先决条件
- 如果您要配置嵌入式缓存,请启用全局状态并配置全局持久位置。
流程
-
在您的缓存配置中添加
persistence元素。 -
(可选)指定
true作为passivation属性的值,以便仅在数据从内存中驱除时写入基于文件的缓存存储。 -
包含
single-file-store元素。 -
指定
false作为shared属性的值。 - 根据需要配置任何其他属性。
-
包含
write-behind元素,将缓存存储配置为后面的写入,而不是作为写入。
单个文件缓存存储配置
XML
JSON
YAML
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence().passivation(true)
.addStore(SingleFileStoreConfigurationBuilder.class)
.shared(false)
.preload(true);
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence().passivation(true)
.addStore(SingleFileStoreConfigurationBuilder.class)
.shared(false)
.preload(true);