![]() |
不要命的汉堡包 · WebView全面解析 · 1 月前 · |
![]() |
光明磊落的卤蛋 · Nubank | CNCF· 2 月前 · |
![]() |
近视的香菜 · 降采样 — ZIVID KNOWLEDGE ...· 4 月前 · |
![]() |
伤情的创口贴 · 王传福力挺的智驾独角兽冲刺IPO· 5 月前 · |
![]() |
绅士的大白菜 · 全球经济持续复苏,但道路坎坷不平· 5 月前 · |
![]() |
知识渊博的硬币 · 笔记本8G内存DDR3 ...· 7 月前 · |
密钥管理 集群服务器 浏览器缓存 缓存服务器 |
https://access.redhat.com/documentation/zh-cn/red_hat_data_grid/8.3/html-single/configuring_data_grid_caches/index |
![]() |
爱听歌的刺猬
10 月前 |
摘要
数据网格是高性能分布式内存数据存储。
红帽客户门户网站中提供了数据网格的文档。 Data Grid 8.3 文档 Data Grid 8.3 组件详情 Data Grid 8.3 支持的配置 Data Grid 8 功能支持 Data Grid 已弃用功能和功能
访问红帽客户门户网站中的 Data Grid 软件下载 。 您必须有一个红帽帐户才能访问和下载 Data Grid 软件。
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息 。
数据网格缓存提供灵活、内存数据存储,您可以配置它们以适合以下用例: 使用高速本地缓存提高应用程序性能。 通过减少写入操作的卷来优化数据库。 为跨集群的一致性数据提供弹性和持久性。
cache<K,V
> 是数据网格的中心界面,并扩展了
java.util.concurrent.ConcurrentMap
。
缓存条目是高并发数据结构,采用
key:value
格式,支持广泛的、可配置的各种数据类型,从简单字符串到更复杂的对象。
CacheManager
API 是与 Data Grid 缓存交互的起点。缓存管理器控制缓存生命周期,创建、修改和删除缓存实例。
Data Grid 提供了两个
CacheManager
实现:
EmbeddedCacheManager
RemoteCacheManager
RemoteCacheManager
时,它通过 Hot Rod 端点建立与 Data Grid Server 的持久 TCP 连接。
嵌入和远程
缓存管理器
实施共享一些方法和属性。但是,
EmbeddedCacheManager
和
RemoteCacheManager
之间存在语义差别。
数据网格缓存管理器可以创建和控制使用多个使用不同模式的缓存。例如,您可以使用相同的缓存管理器进行本地缓存、分布式缓存以及带有 invalidation 模式的缓存。
您选择的缓存模式取决于数据的质量和保证。 下表总结了缓存模式之间的主要区别:
缓存模式 | 集群? | 读取性能 | 写入性能 | 容量 | 可用性 | 功能 |
---|---|---|---|---|---|---|
Local 高 (本地) 高 (本地) complete Simple(简单) 最高 (本地) 最高 (本地) 部分: 无事务、持久性或索引。 高 (本地) 低 (所有节点,无数据) partial: 不索引。 高 (本地) 最低 (所有节点) 最小的节点 complete 中 (所有者) 中 (所有者节点) 所有节点容量的总和除以所有者数。 所有者节点 complete 中 (主要) 更高的 (单一 RPC) 所有节点容量的总和除以 2 分。 所有者节点 部分: 无事务. |
数据网格提供了一个本地缓存模式,它类似于
ConcurrentHashMap
。
缓存提供比简单映射更多的功能,包括直写和直写到持久性存储,以及驱除和过期等管理功能。
Data Grid
Cache
API 在 Java 中扩展了
ConcurrentMap
API,因此可以轻松地从映射迁移到数据网格缓存。
XML
<local-cache name="mycache" statistics="true"> <encoding media-type="application/x-protostream"/> </local-cache>"local-cache": { "name": "mycache", "statistics": "true", "encoding": { "media-type": "application/x-protostream"
localCache: name: "mycache" statistics: "true" encoding: mediaType: "application/x-protostream"
简单的缓存是本地缓存类型,它禁用对以下功能的支持: 事务和调用批处理 持久性存储 自定义拦截器 transcoding 但是,您可以将其他数据网格功能用于简单缓存,如 expiration、驱除、统计和安全功能。如果您配置了一个与简单缓存不兼容的功能,Data Grid 会抛出异常。
XML
<local-cache simple-cache="true" />"local-cache" : { "simple-cache" : "true"
localCache: simpleCache: "true"
您可以在 Data Grid 集群上创建嵌入和远程缓存,以便在节点间复制数据。
Data Grid 将缓存中的所有条目复制到集群中的所有节点。每个节点可以在本地执行读取操作。 复制的缓存提供了在集群间共享状态的简单方法,但适合小于 10 个节点的集群。由于复制请求数量与集群中的节点数量线性扩展,所以在大型集群中使用复制缓存会降低性能。但是,您可以使用 UDP 多播来复制请求来提高性能。 每个密钥都有一个主要所有者,用于对数据容器更新进行序列化以提供一致性。
图 2.1. 复制缓存
同步或异步复制
cache.put (key, value)
上),直到修改成功复制到集群中的所有节点。
异步复制在后台执行复制,并立即返回写入操作。不建议使用异步复制,因为通信错误或远程节点上出现的错误不会报告给调用者。
Transactions
如果启用了事务,则不通过主所有者复制写操作。 由于具有保守的锁定,每个写入都会触发锁定信息,该消息被广播到所有节点。在事务提交过程中,originator 广播一个单阶段准备消息和解锁信息(可选)。单阶段准备或解锁信息为 fire-and-forget。 通过光驱锁定,原始器将广播准备消息、提交消息和解锁信息(可选)。同样,一次性准备或解锁信息是 fire-and-forget。
数据网格会尝试将缓存中任何条目的固定副本数配置为
numOwners
。这允许分布式缓存线性扩展,在节点添加到集群中时存储更多数据。
当节点加入并离开集群时,当键超过
numOwners
的副本时,会出现一些时间。特别是,如果
numOwners
节点保留了快速成功,则一些条目将会丢失,因此,分布式缓存容许
numOwners - 1
个节点失败。
复制次数代表性能和数据持久性之间的利弊。您维护的副本数越多,较低性能也会降低因为服务器或网络故障而丢失数据的风险。
数据网格将密钥的所有者拆分为一个
主要所有者
,后者协调对密钥的写入,以及零个或多个
备份所有者
。
下图显示了客户端发送到备份所有者的写入操作。在这种情况下,备份节点会将写操作转发到主所有者,然后将写入复制到备份。
图 2.2. 集群复制
图 2.3. 分布式缓存
读取操作
读取操作从主所有者请求值。如果主所有者在合理的时间内没有响应,Data Grid 也从备份所有者请求值。
如果本地缓存中存在密钥,读取操作可能需要
0
信息,如果所有所有者都很慢,则读取操作可能需要最多
2 * numOwners
信息。
写入操作最多为
2 * numOwners
信息。从原始机构到主所有者和
numOwners - 1
信息(从主到备份节点)的消息以及相应的确认信息。
缓存拓扑更改可能会导致重试和写入操作的额外信息。
同步或异步复制
不建议使用异步复制,因为它可能会丢失更新。除了丢失更新外,异步分布式缓存还会在线程写入密钥时看到过时的值,然后立即读取相同的密钥。
Transactions
事务性分布式缓存仅将锁定/准备/过量消息发送到受影响的节点,这意味着所有拥有对事务影响的键的节点。作为优化,如果事务写入一个密钥,并且原始器是密钥的主所有者,则不会复制锁定消息。
即使使用同步复制,分布式缓存也不是线性化的。对于事务缓存,不支持序列化/快照隔离。 例如,线程会执行一个请求:
cache.get(k) -> v1 cache.put(k, v2) cache.get(k) -> v2
但是,另一个线程可能会以不同的顺序看到值:
cache.get(k) -> v2 cache.get(k) -> v1
其原因在于,读取可以从任何所有者返回值,具体根据主所有者回复速度。写入不是在所有所有者中原子的。实际上,仅在从备份收到确认后更新的主要提交。在 primary 正在等待备份的确认消息时,从备份中读取时将看到新值,但从主中读取内容将看到旧信息。
分布式缓存将条目分成固定数量的片段,并将每个网段分配给所有者节点列表。复制缓存执行相同的操作,但每个节点都是一个所有者。
所有者列表中的第一个节点是主所有者。
列表中的其他节点是
备份所有者
。当缓存拓扑更改时,因为节点加入或离开集群,片段所有权表会广播到每个节点。这样,节点可以在不为每个密钥发出多播请求或维护元数据的情况下定位密钥。
numSegments
属性配置可用的片段数量。但是,除非集群重启,否则片段的数量无法更改。
与键对映射相同,也无法更改。无论集群拓扑的变化如何,键必须始终映射到同一片段。重要的一点是,在尽量减少集群拓扑更改时,键与分段映射平均分配分配给每个节点的片段数量非常重要。
一致的哈希值工厂实现 | 描述 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<distributed-cache name="distributedCache" owners="2" segments="100" capacity-factor="2" /> ConfigurationBuilder
Configuration c = new ConfigurationBuilder() .clustering() .cacheMode(CacheMode.DIST_SYNC) .hash() .numOwners(2) .numSegments(100) .capacityFactor(2) .build();KeyPartitioner 2.2.3. 容量因素
容量因素根据集群中每个节点的可用资源分配片段数量。
节点的容量因素适用于该节点主要所有者和备份所有者的片段。换句话说,capacity factor 指定的容量是节点与集群中的其他节点相比的总容量。
默认值为
2.2.3.1. 零容量节点
您可以为每个缓存、用户定义的缓存和内部缓存配置容量因素为
零容量节点配置XML
<infinispan> <cache-container zero-capacity-node="true" /> </infinispan>"infinispan" : { "cache-container" : { "zero-capacity-node" : "true"
infinispan: cacheContainer: zeroCapacityNode: "true" ConfigurationBuilder
new GlobalConfigurationBuilder().zeroCapacityNode(true); 2.2.4. 级别一(L1)缓存当数据节点从集群中的另一节点检索条目时,Data Grid 节点会创建本地副本。L1 缓存避免重复在主所有者节点上查找条目并添加性能。 下图演示了 L1 缓存如何工作: 图 2.4. L1 缓存 ![]()
在 "L1 缓存" 图表中:
客户端调用
L1 缓存性能启用 L1 提高了读取操作的性能,但需要主所有者节点在修改条目时广播无效的消息。这样可确保数据网格在集群中删除任何日期副本。然而,这也降低了写操作的性能并增加内存用量,从而减少缓存的整体容量。 与任何其他缓存条目一样,数据网格驱除并过期本地副本或 L1 条目。 L1 缓存配置XML
<distributed-cache l1-lifespan="5000" l1-cleanup-interval="60000"> </distributed-cache>"distributed-cache": { "l1-lifespan": "5000", "l1-cleanup-interval": "60000"
distributedCache: l1Lifespan: "5000" l1-cleanup-interval: "60000" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.clustering().cacheMode(CacheMode.DIST_SYNC) .l1() .lifespan(5000, TimeUnit.MILLISECONDS) .cleanupTaskFrequency(60000, TimeUnit.MILLISECONDS); 2.2.5. 服务器提示服务器提示通过尽可能在多个服务器、机架和数据中心中复制条目来增加分布式缓存中的数据可用性。 服务器提示仅适用于分布式缓存。 当数据网格发布数据的副本时,它会按照优先级顺序排列:站点、机架、机器和节点。所有配置属性都是可选的。例如,当您只指定机架 ID 时,Data Grid 会将副本分布到不同的机架和节点上。 如果缓存的片段数量太低,则服务器提示可能会影响集群重新平衡操作。 多个数据中心中的集群的替代选择是跨站点复制。 服务器提示配置XML
<cache-container> <transport cluster="MyCluster" machine="LinuxServer01" rack="Rack01" site="US-WestCoast"/> </cache-container>"infinispan" : { "cache-container" : { "transport" : { "cluster" : "MyCluster", "machine" : "LinuxServer01", "rack" : "Rack01", "site" : "US-WestCoast"
cacheContainer: transport: cluster: "MyCluster" machine: "LinuxServer01" rack: "Rack01" site: "US-WestCoast" GlobalConfigurationBuilder
GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder() .transport() .clusterName("MyCluster") .machineId("LinuxServer01") .rackId("Rack01") .siteId("US-WestCoast");org.infinispan.configuration.global.TransportConfigurationBuilder 2.2.6. 关键关联性服务在分布式缓存中,密钥被分配到一个带有不透明算法的节点列表。无法轻松撤销计算并生成映射到特定节点的键。但是,数据网格可生成一系列(伪)随机键,查看其主所有者是哪一个,并在需要密钥映射到特定节点时将其转移到应用程序。 以下代码片段描述了如何获取和使用该服务。 // 1. Obtain a reference to a cache Cache cache = ... Address address = cache.getCacheManager().getAddress(); // 2. Create the affinity service KeyAffinityService keyAffinityService = KeyAffinityServiceFactory.newLocalKeyAffinityService( cache, new RndKeyGenerator(), Executors.newSingleThreadExecutor(), 100); // 3. Obtain a key for which the local node is the primary owner Object localKey = keyAffinityService.getKeyForAddress(address); // 4. Insert the key in the cache cache.put(localKey, "yourValue");
服务从第 2 步启动:此时使用提供的
Executor
生成和队列键。在第 3 步中,我们从服务中获取密钥,并在第 4 步中使用它。
public interface Lifecycle { void start(); void stop(); 该服务通过 2.2.7. 分组 API
除了键关联服务之外,
Configuration c = new ConfigurationBuilder() .clustering().hash().groups().enabled() .build(); <distributed-cache> <groups enabled="true"/> </distributed-cache>
如果您已控制密钥类(您可以更改类定义,而不是不可修改库的一部分),那么我们建议使用一个内部组。内部组通过向方法添加
class User { String office; public int hashCode() { // Defines the hash for the key, normally used to determine location // Override the location by specifying a group // All keys in the same group end up with the same owners @Group public String getOffice() { return office; 组方法必须返回 2.3. 失效缓存您可以在validation 模式中使用数据网格来优化执行读操作卷的系统。一个好的示例是使用 invalidation 以防止在状态更改时进行大量数据库写入。 只有当您拥有另一个数据库等数据永久存储时,这种缓存模式才有意义,并且仅在读写系统中使用数据网格作为优化,以防止每个读取的数据库出现。如果为无效配置缓存,则每个数据在缓存中都会有变化,集群中的其他缓存都会收到一条信息,告知它们的数据已经过期,并应该从内存中删除,并应该从任何本地存储中删除。 图 2.5. 失效缓存 ![]()
有时,应用程序会从外部存储中读取值并希望将其写入本地缓存中,而不将其从其他节点中删除。要做到这一点,它必须调用
同步或异步复制 同步时,写入块直到集群中的所有节点都被驱除掉过时的值。异步时,原始器会广播无效的消息,但不会等待响应。这意味着,当在原始器上写入完成后,其他节点仍然可以看到过时的值。 Transactions 事务可用于批量无效消息。事务获取主所有者上的密钥锁定。 由于具有保守的锁定,每个写入都会触发锁定信息,该消息被广播到所有节点。在事务提交过程中,originator 广播一个单阶段准备消息(可选 fire-and-forget),它会导致所有受影响的键并释放锁。 通过光驱锁定,原始器将广播准备消息、提交消息和解锁信息(可选)。单阶段准备或解锁信息为 fire-and-forget,最后一条消息会释放锁定。 2.4. 分散缓存
分散缓存与分布式缓存非常相似,因为它们允许线性扩展集群。分散缓存通过维护数据的两个副本(
<scattered-cache name="scatteredCache" /> Configuration c = new ConfigurationBuilder() .clustering().cacheMode(CacheMode.SCATTERED_SYNC) .build(); 分散模式不会在服务器配置中公开,因为服务器通常通过 Hot Rod 协议进行访问。该协议自动为写入选择主所有者,因此写入(具有两个所有者的分布式模式)也要求集群中的单个 RPC。因此,分散缓存不会带来性能优势。 2.5. 异步复制
所有集群的缓存模式都可配置为使用与 <replicated-cache
异步 API
一个异步 API 允许您使用同步通信,但不阻止用户线程。
有一个注意事项:异步操作不会保留程序顺序。如果线程调用
2.5.1. 使用异步复制返回值
由于
Cache cache = ...
TransactionManager tm = ...
tm.begin();
try {
Integer v1 = cache.get(k);
// Increment the value
Integer v2 = cache.put(k, v1 + 1);
if (Objects.equals(v1, v2) {
// success
} else {
// retry
} finally {
tm.commit();
实现这一点的正确方法是使用
2.6. 配置初始集群大小
数据网格可动态处理集群拓扑更改。这意味着,在 Data Grid 初始化缓存前,节点不需要等待其他节点加入集群。
如果应用程序在缓存启动前需要集群中特定数量的节点,您可以将初始集群大小配置为传输的一部分。
打开 Data Grid 配置进行编辑。
在缓存以
初始集群大小配置XML
<infinispan> <cache-container> <transport initial-cluster-size="4" initial-cluster-timeout="30000" /> </cache-container> </infinispan>"infinispan" : { "cache-container" : { "transport" : { "initial-cluster-size" : "4", "initial-cluster-timeout" : "30000"
infinispan: cacheContainer: transport: initialClusterSize: "4" initialClusterTimeout: "30000" ConfigurationBuilder
GlobalConfiguration global = GlobalConfigurationBuilder.defaultClusteredBuilder() .transport() .initialClusterSize(4) .initialClusterTimeout(30000, TimeUnit.MILLISECONDS); 第 3 章 数据网格缓存配置缓存配置控制数据网格如何存储数据。 作为缓存配置的一部分,您要声明要使用的缓存模式。例如,您可以配置 Data Grid 集群以使用复制缓存或分布式缓存。 您的配置还定义了缓存的特性,并支持要在处理数据时使用的数据网格功能。例如,您可以配置缓存中的 Data Grid 对条目的编码方式,无论是在节点间同步或异步复制请求,则条目为 mortal 或 immortal 等等。 3.1. 声明性缓存配置
您可以根据 Data Grid 模式,以 XML 或 JSON 格式以声明性配置缓存。
与编程配置相比,声明缓存配置有以下优点:
在独立文件中定义每个配置,可用于创建嵌入和远程缓存。
3.1.1. 缓存配置
您可以使用 XML、JSON 和 YAML 格式创建声明缓存配置。
所有声明缓存都必须符合 Data Grid 模式。JSON 格式的配置必须遵循 XML 配置的结构,元素对应于对象和属性与字段对应。
数据网格将字符限制为最多
分布式缓存XML
<distributed-cache owners="2" segments="256" capacity-factor="1.0" l1-lifespan="5000" mode="SYNC" statistics="true"> <encoding media-type="application/x-protostream"/> <locking isolation="REPEATABLE_READ"/> <transaction mode="FULL_XA" locking="OPTIMISTIC"/> <expiration lifespan="5000" max-idle="1000" /> <memory max-count="1000000" when-full="REMOVE"/> <indexing enabled="true" storage="local-heap"> <index-reader refresh-interval="1000"/> </indexing> <partition-handling when-split="ALLOW_READ_WRITES" merge-policy="PREFERRED_NON_NULL"/> <persistence passivation="false"> <!-- Persistent storage configuration. --> </persistence> </distributed-cache>"distributed-cache": { "mode": "SYNC", "owners": "2", "segments": "256", "capacity-factor": "1.0", "l1-lifespan": "5000", "statistics": "true", "encoding": { "media-type": "application/x-protostream" "locking": { "isolation": "REPEATABLE_READ" "transaction": { "mode": "FULL_XA", "locking": "OPTIMISTIC" "expiration" : { "lifespan" : "5000", "max-idle" : "1000" "memory": { "max-count": "1000000", "when-full": "REMOVE" "indexing" : { "enabled" : true, "storage" : "local-heap", "index-reader" : { "refresh-interval" : "1000" "partition-handling" : { "when-split" : "ALLOW_READ_WRITES", "merge-policy" : "PREFERRED_NON_NULL" "persistence" : { "passivation" : false
distributedCache: mode: "SYNC" owners: "2" segments: "256" capacityFactor: "1.0" l1Lifespan: "5000" statistics: "true" encoding: mediaType: "application/x-protostream" locking: isolation: "REPEATABLE_READ" transaction: mode: "FULL_XA" locking: "OPTIMISTIC" expiration: lifespan: "5000" maxIdle: "1000" memory: maxCount: "1000000" whenFull: "REMOVE" indexing: enabled: "true" storage: "local-heap" indexReader: refreshInterval: "1000" partitionHandling: whenSplit: "ALLOW_READ_WRITES" mergePolicy: "PREFERRED_NON_NULL" persistence: passivation: "false" # Persistent storage configuration. 复制缓存XML
<replicated-cache segments="256" mode="SYNC" statistics="true"> <encoding media-type="application/x-protostream"/> <locking isolation="REPEATABLE_READ"/> <transaction mode="FULL_XA" locking="OPTIMISTIC"/> <expiration lifespan="5000" max-idle="1000" /> <memory max-count="1000000" when-full="REMOVE"/> <indexing enabled="true" storage="local-heap"> <index-reader refresh-interval="1000"/> </indexing> <partition-handling when-split="ALLOW_READ_WRITES" merge-policy="PREFERRED_NON_NULL"/> <persistence passivation="false"> <!-- Persistent storage configuration. --> </persistence> </replicated-cache>"replicated-cache": { "mode": "SYNC", "segments": "256", "statistics": "true", "encoding": { "media-type": "application/x-protostream" "locking": { "isolation": "REPEATABLE_READ" "transaction": { "mode": "FULL_XA", "locking": "OPTIMISTIC" "expiration" : { "lifespan" : "5000", "max-idle" : "1000" "memory": { "max-count": "1000000", "when-full": "REMOVE" "indexing" : { "enabled" : true, "storage" : "local-heap", "index-reader" : { "refresh-interval" : "1000" "partition-handling" : { "when-split" : "ALLOW_READ_WRITES", "merge-policy" : "PREFERRED_NON_NULL" "persistence" : { "passivation" : false
replicatedCache: mode: "SYNC" segments: "256" statistics: "true" encoding: mediaType: "application/x-protostream" locking: isolation: "REPEATABLE_READ" transaction: mode: "FULL_XA" locking: "OPTIMISTIC" expiration: lifespan: "5000" maxIdle: "1000" memory: maxCount: "1000000" whenFull: "REMOVE" indexing: enabled: "true" storage: "local-heap" indexReader: refreshInterval: "1000" partitionHandling: whenSplit: "ALLOW_READ_WRITES" mergePolicy: "PREFERRED_NON_NULL" persistence: passivation: "false" # Persistent storage configuration. 多个缓存XML
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:13.0 https://infinispan.org/schemas/infinispan-config-13.0.xsd urn:infinispan:server:13.0 https://infinispan.org/schemas/infinispan-server-13.0.xsd" xmlns="urn:infinispan:config:13.0" xmlns:server="urn:infinispan:server:13.0"> <cache-container name="default" statistics="true"> <distributed-cache name="mycacheone" mode="ASYNC" statistics="true"> <encoding media-type="application/x-protostream"/> <expiration lifespan="300000"/> <memory max-size="400MB" when-full="REMOVE"/> </distributed-cache> <distributed-cache name="mycachetwo" mode="SYNC" statistics="true"> <encoding media-type="application/x-protostream"/> <expiration lifespan="300000"/> <memory max-size="400MB" when-full="REMOVE"/> </distributed-cache> </cache-container> </infinispan>
infinispan: cacheContainer: name: "default" statistics: "true" caches: mycacheone: distributedCache: mode: "ASYNC" statistics: "true" encoding: mediaType: "application/x-protostream" expiration: lifespan: "300000" memory: maxSize: "400MB" whenFull: "REMOVE" mycachetwo: distributedCache: mode: "SYNC" statistics: "true" encoding: mediaType: "application/x-protostream" expiration: lifespan: "300000" memory: maxSize: "400MB" whenFull: "REMOVE""infinispan" : { "cache-container" : { "name" : "default", "statistics" : "true", "caches" : { "mycacheone" : { "distributed-cache" : { "mode": "ASYNC", "statistics": "true", "encoding": { "media-type": "application/x-protostream" "expiration" : { "lifespan" : "300000" "memory": { "max-size": "400MB", "when-full": "REMOVE" "mycachetwo" : { "distributed-cache" : { "mode": "SYNC", "statistics": "true", "encoding": { "media-type": "application/x-protostream" "expiration" : { "lifespan" : "300000" "memory": { "max-size": "400MB", "when-full": "REMOVE" Data Grid 配置模式参考 infinispan-config-13.0.xsd 3.2. 添加缓存模板
Data Grid 模式包括可用于创建模板的
缓存模板示例XML
<infinispan> <cache-container> <distributed-cache-configuration name="my-dist-template" mode="SYNC" statistics="true"> <encoding media-type="application/x-protostream"/> <memory max-count="1000000" when-full="REMOVE"/> <expiration lifespan="5000" max-idle="1000"/> </distributed-cache-configuration> </cache-container> </infinispan>"infinispan" : { "cache-container" : { "distributed-cache-configuration" : { "name" : "my-dist-template", "mode": "SYNC", "statistics": "true", "encoding": { "media-type": "application/x-protostream" "expiration" : { "lifespan" : "5000", "max-idle" : "1000" "memory": { "max-count": "1000000", "when-full": "REMOVE"
infinispan: cacheContainer: distributedCacheConfiguration: name: "my-dist-template" mode: "SYNC" statistics: "true" encoding: mediaType: "application/x-protostream" expiration: lifespan: "5000" maxIdle: "1000" memory: maxCount: "1000000" whenFull: "REMOVE" 3.2.1. 从模板创建缓存
从配置模板创建缓存。
Data Grid Console 中的
Cache 模板
菜单提供了远程缓存的模板。
在缓存管理器中至少添加一个缓存模板。
打开 Data Grid 配置进行编辑。
指定缓存使用
从模板继承的缓存配置XML
<distributed-cache configuration="my-dist-template" />"distributed-cache": { "configuration": "my-dist-template"
distributedCache: configuration: "my-dist-template" 3.2.2. 缓存模板继承缓存配置模板可以从其他模板继承以扩展和覆盖设置。 缓存模板继承为分级。要使子配置模板从父模板继承,您必须在父模板后面包含它。 另外,对于具有多个值的元素,模板继承是可添加的。从另一个模板继承的缓存会合并来自该模板的值,这些缓存可覆盖属性。 模板继承示例XML
<infinispan> <cache-container> <distributed-cache-configuration name="base-template"> <expiration lifespan="5000"/> </distributed-cache-configuration> <distributed-cache-configuration name="extended-template" configuration="base-template"> <encoding media-type="application/x-protostream"/> <expiration lifespan="10000" max-idle="1000"/> </distributed-cache-configuration> </cache-container> </infinispan>"infinispan" : { "cache-container" : { "caches" : { "base-template" : { "distributed-cache-configuration" : { "expiration" : { "lifespan" : "5000" "extended-template" : { "distributed-cache-configuration" : { "configuration" : "base-template", "encoding": { "media-type": "application/x-protostream" "expiration" : { "lifespan" : "10000", "max-idle" : "1000"
infinispan: cacheContainer: caches: base-template: distributedCacheConfiguration: expiration: lifespan: "5000" extended-template: distributedCacheConfiguration: configuration: "base-template" encoding: mediaType: "application/x-protostream" expiration: lifespan: "10000" maxIdle: "1000" 3.2.3. 缓存模板通配符您可以添加通配符来缓存配置模板名称。如果您创建名称与通配符匹配的缓存,Data Grid 会应用配置模板。 如果缓存名称匹配多个通配符,则数据网格会抛出异常。 模板通配符示例XML
<infinispan> <cache-container> <distributed-cache-configuration name="async-dist-cache-*" mode="ASYNC" statistics="true"> <encoding media-type="application/x-protostream"/> </distributed-cache-configuration> </cache-container> </infinispan>"infinispan" : { "cache-container" : { "distributed-cache-configuration" : { "name" : "async-dist-cache-*", "mode": "ASYNC", "statistics": "true", "encoding": { "media-type": "application/x-protostream"
infinispan: cacheContainer: distributedCacheConfiguration: name: "async-dist-cache-*" mode: "ASYNC" statistics: "true" encoding: mediaType: "application/x-protostream"使用上述示例,如果您创建一个名为 "async-dist-cache-prod" 的缓存,则 Data Grid 会使用
async-dist-cache-*
模板的配置。
3.2.4. 从多个 XML 文件缓存模板
将缓存配置模板分成多个 XML 文件,使其具有粒度灵活性并通过 XML 包含(排除)进行引用。
数据网格为 XInclude 规格提供最少支持。这意味着您无法使用
Xinclude 缓存模板
<infinispan xmlns:xi="http://www.w3.org/2001/XInclude"> <cache-container default-cache="cache-1"> <!-- References files that contain cache configuration templates. --> <xi:include href="distributed-cache-template.xml" /> <xi:include href="replicated-cache-template.xml" /> </cache-container> </infinispan>数据网格还提供
infinispan-config-fragment-13.0.xsd
模式,您可将其用于配置片段。
配置片段模式
<local-cache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:13.0 https://infinispan.org/schemas/infinispan-config-fragment-13.0.xsd" xmlns="urn:infinispan:config:13.0" name="mycache"/>XInclude 规格 3.3. 创建远程缓存当您在运行时创建远程缓存时,Data Grid 服务器会在集群间同步您的配置,以便所有节点都具有副本。因此,您应该总是使用以下机制动态创建远程缓存: Data Grid Console Data Grid 命令行界面(CLI) 热环或 HTTP 客户端 3.3.1. 默认缓存管理器
Data Grid Server 提供了一个默认缓存管理器,用于控制远程缓存的生命周期。启动 Data Grid Server 会自动实例化 Cache Manager,以便您可以创建和删除远程缓存和其他资源,如 Protobuf 模式。
启动 Data Grid Server 并添加用户凭证后,您可以查看 Cache Manager 的详情,并从 Data Grid Console 获取集群信息。
在任意浏览器中打开
[//containers/default]> describe
127.0.0.1:11222/rest/v2/cache-managers/default/
。
默认缓存管理器配置XML
<infinispan> <!-- Creates a Cache Manager named "default" and enables metrics. --> <cache-container name="default" statistics="true"> <!-- Adds cluster transport that uses the default JGroups TCP stack. --> <transport cluster="${infinispan.cluster.name:cluster}" stack="${infinispan.cluster.stack:tcp}" node-name="${infinispan.node.name:}"/> <!-- Requires user permission to access caches and perform operations. --> <security> <authorization/> </security> </cache-container> </infinispan>"infinispan" : { "jgroups" : { "transport" : "org.infinispan.remoting.transport.jgroups.JGroupsTransport" "cache-container" : { "name" : "default", "statistics" : "true", "transport" : { "cluster" : "cluster", "node-name" : "", "stack" : "tcp" "security" : { "authorization" : {}
infinispan: jgroups: transport: "org.infinispan.remoting.transport.jgroups.JGroupsTransport" cacheContainer: name: "default" statistics: "true" transport: cluster: "cluster" nodeName: "" stack: "tcp" security: authorization: ~ 3.3.2. 使用 Data Grid 控制台创建缓存
使用数据网格控制台在任何 Web 浏览器的直观直观界面中创建远程缓存。
创建具有管理权限的 Data Grid
3.3.3. 使用 Data Grid CLI 创建远程缓存
使用 Data Grid 命令行界面(CLI)在 Data Grid Server 中添加远程缓存。
创建具有管理权限的 Data Grid
bin/cli.sh
使用
create cache --file=mycache.xml mycache 验证
3.3.4. 从 Hot Rod 客户端创建远程缓存
使用 Data Grid Hot Rod API 从 Java、C++、.NET/C#、JS 客户端等在 Data Grid Server 上创建远程缓存。
此流程演示了如何使用 Hot Rod Java 客户端在第一次引导时创建远程缓存。您可以在
Data Grid Tutorials
中找到其他 Hot Rod 客户端的代码示例。
创建具有管理权限的 Data Grid
ConfigurationBuilder
File file = new File("path/to/infinispan.xml") ConfigurationBuilder builder = new ConfigurationBuilder(); builder.remoteCache("another-cache") .configuration("<distributed-cache name=\"another-cache\"/>"); builder.remoteCache("my.other.cache") .configurationURI(file.toURI()); hotrod-client.properties
infinispan.client.hotrod.cache.another-cache.configuration=<distributed-cache name=\"another-cache\"/> infinispan.client.hotrod.cache.[my.other.cache].configuration_uri=file:///path/to/infinispan.xml如果远程缓存的名称包含
.
字符,在使用
hotrod-client.properties
文件时,必须将其括在方括号中。
热 Rod 客户端配置
org.infinispan.client.hotrod.configuration.RemoteCacheConfigurationBuilder
3.3.5. 使用 REST API 创建远程缓存
使用 Data Grid REST API 在 Data Grid Server 上创建来自任何合适的 HTTP 客户端的远程缓存。
创建具有管理权限的 Data Grid
3.4. 创建嵌入缓存
数据网格提供了一个
3.4.1. 在您的项目中添加 Data Grid
将 Data Grid 添加到项目,以便在应用程序中创建嵌入式缓存。
配置项目以从 Maven 存储库获取 Data Grid 工件。
将
<dependencies> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-core</artifactId> </dependency> </dependencies> 3.4.2. 配置嵌入缓存
Data Grid 提供了一个
// Set up a clustered cache manager. GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder(); // Initialize the default cache manager. DefaultCacheManager cacheManager = new DefaultCacheManager(global.build()); // Create a distributed cache with synchronous replication. ConfigurationBuilder builder = new ConfigurationBuilder(); builder.clustering().cacheMode(CacheMode.DIST_SYNC); // Obtain a volatile cache. Cache<String, String> cache = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache("myCache", builder.build()); 第 4 章 启用和配置数据网格统计信息和 JMX 监控数据网格可以提供缓存管理器和缓存统计信息,以及导出 JMX MBean。 4.1. 配置 Data Grid 指标
数据网格会生成兼容 MicroProfile 指标 API 的指标。
量表提供值,如用于写操作或 JVM 运行时间的平均纳秒数。
histograms 提供有关读取、写入和删除时间等操作执行时间的详细信息。
默认情况下,Data Grid 在启用统计数据时会生成量表,但您也可以将其配置为生成直方图。
打开 Data Grid 配置进行编辑。
将
指标配置XML
<infinispan> <cache-container statistics="true"> <metrics gauges="true" histograms="true" /> </cache-container> </infinispan>"infinispan" : { "cache-container" : { "statistics" : "true", "metrics" : { "gauges" : "true", "histograms" : "true"
infinispan: cacheContainer: statistics: "true" metrics: gauges: "true" histograms: "true"Eclipse MicroProfile 指标 4.2. 注册 JMX MBeans
数据网格可以注册 JMX MBeans,用于收集统计信息和执行管理操作。您还必须为 JMX MBeans 中的所有统计属性提供
JMX 配置XML
<infinispan> <cache-container statistics="true"> <jmx enabled="true" domain="example.com"/> </cache-container> </infinispan>"infinispan" : { "cache-container" : { "statistics" : "true", "jmx" : { "enabled" : "true", "domain" : "example.com"
infinispan: cacheContainer: statistics: "true" enabled: "true" domain: "example.com" 4.2.1. 启用 JMX 远程端口
提供唯一的远程 JMX 端口,以通过 JMXServiceURL 格式的连接公开数据网格 MBeans。
您可以使用以下方法之一启用远程 JMX 端口:
启用需要身份验证到其中一个数据网格服务器安全域的远程 JMX 端口。
使用标准的 Java 管理配置选项手动启用远程 JMX 端口。
对于具有身份验证的远程 JMX,请使用默认安全域定义用户角色。用户必须具有读写访问权限的
bin/server.sh --jmx 9999
警告
禁用了 SSL 的远程 JMX 不用于生产环境。 在启动时将以下系统属性传递给 Data Grid 服务器: bin/server.sh -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
警告
在无需身份验证或 SSL 的情况下启用远程 JMX 并不安全,不建议在任何环境中使用。禁用身份验证和 SSL 可让未授权用户连接到您的服务器并访问其中托管的数据。 创建安全域 4.2.2. Data Grid MBeans数据网格公开了代表可管理资源的 JMX MBeans。
4.2.3. 在自定义 MBean 服务器中注册 MBeans
数据网格包含一个
JMX MBean 服务器查找配置XML
<infinispan> <cache-container statistics="true"> <jmx enabled="true" domain="example.com" mbean-server-lookup="com.example.MyMBeanServerLookup"/> </cache-container> </infinispan>"infinispan" : { "cache-container" : { "statistics" : "true", "jmx" : { "enabled" : "true", "domain" : "example.com", "mbean-server-lookup" : "com.example.MyMBeanServerLookup"
infinispan: cacheContainer: statistics: "true" enabled: "true" domain: "example.com" mbeanServerLookup: "com.example.MyMBeanServerLookup" 第 5 章 配置 JVM 内存用量通过以下方法控制数据网格如何在 JVM 内存中存储数据: 使用驱除管理 JVM 内存用量,从缓存自动删除数据。 添加 lifespan 和最大空闲时间以过期条目并防止过时的数据。 配置数据网格以在非堆、原生内存中存储数据. 5.1. 默认内存配置默认情况下,数据网格将缓存条目存储为 JVM 堆中的对象。随着应用程序添加条目,缓存的大小可能会超过 JVM 可用的内存量。同样,如果数据网格不是主数据存储,则条目过时,这意味着您的缓存包含陈旧数据。 <distributed-cache> <memory storage="HEAP"/> </distributed-cache>"distributed-cache": { "memory" : { "storage": "HEAP"
distributedCache: memory: storage: "HEAP" 5.2. 驱除和过期
驱除和过期时间是两个策略,可通过删除旧的未使用条目来清理数据容器。虽然驱除和过期时间类似,但它们有一些重要的区别。
采用 ✓ 驱除功能,在容器变得大于配置的阈值时,可以通过删除条目来控制数据容器的大小。
✓ 过期限制可以存在的时间条目量。数据网格使用调度程序来定期删除过期的条目。已过期但还没有删除的条目会在访问时立即删除。在这种情况下,过期的条目的
5.3. 使用 Data Grid 缓存驱除
驱除可让您以以下两种方式之一从内存中删除条目来控制数据容器的大小:
条目总数(
5.3.1. 驱除策略
当您配置 Data Grid 驱除时,可以指定:
数据容器的最大大小。
缓存达到阈值时删除条目的策略。
您可以手动执行驱除或配置 Data Grid 以执行以下操作之一:
删除旧条目,为新条目腾出空间。
引发
5.3.2. 配置最大计数驱除
将 Data Grid 缓存的大小限制为条目总数。
打开 Data Grid 配置进行编辑。
使用
最大计数驱除在以下示例中,Data Grid 会在缓存包含总计 500 个条目并且创建一个新条目时删除条目: <distributed-cache> <memory max-count="500" when-full="REMOVE"/> </distributed-cache>"distributed-cache" : { "memory" : { "max-count" : "500", "when-full" : "REMOVE"
distributedCache: memory: maxCount: "500" whenFull: "REMOVE" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.memory().maxCount(500).whenFull(EvictionStrategy.REMOVE);Data Grid 配置模式参考 org.infinispan.configuration.cache.MemoryConfigurationBuilder 5.3.3. 配置最大大小驱除
将数据网格缓存的大小限制为最大内存量。
打开 Data Grid 配置进行编辑。
指定
最大大小驱除在以下示例中,Data Grid 会在缓存大小达到 1.5 GB (千兆字节)并且创建新条目时删除条目: <distributed-cache> <encoding media-type="application/x-protostream"/> <memory max-size="1.5GB" when-full="REMOVE"/> </distributed-cache>"distributed-cache" : { "encoding" : { "media-type" : "application/x-protostream" "memory" : { "max-size" : "1.5GB", "when-full" : "REMOVE"
distributedCache: encoding: mediaType: "application/x-protostream" memory: maxSize: "1.5GB" whenFull: "REMOVE" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.encoding().mediaType("application/x-protostream") .memory() .maxSize("1.5GB") .whenFull(EvictionStrategy.REMOVE);Data Grid 配置模式参考 org.infinispan.configuration.cache.EncodingConfiguration org.infinispan.configuration.cache.MemoryConfigurationBuilder 缓存编码和一般 5.3.4. 手动驱除
如果您选择手动驱除策略,Data Grid 不会执行驱除。您必须使用
<distributed-cache> <memory max-count="500" when-full="MANUAL"/> </distributed-cache>"distributed-cache" : { "memory" : { "max-count" : "500", "when-full" : "MANUAL"
distributedCache: memory: maxCount: "500" whenFull: "MANUAL" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.encoding().mediaType("application/x-protostream") .memory() .maxSize("1.5GB") .whenFull(EvictionStrategy.REMOVE); 5.3.5. 通过驱除传递在 Data Grid 驱除条目时,传递会持久保留数据到缓存存储。如果您启用通过,您应该总是启用驱除,如下例所示: <distributed-cache> <persistence passivation="true"> <!-- Persistent storage configuration. --> </persistence> <memory max-count="100"/> </distributed-cache>"distributed-cache": { "memory" : { "max-count" : "100" "persistence" : { "passivation" : true
distributedCache: memory: maxCount: "100" persistence: passivation: "true" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.memory().maxCount(100); builder.persistence().passivation(true); //Persistent storage configuration 5.4. 带有 lifespan 和最大闲置的过期expiration 配置 Data Grid,以在访问以下时间限制之一时从缓存中删除条目:
5.4.1. 过期如何工作
当您配置过期时,数据网格使用元数据存储密钥,以确定条目何时过期。
lifespan 使用
5.4.2. 过期获取器
数据网格使用定期运行的已消耗程序线程来检测和删除过期的条目。过期删除程序确保删除不再访问的过期条目。
Data Grid
5.4.3. 最大闲置和集群缓存
因为最大空闲的过期时间依赖于缓存条目的最后访问时间,所以集群缓存模式有一些限制。
随着 lifespan 过期,缓存条目的创建时间提供了在集群缓存之间一致的值。例如,所有节点上的
5.4.4. 为缓存配置 lifespan 和最大闲置时间
为缓存中的所有条目设置 lifespan 和最大闲置时间。
打开 Data Grid 配置进行编辑。
使用
数据网格缓存过期在以下示例中,Data Grid 会在上次访问时间后 5 秒或 1 秒后过期所有缓存条目,以防出现以下情况: <replicated-cache> <expiration lifespan="5000" max-idle="1000" /> </replicated-cache>"replicated-cache" : { "expiration" : { "lifespan" : "5000", "max-idle" : "1000"
replicatedCache: expiration: lifespan: "5000" maxIdle: "1000" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.expiration().lifespan(5000, TimeUnit.MILLISECONDS) .maxIdle(1000, TimeUnit.MILLISECONDS); 5.4.5. 配置 lifespan 以及每个条目的最大闲置时间
指定单个条目的 lifespan 和最大闲置时间。当您向条目添加 lifespan 和最大闲置时间时,这些值优先于缓存的过期配置。
当您明确为缓存条目定义 lifespan 和最大闲置时间值时,Data Grid 会将这些值与缓存条目一起复制。同样,Data Grid 也会将过期值与条目一起写入持久性存储。
对于远程缓存,您可以使用 Data Grid 控制台以交互方式将 lifespan 和最大闲置时间添加到条目。
通过 Data Grid 命令行界面(CLI),在
//Lifespan of 5 seconds. //Maximum idle time of 1 second. cache.put("hello", "world", 5, TimeUnit.SECONDS, 1, TimeUnit.SECONDS); //Lifespan is disabled with a value of -1. //Maximum idle time of 1 second. cache.put("hello", "world", -1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS); 5.5. JVM 堆和非堆内存默认情况下,Data Grid 将缓存条目存储在 JVM 堆内存中。您可以将 Data Grid 配置为使用非堆存储,这意味着您的数据在受管 JVM 内存空间之外发生原生内存。 下图显示了数据网格运行的 JVM 进程的内存空间简图: 图 5.1. JVM 内存空间 ![]() JVM 堆内存堆分成了年轻且旧的代,可帮助保持引用的 Java 对象和其他应用程序数据在内存中。GC 进程从无法访问的对象回收空间,在ng generation 内存池中运行更频繁。 当 Data Grid 将缓存条目存储在 JVM 堆内存中时,GC 运行会在开始将数据添加到缓存时完成。因为 GC 是一个密集型过程,所以较长且更频繁的运行可能会降低应用程序的性能。 off-heap 内存
off-heap 内存是 JVM 内存管理之外的本地可用内存。
JVM 内存空间
图显示包含类元数据的
5.5.1. 非堆数据存储
当您向非堆缓存添加条目时,Data Grid 会动态地分配原生内存到数据。
数据网格将每个密钥的序列化
数据一致性
数据网格使用一组锁定来保护非堆地址空间。锁定数量是两倍的内核数,然后舍入到两个最接近的幂数。这样可确保即使是
5.5.2. 配置非堆内存
配置 Data Grid,将缓存条目存储在 JVM 堆空间之外的原生内存中。
打开 Data Grid 配置进行编辑。
将
off-heap 存储数据网格以字节为单位存储缓存条目。当数据容器有 100 个条目且数据网格获得创建新条目的请求时,会发生驱除: <replicated-cache> <memory storage="OFF_HEAP" max-count="500"/> </replicated-cache>"replicated-cache" : { "memory" : { "storage" : "OBJECT", "max-count" : "500"
replicatedCache: memory: storage: "OFF_HEAP" maxCount: "500" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.memory().storage(StorageType.OFF_HEAP).maxCount(500);Data Grid 配置模式参考 org.infinispan.configuration.cache.MemoryConfigurationBuilder 第 6 章 配置持久性存储数据网格使用缓存存储和加载程序与持久性存储交互。
6.1. 激ivation
传递将数据网格配置为在从内存中驱除这些条目时将条目写入缓存存储。通过这种方式,传递可确保仅维护某一条目的单一副本、内存中或缓存存储中的单个副本,这样可以防止不必要的且可能代价被写入持久性存储。
当试图访问 passivated 条目时,激活是指从缓存存储中恢复条目的过程。因此,当您启用通过时,您必须配置实施
6.1.1. 激ivation 如何工作禁用传递 写入内存中的数据会导致写入持久性存储。 如果 Data Grid 从内存驱除数据,则持久性存储中的数据包括从内存中驱除的条目。这样,持久性存储是内存缓存的超集。 如果您没有配置驱除,则持久存储中的数据提供了内存中的数据副本。 只有当数据从内存中驱除数据时,Data Grid 才会将数据添加到持久性存储中。 当 Data Grid 激活条目时,它会在内存中恢复数据并从持久性存储中删除数据。这样,持久存储形式的内存和数据都是整个数据集的单独子集,在两者之间没有交集。 在使用共享缓存存储时,持久性存储中的条目可能会过时。这是因为,Data Grid 在激活时不会从共享缓存存储中删除 passivated 条目。 值会更新在内存中,但之前传递的条目会停留在带有过期值的持久性存储中。 下表显示了一系列操作后内存和持久性存储中的数据:
6.2. 直写缓存存储
直写(write-through)是一种缓存写入模式,可同步写入缓存存储并写入缓存存储。当客户端应用程序更新缓存条目时,在大多数情况下,通过调用
<distributed-cache> <persistence passivation="false"> <file-store fetch-state="true"> <index path="path/to/index" /> <data path="path/to/data" /> </file-store> </persistence> </distributed-cache> 6.3. write-behind 缓存存储
write-behind 是一个缓存写模式,对内存的写入是同步的,对缓存存储的写入操作是异步的。
当客户端发送写入请求时,Data Grid 将这些操作添加到修改队列。数据网格处理操作,因为它们加入队列,使调用线程不会被阻止,操作会立即完成。
如果修改队列中的写入操作数量超过队列的大小,Data Grid 会将这些附加操作添加到队列中。但是,这些操作在队列中的 Data Grid 进程操作之前不会完成。
例如,调用
write-behind 配置XML
<distributed-cache> <persistence> <table-jdbc-store xmlns="urn:infinispan:config:store:sql:13.0" dialect="H2" shared="true" table-name="books"> <connection-pool connection-url="jdbc:h2:mem:infinispan" username="sa" password="changeme" driver="org.h2.Driver"/> <write-behind modification-queue-size="2048" fail-silently="true"/> </table-jdbc-store> </persistence> </distributed-cache>"distributed-cache": { "persistence" : { "table-jdbc-store": { "dialect": "H2", "shared": "true", "table-name": "books", "connection-pool": { "connection-url": "jdbc:h2:mem:infinispan", "driver": "org.h2.Driver", "username": "sa", "password": "changeme" "write-behind" : { "modification-queue-size" : "2048", "fail-silently" : true
distributedCache: persistence: tableJdbcStore: dialect: "H2" shared: "true" tableName: "books" connectionPool: connectionUrl: "jdbc:h2:mem:infinispan" driver: "org.h2.Driver" username: "sa" password: "changeme" writeBehind: modificationQueueSize: "2048" failSilently: "true" ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.persistence() .async() .modificationQueueSize(2048) .failSilently(true);write-behind 配置包含一个故障切换参数,用于控制缓存存储不可用或修改队列已满时所发生的情况。
如果
fail-silently="true"
,Data Grid logs WARN 消息和拒绝写入操作。
如果
fail-silently="false"
,当数据网格检测到缓存存储在写入操作期间不可用时,数据网格会抛出异常。同样,如果修改队列已满,Data Grid 会抛出异常。
在某些情况下,如果数据网格重启并在修改队列中存在写入操作,则可能发生数据丢失。例如,缓存存储离线,但在检测到缓存存储不可用时,写入操作会添加到修改队列中,因为它没有满。如果 Data Grid 在缓存存储恢复在线前重启或者不可用,修改队列中的写入操作将会丢失,因为它们不会被保留。
6.4. 分段缓存存储
缓存存储可将数据整理到哪些键映射中。
片段存储提高了批量操作的读取性能;例如,流处理数据(
6.5. 共享缓存存储
数据网格缓存可以本地存储到指定节点,也可以在集群中的所有节点间共享。默认情况下,缓存存储为本地的(
本地缓存存储
<persistence> <store shared="false" fetch-state="true" purge="true"/> </persistence> 共享缓存存储
<persistence> <store shared="true" fetch-state="false" purge="false"/> </persistence>Data Grid 配置 Schema 6.6. 使用持久缓存存储的事务
数据网格仅支持使用基于 JDBC 的缓存存储进行事务操作。要将缓存配置为事务性,您需要设置
6.7. 全球持久性位置
数据网格保留全局状态,以便它可以在重启后恢复集群拓扑和缓存的数据。
Data Grid Server 将集群状态保存到
ISPN000558: "The store location 'foo' is not a child of the global persistent location 'bar'" 6.7.1. 配置全局持久位置
启用并配置数据网格为集群嵌入式缓存存储全局状态的位置。
数据网格服务器支持全局持久性并配置默认位置。您不应该禁用全局持久性,或更改远程缓存的默认配置。
将 Data Grid 添加到您的项目。
使用以下方法之一启用全局状态:
将
|
![]() |
不要命的汉堡包 · WebView全面解析 1 月前 |
![]() |
光明磊落的卤蛋 · Nubank | CNCF 2 月前 |
![]() |
伤情的创口贴 · 王传福力挺的智驾独角兽冲刺IPO 5 月前 |
![]() |
绅士的大白菜 · 全球经济持续复苏,但道路坎坷不平 5 月前 |