第 6 章 配置持久性存储
网格使用缓存存储和加载程序与持久性存储交互。
- 持久性
- 通过添加缓存存储,您可以将数据持久化到非易失性存储中,以便在重启后保留。
- 直写缓存
- 将 Data Grid 配置为持久性存储前面的缓存层简化了应用程序的数据访问,因为 Data Grid 处理与外部存储的所有交互。
- 数据溢出
- 使用驱除和传递技术可确保 Data Grid 只保留频繁使用的数据在内存中,并将旧的条目写入持久性存储。
6.1. passivation
传递配置 Data Grid,以便在从内存中驱除这些条目时将条目写入缓存存储。这样,传递可以防止不必要的,可能昂贵的写入持久性存储。
当尝试访问传递的条目时,激活是从缓存存储恢复到内存的过程。因此,当启用传递时,您必须配置实现 CacheWriter
和 CacheLoader
接口的缓存存储,以便它们可以从持久性存储写入和加载条目。
当 Data Grid 从缓存中驱除条目时,它会通知缓存监听程序,该条目被传递,然后将条目存储在缓存存储中。当 Data Grid 获得对被驱除条目的访问请求时,它会很快地将缓存存储中的条目加载到内存中,然后通知缓存监听程序,使条目在存储中保持仍然在存储中。
- passivation 使用 Data Grid 配置中的第一个缓存加载程序,并忽略所有其他缓存。
不支持 passivation:
- 事务性存储.传递写入并从实际 Data Grid 提交边界范围以外的存储中删除条目。
- 共享存储。共享缓存存储需要条目始终存在于其他所有者的存储中。因此,不支持 passivation,因为无法删除条目。
如果您启用对事务存储或共享存储的 passivation,Data Grid 会抛出异常。
6.1.1. 传递是如何工作的
禁用传递
写入内存中的数据会导致写入持久性存储。
如果 Data Grid 从内存中驱除数据,则持久性存储中的数据包括从内存中驱除的条目。这样,持久性存储是内存缓存的超集。当您需要最高一致性时,建议您这样做,因为存储可以在崩溃后再次读取。
如果没有配置驱除,则持久性存储中的数据会在内存中提供数据副本。
启用 passivation
网格仅在从内存驱除数据时将数据添加到持久性存储中,条目会被删除或关闭该节点。
当 Data Grid 激活条目时,它会在内存中恢复数据,但仍然保留存储中的数据。这样,写入可以在没有存储的情况下尽快进行,并且仍然保持一致性。当只创建或更新一个条目时,将更新内存中的,因此存储将已过时。
当存储也配置为共享时,不支持 passivation。这是因为当写入被驱除与读相比,条目可能会在节点间不同步。
为了提高数据一致性,任何不是共享的存储都应启用 purgeOnStartup
。对于启用或禁用 passivation,因此这是正确的,因为存储可能会保存一个过时的条目,同时停止它,并在以后被忽略。
下表显示了在一系列操作后内存和持久性存储中的数据:
操作 | 禁用传递 | 启用 passivation |
---|---|---|
插入 k1。 |
memory: k1 |
内存: k1 |
插入 k2. |
memory: k1, k2 |
memory: k1, k2 |
驱除线程运行和驱除 k1。 |
memory: k2 |
memory: k2 |
读取 k1。 |
memory: k1, k2 |
memory: k1, k2 |
驱除线程运行和驱除 k2。 |
memory: k1 |
memory: k1 |
删除 k2。 |
memory: k1 |
memory: k1 |