6.8. 基于文件的缓存存储

基于文件的缓存存储在运行 Data Grid 的本地主机文件系统中提供持久性存储。对于群集缓存,基于文件的缓存存储对于每个 Data Grid 节点来说是唯一的。

警告

切勿使用共享文件系统上的基于文件系统的缓存存储,如 NFS 或 Samba 共享,因为它们不提供文件锁定功能和数据崩溃。

另外,如果您试图将事务缓存与共享文件系统搭配使用,在提交阶段写入文件时无法恢复的故障时可能会出现。

soft-Index File Stores

SoftIndexFileStore 是基于文件的缓存存储的默认实现,并将其数据存储在仅附加文件中。

当只附加文件时:

  • 达到其最大大小,Data Grid 将创建一个新文件并开始写入该文件。
  • 达到 50% 用量小于 50% 的压缩阈值,Data Grid 会将条目覆盖到新文件,然后删除旧文件。

b+ 树

为提高性能,可使用 B+ 树 在磁盘和内存中存储 SoftIndexFileStore 中仅附加文件进行索引。内存索引使用 Java 软引用来确保在 Garbage Collection (GC)中删除后重新进行重建。

由于 SoftIndexFileStore 使用 Java 软引用来保留索引内存,所以它有助于防止内存不足的情况。GC 在消耗太多内存前删除索引,同时仍然回退到磁盘。

您可以使用索引元素中的 片段 属性,或使用 index Segments () 方法来配置任意数量的 B+ 树。默认情况下,数据网格创建最多 16 个 B+ 树,这意味着最多可以有 16 个索引。有多个索引可防止对索引进行并发写入操作,并减少数据网格需要在内存中保留的条目数量。由于迭代了 soft-index 文件存储,Data Grid 会同时读取索引中的所有条目。

B+ 树中的每个条目都是节点。默认情况下,每个节点的大小限制为 4096 字节。如果键在序列化后较长,SoftIndexFileStore 会抛出异常。

分段

soft-index 文件存储始终被分段。

注意

AdvancedStore.purgeExpired () 方法在 SoftIndexFileStore 中未实现。

单个文件缓存存储

注意

单个文件缓存存储现已弃用,计划删除。

单个文件缓存存储、单一文件存储、将数据存储在文件中。数据网格还维护一个内存密钥索引,而键和值则存储在 文件中。

由于 SingleFileStore 会保留内存密钥索引和值位置,它需要额外内存,具体取决于密钥大小和键的数量。因此,不建议使用 SingleFileStore,其中键较大或者有多个密钥。

在某些情况下,single FileStore 也可能会变得碎片。如果值大小持续增加,则不会使用单一文件中的可用空间,但该条目附加到文件的末尾。只有在条目可以容纳时,才会使用该文件中的可用空间。同样,如果您从内存中删除所有条目,则单个文件存储的大小不会降低或进行碎片整理。

分段

默认情况下,单个文件缓存被分段,每个片段使用单独的实例,这样会导致多个目录。每个目录都是代表数据映射的片段的数字。

6.8.1. 配置基于文件的缓存存储

将基于文件的缓存存储添加到 Data Grid,以在主机文件系统中持久保留数据。

先决条件

  • 如果您配置嵌入缓存,请启用全局持久位置。

流程

  1. persistence 元素添加到缓存配置中。
  2. (可选)指定 true 作为 passivation 属性的值,仅在数据从内存驱除时写入基于文件的 缓存存储
  3. 包含 file-store 元素,并根据情况配置属性。
  4. 指定 false 作为 shared 属性的值。

    基于文件的缓存存储应该始终特定于每个数据网格实例。如果要在集群中使用相同的持久性,请配置共享存储,如 JDBC 字符串的缓存存储。

  5. 配置 索引 和数据元素,以指定数据网格创建索引和存储数据的位置。
  6. 如果要使用 write-behind 模式配置缓存存储,请包含 write-behind 元素。
基于文件的缓存存储配置

XML

<distributed-cache>
  <persistence passivation="true">
     <file-store shared="false">
        <data path="data"/>
        <index path="index"/>
        <write-behind modification-queue-size="2048" />
     </file-store>
  </persistence>
</distributed-cache>

JSON

{
  "distributed-cache": {
    "persistence": {
      "passivation": true,
      "file-store" : {
        "shared": false,
        "data": {
          "path": "data"
        },
        "index": {
          "path": "index"
        },
        "write-behind": {
          "modification-queue-size": "2048"
        }
      }
    }
  }
}

YAML

distributedCache:
  persistence:
    passivation: "true"
    fileStore:
      shared: "false"
      data:
        path: "data"
      index:
        path: "index"
      writeBehind:
        modificationQueueSize: "2048"

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence().passivation(true)
       .addSoftIndexFileStore()
          .shared(false)
          .dataLocation("data")
          .indexLocation("index")
          .modificationQueueSize(2048);