24.3. Infinispan
24.3.1. 关于 Infinispan
Infinispan 是 Java 数据网格平台,提供 Jakarta Persistence 2.2兼容的缓存接口,用于管理缓存的数据。
有关 Infinispan 功能和配置选项的更多信息,请参阅 Infinispan 文档。
infinispan
子系统提供对 JBoss EAP 的缓存支持。它允许您配置和查看指定缓存容器和缓存的运行时指标。
在使用提供高可用性功能的配置时,如受管域中的 ha 或 full-ha 配置文件,或者 standalone-ha.xml
或 standalone-full-ha.xml
配置文件,in finispan
子系统提供缓存、状态复制和状态分布支持。在非高可用性配置中,in finispan
子系统提供本地缓存支持。
Infinispan 是 JBoss EAP 7.4 中的公共模块。您可以使用应用程序的 infinispan
子系统来创建和使用新的 cache-containers 或缓存。另外,应用程序支持使用 Infinispan API。
24.3.2. 缓存容器
缓存容器是子系统使用的缓存存储库。每个缓存容器定义要使用的默认缓存。
JBoss EAP 7 定义以下默认 Infinispan 缓存容器:
-
用于单例缓存
的服务器
-
Web
会话集群 -
用于
有
状态会话 Bean 集群的 EJB -
用于实体
缓存的 Hibernate
示例:默认 Infinispan 配置
<subsystem xmlns="urn:jboss:domain:infinispan:7.0"> <cache-container name="server" aliases="singleton cluster" default-cache="default" module="org.wildfly.clustering.server"> <transport lock-timeout="60000"/> <replicated-cache name="default"> <transaction mode="BATCH"/> </replicated-cache> </cache-container> <cache-container name="web" default-cache="dist" module="org.wildfly.clustering.web.infinispan"> <transport lock-timeout="60000"/> <distributed-cache name="dist"> <locking isolation="REPEATABLE_READ"/> <transaction mode="BATCH"/> <file-store/> </distributed-cache> </cache-container> <cache-container name="ejb" aliases="sfsb" default-cache="dist" module="org.wildfly.clustering.ejb.infinispan"> <transport lock-timeout="60000"/> <distributed-cache name="dist"> <locking isolation="REPEATABLE_READ"/> <transaction mode="BATCH"/> <file-store/> </distributed-cache> </cache-container> <cache-container name="hibernate" default-cache="local-query" module="org.hibernate.infinispan"> <transport lock-timeout="60000"/> <local-cache name="local-query"> <object-memory size="1000"/> <expiration max-idle="100000"/> </local-cache> <invalidation-cache name="entity"> <transaction mode="NON_XA"/> <object-memory size="1000"/> <expiration max-idle="100000"/> </invalidation-cache> <replicated-cache name="timestamps" mode="ASYNC"/> </cache-container> </subsystem>
注意每个缓存容器中定义的默认缓存。例如,Web
缓存容器将 dist
分布式缓存定义为默认值。因此,集群 Web 会话时将使用 dist
缓存。
如需有关更改默认 缓存并添加额外缓存的信息,请参阅配置缓存容器。
24.3.2.1. 配置缓存容器
可以使用管理控制台或管理 CLI 配置缓存容器和缓存属性。
您应该避免更改缓存或缓存容器名称,因为配置中的其他组件可能会引用它们。
24.3.2.1.1. 使用管理控制台配置缓存
从管理控制台中的 Configuration 选项卡导航到 Infinispan 子系统后,您可以配置缓存和缓存容器。在受管域中,确保选择要配置的适当配置文件。
添加缓存容器。
单击 Cache Container 标题旁边的 Add(+)按钮,选择 Add Cache Container,然后输入新缓存容器的设置。
更新缓存容器设置。
选择适当的缓存容器,再单击 View。根据需要配置缓存容器设置。
更新缓存容器传输设置。
选择适当的缓存容器,再单击 View。选择 传输 选项卡,并根据需要配置缓存容器传输设置。
配置缓存.
选择适当的缓存容器,再单击 View。例如,从相应的缓存选项卡中, 您可以添加、更新和删除缓存。
24.3.2.1.2. 使用管理 CLI 配置缓存
您可以使用管理 CLI 配置缓存和缓存容器。在受管域中,您必须通过 /profile=PROFILE_NAME
在前面指定要更新的配置集。
添加缓存容器。
/subsystem=infinispan/cache-container=CACHE_CONTAINER:add
添加复制的缓存.
/subsystem=infinispan/cache-container=CACHE_CONTAINER/replicated-cache=CACHE:add(mode=MODE)
设置缓存容器的默认缓存。
/subsystem=infinispan/cache-container=CACHE_CONTAINER:write-attribute(name=default-cache,value=CACHE)
为复制的缓存配置批处理。
/subsystem=infinispan/cache-container=CACHE_CONTAINER/replicated-cache=CACHE/component=transaction:write-attribute(name=mode,value=BATCH)
以下示例演示了如何将 并发
分布式缓存添加到 Web
缓存容器中。此缓存配置可以减轻默认缓存的锁定限制,允许多个并发请求同时访问同一 Web 会话。它允许无锁定读和获得专用锁定的频率更高,但时间较长。
使用以下管理 CLI 命令,将 并发
分布式缓存添加到 web
缓存容器中,并使其成为默认缓存:
batch /subsystem=infinispan/cache-container=web/distributed-cache=concurrent:add /subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=concurrent) /subsystem=infinispan/cache-container=web/distributed-cache=concurrent/store=file:add run-batch
这会导致以下服务器配置:
<cache-container name="web" default-cache="concurrent" module="org.wildfly.clustering.web.infinispan"> ... <distributed-cache name="concurrent"> <file-store/> </distributed-cache> </cache-container>
24.3.2.1.3. 更改默认的 Jakarta Enterprise Beans 缓存容器
您可以在 ejb3
子系统中使用缓存容器,如下所述:
-
要支持通过 Jakarta Enterprise Beans 会话 beans,您可以使用
infinispan
子系统中定义的ejb
缓存容器来存储会话。 - 对于连接到服务器上集群部署的远程 Jakarta Enterprise Beans 客户端,您必须向这些客户端提供集群拓扑信息,以便在它们与 交互的节点出现故障时,它们可以切换到集群中的其他节点。
如果要更改或重命名名为 ejb
的默认缓存容器(支持传递和调配拓扑信息),您必须将 cache-container
属性添加到 passivation-stores
元素中,并将 cluster
属性添加到 远程
元素中,如下例所示:如果您只是添加新的缓存供您自己的使用,则不需要进行这些更改。
<subsystem xmlns="urn:jboss:domain:ejb3:5.0"> <passivation-stores> <passivation-store name="infinispan" cache-container="ejb-cltest" max-size="10000"/> </passivation-stores> <remote cluster="ejb-cltest" connectors="http-remoting-connector" thread-pool-name="default"/> </subsystem> <subsystem xmlns="urn:jboss:domain:infinispan:7.0"> ... <cache-container name="ejb-cltest" aliases="sfsb" default-cache="dist" module="org.wildfly.clustering.ejb.infinispan"> </subsystem>
24.3.2.1.4. 将 Infinispan 子系统的资源注入 Jakarta EE 应用
您可以使用 @Resource
注释,将 Infinispan 资源(如缓存)注入到应用中。以下示例显示了使用 @Resource
注释将缓存注入 Jakarta EE 应用程序:
@Resource(lookup = "java:jboss/infinispan/cache/foo/bar") private org.infinispan.Cache<Integer, Object> cache;
在上例中,foo
是缓存容器的名称,bar
是要注入的缓存的名称。
EAP 管理注入的资源的生命周期,这意味着您的应用不需要管理这些资源,如缓存或缓存管理器。
在手动创建任何资源时,您的应用将管理这些资源,而不是 EAP。
以下示例演示了如何将来自 Infinispan 子系统的不同资源注入到您的应用中。
注入默认缓存的示例
要将 cache 容器的默认缓存注入应用程序,请使用以下命令:
@Resource(lookup = "java:jboss/infinispan/cache/foo/default")
注入嵌入式缓存管理器的示例
要注入嵌入的缓存管理器,以便应用程序创建新的缓存配置和缓存,请使用以下命令:
@Resource(lookup = "java:jboss/infinispan/container/foo") private org.infinispan.manager.EmbeddedCacheManager manager;
注入缓存配置示例
除非应用程序明确依赖于这些缓存配置,否则 Infinispan 子系统中定义的任何缓存配置都不会被安装或可用。要将 Infinispan 子系统的缓存配置注入应用,请使用 @Resource
注释。
以下示例使用
@Resource
注释来注入foo
容器的缓存配置:@Resource(lookup = "java:jboss/infinispan/configuration/foo/bar") private org.infinispan.config.Configuration config;
以下示例使用
@Resource
注释来注入foo
容器的默认缓存配置:@Resource(lookup = "java:jboss/infinispan/configuration/foo/default") private org.infinispan.config.Configuration config;
24.3.2.1.5. Hibernate 缓存容器中的驱除功能
hibernate
缓存容器的驱除功能会从内存中移除缓存条目。此功能有助于减少子系统的内存负载。
size
属性设置在缓存条目驱除开始前存储的最大缓存条目数。
示例:驱除功能
<cache-container name="hibernate" default-cache="local-query" module="org.hibernate.infinispan"> <transport lock-timeout="60000"/> <local-cache name="local-query"> <object-memory size="1000"/> <expiration max-idle="100000"/>
请注意,驱除只在内存中发生。缓存存储包含被驱除的缓存条目,以防止永久丢失信息。有关驱除功能的更多信息,请参阅 Infinispan 用户指南中的 驱除和数据容器部分。
24.3.2.1.6. Hibernate 缓存容器中的过期功能
hibernate
缓存容器的过期功能是一个集群操作;因此,使用集群缓存时,已过期的缓存条目会从所有群集成员中删除。如需更多信息,请参阅 Infinispan 用户指南中的 Expiration 部分。
24.3.3. 集群模式
可以使用 Infinispan 以两种不同的方式在 JBoss EAP 中配置集群。应用程序的最佳方法将取决于您的要求。每种模式的可用性、一致性、可靠性和可扩展性之间有一个权衡。在选择群集模式之前,您必须确定网络最重要的功能,并平衡这些要求。
缓存模式
- 复制
- 复制模式会自动检测并添加新实例。对这些实例所做的更改将复制到群集上的所有节点。复制模式通常最适合在小型集群中工作,因为需要通过网络复制大量信息。Infinispan 可以配置为使用 UDP 多播,从而将网络流量拥塞减少到某种程度。
- 分发
分发模式允许 Infinispan 线性扩展群集。分发模式使用一致的哈希算法来确定新节点的放置位置。要保留的信息的副本数或所有者是可配置的。在保留的副本数、数据的持久性和性能之间有一个权衡。所保留的副本越多,对性能的影响越高,但在服务器故障中丢失数据的可能性就越少。哈希算法也致力于通过查找不多播或存储元数据的条目来减少网络流量。
当集群大小超过 6-8 节点时,您应该考虑将分发模式视为缓存策略。使用分发模式时,数据仅分发到集群中的一个节点子集,而不是所有节点。
- 分散
分散模式类似于分发模式,因为它使用一致的哈希算法来确定所有权。但是,所有权仅限于两个成员,或原始器或接收给定会话请求的节点,始终假定所有权用于协调锁定和缓存条目更新。以分散模式使用的缓存写入算法确保写入操作仅产生单个 RPC 调用,其中具有两个所有者的分发缓存通常可以使用两个 RPC 调用。这对分布式 Web 会话非常有用,因为负载平衡器故障转移往往会将流量定向到非主要所有者,甚至备份节点。这可以在集群拓扑更改后减少争用并提高性能。
分散模式不支持事务或 L1 缓存。但是,它确实支持错误的读取,允许发起给定条目的缓存写入的节点继续在某些持续时间内为该条目执行读取服务,即使它不是根据一致的哈希的所有者。其效果类似于 L1 缓存,尽管冲突读取的配置属性和 L1 缓存的配置属性不同。
同步和异步复制
复制可以采用同步或异步模式执行,所选的模式则取决于您的要求和应用。
从 JBoss EAP 7.1 开始,您必须使用同步(SYNC
)缓存模式进行会话复制。SYNC
也是默认的缓存模式。有关会话复制和适当的缓存模式的更多信息,请参阅 如何为 EAP 配置和调整会话复制。
- 同步复制
- 通过同步复制,复制过程在处理用户请求的同一线程中运行。会话复制在完成响应后开始,线程只有在复制完成后才会发布。同步复制对网络流量有影响,因为它需要来自集群中的每个节点的响应。但是,其优点是确保对集群中的所有节点都进行了所有修改。
- 异步复制
- 通过异步复制,Infinispan 使用线程池在后台进行复制。发送方不等待来自集群中其他节点的回复。但是,在上一个复制完成之前,同一会话的缓存读取将阻止,以便不读取陈旧数据。复制会根据时间或队列大小触发。失败的复制尝试写入日志,而不是实时通知。
24.3.3.1. 配置缓存模式
您可以使用管理 CLI 更改默认缓存。
本节显示与配置 Web 会话缓存相关的说明,它默认为分发模式。可以轻松调整步骤和管理 CLI 命令,以应用到其他缓存容器。
进入 Replication Cache 模式
Web 会话缓存的默认 JBoss EAP 7 配置不包括 复制
缓存。必须先添加此缓存。
以下管理 CLI 命令用于单机服务器。在受管域中运行时,您必须通过 /profile =infinispan 命令并使用
指定要更新的配置集。
/profile=
PROFILE_NAME
添加
复制
缓存并将其设置为默认缓存。batch /subsystem=infinispan/cache-container=web/replicated-cache=repl:add() /subsystem=infinispan/cache-container=web/replicated-cache=repl/component=transaction:add(mode=BATCH) /subsystem=infinispan/cache-container=web/replicated-cache=repl/component=locking:add(isolation=REPEATABLE_READ) /subsystem=infinispan/cache-container=web/replicated-cache=repl/store=file:add /subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=repl) run-batch
重新加载服务器:
reload
进入发布缓存模式
Web 会话缓存的默认 JBoss EAP 7 配置已包含 离散分发
缓存。
以下管理 CLI 命令用于单机服务器。在受管域中运行时,您必须通过 /profile =infinispan 命令并使用
指定要更新的配置集。
/profile=
PROFILE_NAME
将默认缓存更改为
dist
分发缓存。/subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=dist)
设置分发缓存的所有者数量。以下命令设置
5
所有者:默认值为2
。/subsystem=infinispan/cache-container=web/distributed-cache=dist:write-attribute(name=owners,value=5)
重新加载服务器:
reload
进入 Scattered Cache 模式
Web 会话缓存的默认 JBoss EAP 配置不包括 分布式缓存
。以下示例显示了管理 CLI 命令,以添加分散的缓存并将其设置为默认缓存。
以下管理 CLI 命令适用于使用 HA 配置文件的单机服务器:在受管域中运行时,您必须通过 /profile =infinispan 命令并使用
指定要更新的配置集。
/profile=
PROFILE_NAME
创建分散的缓存,读取寿命等于默认的 web 会话超时值 30 分钟。
/subsystem=infinispan/cache-container=web/scattered-cache=scattered:add(bias-lifespan=1800000)
将
分散
设置为默认缓存。/subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=scattered)
这将产生以下服务器配置:
<cache-container name="web" default-cache="scattered" module="org.wildfly.clustering.web.infinispan"> ... <scattered-cache name="scattered" bias-lifespan="1800000"/> ... </cache-container>
24.3.3.2. 缓存策略性能
使用 SYNC
缓存策略时,复制的成本很容易在响应时间进行测量和直接可见,因为请求在复制完成后才会完成。
尽管 ASYNC
缓存策略的响应时间应该比 SYNC
缓存策略要低,但这只在适当的条件下才会发生。ASYNC
缓存策略更难测量,但当请求之间的持续时间足够长 时
,它可以提供更好的性能,让缓存操作能够完成。这是因为在响应时间没有立即看到复制成本。
如果对同一会话的请求速度过快,则上一个请求的复制成本将转移到后续请求的前面,因为它必须等待上一个请求中的复制完成。对于在收到响应后立即发送后续请求的快速触发请求,ASY NC
缓存策略将比 SYNC
缓存策略更差。因此,同一会话请求之间有一个阈值,其中 SYNC
缓存策略实际上比 ASYNC
缓存策略更佳。在现实世界使用情况中,对同一会话的请求通常不会快速连续收到。相反,请求之间通常有几秒钟或以上的时间段。在这种情况下,ASY NC
缓存策略是明智的默认策略,提供最快的响应时间。
24.3.4. 状态传输
状态传输既是基本数据网格,也是群集缓存功能。如果不进行状态传输,数据将会丢失,因为节点会添加到集群或从集群中删除。
State transfer 会根据缓存成员资格的变化调整缓存的内部状态。当节点加入或离开集群时、两个或多个群集分区合并或这些事件组合后,会自动进行这一更改。新启动缓存的初始状态传输成本最为昂贵,因为新缓存必须根据缓存模式接收最大状态量,如下所述。
timeout
属性可用于控制新启动的缓存等待多久才能接收其状态。如果 timeout
属性是一个正数,则缓存将等待接收其所有初始状态,然后才能提供给服务请求。如果状态传输未在指定时间内完成,则默认值为 240000
毫秒,缓存将抛出错误并取消启动。如果 超时
设为 0
,则缓存将立即可用,并在后台操作期间收到初始状态。在初始状态传输完成之前,任何对缓存尚未接收的缓存条目请求都需要从远程节点获取。
可通过以下命令将 timeout
属性设为 0
:
/subsystem=infinispan/cache-container=server/CACHE_TYPE=CACHE/component=state-transfer:write-attribute(name=timeout,value=0)
状态传输行为由缓存模式决定。
- 在复制模式中,新节点加入缓存会从现有节点接收整个缓存状态。当节点离开集群时,没有状态转移。
-
在分发模式中,新节点仅从现有节点接收状态的一部分,而现有节点则移除了其中一些状态,以便在缓存中保留每个密钥
的所有者
副本,具体通过一致的散列来确定。当节点离开集群时,分发缓存需要创建该节点上存储的密钥的额外副本,以便每个密钥的所有者继续存在。 - 在无效模式中,初始状态传输与复制模式类似,唯一的区别在于无法保证节点具有相同的状态。当节点离开集群时,没有状态转移。
状态传输默认同时传输内存中和持久状态,但可以在配置中禁用这两者。禁用状态传输时,必须配置 ClusterLoader
,否则节点将成为密钥的所有者或备份所有者,而无需将数据加载到其缓存中。另外,如果以分布模式禁用状态传输,则密钥偶尔会比缓存中 的所有者
副本少。
24.3.5. 配置 Infinispan 线程池
infinispan
子系统包含 async-operations
、过期
、侦听器
、持久性
、remote-command
、state-transfer
和 传输
线程池。可以为任何 Infinispan 缓存容器配置这些池。
下表列出了您可以为 infinispan
子系统中的每个线程池配置的属性和每个线程的默认值:
线程池名称 | keepalive-time | max-threads | Min-threads | queue-length |
---|---|---|---|---|
async-operations | 60000L | 25 | 25 | 1000 |
过期 | 60000L | 1 | N/A | N/A |
监听程序 | 60000L | 1 | 1 | 100000 |
持久性 | 60000L | 4 | 1 | 0 |
remote-command | 60000L | 200 | 1 | 0 |
state-transfer | 60000L | 60 | 1 | 0 |
传输 | 60000L | 25 | 25 | 100000 |
使用以下语法,通过管理 CLI 配置 Infinispan 线程池:
/subsystem=infinispan/cache-container=CACHE_CONTAINER_NAME/thread-pool=THREAD_POOL_NAME:write-attribute(name=ATTRIBUTE_NAME, value=ATTRIBUTE_VALUE)
以下是管理 CLI 命令的示例,可将 服务器
缓存容器的 persistence
线程池中的 max-threads
值设置为 10
:
/subsystem=infinispan/cache-container=server/thread-pool=persistence:write-attribute(name="max-threads", value="10")
24.3.6. Infinispan Statistics
可以启用有关 Infinispan 缓存和缓存容器的运行时统计信息,用于监控目的。出于性能原因,默认情况下不启用统计数据集合。
可以为每个缓存容器、缓存或两者启用统计信息集合。每个缓存的 statistics 选项将覆盖缓存容器的 选项。为缓存容器启用或禁用统计集合将导致该容器中的所有缓存都继承该设置,除非它们明确指定自己的设置。
24.3.6.1. 启用 Infinispan Statistics
启用 Infinispan 统计数据可能会对 infinispan
子系统的性能造成负面影响。只有在需要时才应启用统计数据。
您可以使用管理控制台或管理 CLI 来启用或禁用 Infinispan 统计数据的集合。从管理控制台,从 Configuration 选项卡导航到 Infinispan 子系统,选择相应的缓存或缓存容器,然后编辑 Statistics Enabled 属性。使用下列命令,通过管理 CLI 启用统计信息:
为缓存容器启用统计信息集合。需要重新加载服务器。
/subsystem=infinispan/cache-container=CACHE_CONTAINER:write-attribute(name=statistics-enabled,value=true)
为缓存启用统计信息集合。需要重新加载服务器。
/subsystem=infinispan/cache-container=CACHE_CONTAINER/CACHE_TYPE=CACHE:write-attribute(name=statistics-enabled,value=true)
您可以使用以下命令取消定义缓存的启用了 statistics-enabled
属性,以便它继承缓存容器的 statistics-enabled
属性的设置。
/subsystem=infinispan/cache-container=CACHE_CONTAINER/CACHE_TYPE=CACHE:undefine-attribute(name=statistics-enabled)
24.3.7. Infinispan 分区处理
Infinispan 集群 构建自存储数据的多个节点。为防止在多个节点失败时数据丢失,Infinispan 会在多个节点上复制相同的数据。这种级别的数据冗余使用 owners
属性来配置。只要少于配置的节点数同时崩溃,Infinispan 将具有可用数据的副本。
但是,当集群中太多节点消失时,可能会发生一些灾难性情况:
- 脑裂
这会将集群分成两个或者多个分区(独立运行)的子集群。在这些情况下,多个客户端从不同分区进行读写时看到同一缓存条目的不同版本,在许多应用程序中存在问题。
注意有办法减少脑裂发生的可能性,如冗余网络或 IP 绑定 ;但是,这只缩短了问题的发生时间。
- 多个节点按顺序崩溃
- 如果多个节点(特别是所有者数量)崩溃,且 Infinispan 没有时间正确地在崩溃间重新平衡其状态,则结果为部分数据丢失。
目标是避免因为脑裂或多个节点快速崩溃而导致数据返回给用户的情况。
24.3.7.1. split Brain
在脑裂情况下,每个网络分区都会安装自己的 JGroups 视图,从其他分区中删除节点。我们无法直接确定集群是否已分割为两个或者多个分区,因为这些分区相互不知道。相反,我们假设群集会在 JGroups 群集中的一个或多个节点消失而未发送显式离开消息时进行拆分。
禁用分区处理后,每个这样的分区将继续作为独立集群运行。每个分区可能只看到数据的某一部分,每个分区可能会在缓存中写入冲突的更新。
启用分区处理时,如果检测到分割,每个分区不会立即启动重新平衡,而是首先检查它是否应该进入降级模式:
- 如果至少有一个部分丢失了其所有所有者,这意味着自上一次重新平衡结束以来,至少指定的所有者数量已经保留,则分区将进入降级模式。
- 如果分区没有在 最新的稳定拓扑 中包含简单大多数节点(floor(numNodes/2)+ 1),则分区也会进入降级模式。
- 否则,分区会保持正常运行,并启动重新平衡。
每次重新平衡操作结束时都会更新 稳定拓扑,协调者决定不需要再进行重新平衡。这些规则可确保,最多一个分区保持可用模式,其他分区进入降级模式。
当分区处于降级模式时,它只允许访问完全拥有的密钥:
- 此分区的节点上具有所有副本的条目的请求(读取和写入)将被满足。
-
对部分或完全归已消失的节点拥有的条目的请求将通过
AvailabilityException
拒绝。
这可保证分区无法为同一密钥写入不同的值(缓存是一致的),并且一个分区无法读取已在其他分区中更新的密钥(无过时数据)。
两个分区可以启动隔离,只要它们不合并,就可以读取和写入不一致的数据。在未来,我们可能允许自定义可用性策略(例如,检查某个节点是否属于群集,或检查是否可以访问外部计算机)来应对这种情况。
24.3.7.2. 配置分区处理
目前分区处理被默认禁用。使用以下管理 CLI 命令启用分区处理:
/subsystem=infinispan/cache-container=web/distributed-cache=dist/component=partition-handling:write-attribute(name=enabled, value=true)
24.3.8. 配置远程缓存容器
您必须为受管域中的每一服务器组配置远程缓存。您可以使用启用了 statistics 的属性为给定 remote-cache-container
和关联的运行时缓存 启用
指标集合。
24.3.8.1. 创建远程缓存容器
受管域中的每一服务器组需要一个唯一的远程缓存。缓存可属于同一数据网格。因此,用户必须通过为服务器组定义套接字绑定并将套接字绑定与远程缓存容器关联,为每个服务器组配置远程缓存。
流程
定义一个
套接字绑定
,根据需要在集群中的每个远程红帽数据网格实例重复 命令。/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=SOCKET_BINDING:add(host=HOSTNAME,port=PORT)
定义一个
remote-cache-container
,以引用新创建的套接字绑定。batch /subsystem=infinispan/remote-cache-container=CACHE_CONTAINER:add(default-remote-cluster=data-grid-cluster) /subsystem=infinispan/remote-cache-container=CACHE_CONTAINER/remote-cluster=data-grid-cluster:add(socket-bindings=[SOCKET_BINDING,SOCKET_BINDING_2,...]) run-batch
24.3.8.2. 为远程缓存容器启用统计信息
启用 statistics-enabled
属性可为给定的 remote-cache-container
和关联的运行时缓存启用指标集合。
-
对于名为"foo"的
remote-cache-container
,请使用以下操作启用统计信息:
/subsystem=infinispan/remote-cache-container=foo:write-attribute(name=statistics-enabled, value=true)
-
对于
remote-cache-container
"foo",在运行时可以看到以下指标:
/subsystem=infinispan/remote-cache-container=foo:read-attribute(name=connections) /subsystem=infinispan/remote-cache-container=foo:read-attribute(name=active-connections) /subsystem=infinispan/remote-cache-container=foo:read-attribute(name=idle-connections)
-
对于这些指标的描述,请对
remote-cache-container 执行 read-resource-
description 操作:
/subsystem=infinispan/remote-cache-container=foo:read-resource-description
- 以下指标特定于所选部署使用的远程缓存:
/subsystem=infinispan/remote-cache-container=foo/remote-cache=bar.war:read-resource(include-runtime=true, recursive=true) { "average-read-time" : 1, "average-remove-time" : 0, "average-write-time" : 2, "hits" : 9, "misses" : 0, "near-cache-hits" : 7, "near-cache-invalidations" : 8, "near-cache-misses" : 9, "near-cache-size" : 1, "removes" : 0, "time-since-reset" : 82344, "writes" : 8 }
- 如需这些指标的描述,请对远程缓存执行 read-resource-description 操作:
/subsystem=infinispan/remote-cache-container=foo/remote-cache=bar.war:read-resource-description
- 其中一些指标是计算的值(如 average-*),另一些则被截断,如命中和未命中。通过以下操作可以重置 tallied 指标:
/subsystem=infinispan/remote-cache-container=foo/remote-cache=bar.war:reset-statistics()
24.3.9. 将 HTTP 会话外部化到红帽数据网格
您需要红帽数据网格订阅才能使用此功能。
红帽数据网格可用作 JBoss EAP 中应用特定数据的外部缓存容器,如 HTTP 会话。这允许扩展独立于应用的数据层,并使可能驻留于不同域中的不同 JBoss EAP 集群能够访问同一红帽数据网格集群的数据。此外,其他应用程序还可与红帽数据网格提供的缓存相连接。
下例演示了如何使 HTTP 会话外部化。它适用于 JBoss EAP 和受管域的单机实例。
-
创建
remote-cache-container
。如需更多信息,请参阅配置远程缓存容器。 配置 HotRod 存储.HotRod 存储将专用远程缓存用于 JBoss EAP 服务器创建的每个缓存。通常,JBoss EAP 服务器上使用一个无效缓存,如下 CLI 脚本中所示。
注意远程缓存需要在红帽数据网格服务器上手动配置。建议对这些缓存进行配置,是带有保守锁定的事务分发模式缓存。缓存名称必须与
test.war
等部署文件名对应。配置了远程缓存容器后,可以配置热门
存储
来取代任何现有的存储。以下 CLI 脚本演示了与无效缓存结合使用会话的典型用例:batch /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME:add() /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME/store=hotrod:add(remote-cache-container=CACHE_CONTAINER,fetch-state=false,purge=false,passivation=false,shared=true) /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME/component=transaction:add(mode=BATCH) /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME/component=locking:add(isolation=REPEATABLE_READ) /subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=CACHE_NAME) run-batch
该脚本配置一个新的无效缓存。然后,会话数据被保留在缓存中以获得性能并写入存储以获得弹性。
可以使用
@Resource
注释将 HotRod 客户端直接注入到 Jakarta EE 应用中。在下例中,@Resource
注释在hotrod-client.properties
文件中查找类路径中的配置属性。@Resource(lookup = "java:jboss/infinispan/remote-container/web-sessions") private org.infinispan.client.hotrod.RemoteCacheContainer client;
示例:
hotrod-client.properties
文件infinispan.client.hotrod.transport_factory = org.infinispan.client.hotrod.impl.transport.tcp.TcpTransportFactory infinispan.client.hotrod.server_list = 127.0.0.1:11222 infinispan.client.hotrod.marshaller = org.infinispan.commons.marshall.jboss.GenericJBossMarshaller infinispan.client.hotrod.async_executor_factory = org.infinispan.client.hotrod.impl.async.DefaultAsyncExecutorFactory infinispan.client.hotrod.default_executor_factory.pool_size = 1 infinispan.client.hotrod.default_executor_factory.queue_size = 10000 infinispan.client.hotrod.hash_function_impl.1 = org.infinispan.client.hotrod.impl.consistenthash.ConsistentHashV1 infinispan.client.hotrod.tcp_no_delay = true infinispan.client.hotrod.ping_on_startup = true infinispan.client.hotrod.request_balancing_strategy = org.infinispan.client.hotrod.impl.transport.tcp.RoundRobinBalancingStrategy infinispan.client.hotrod.key_size_estimate = 64 infinispan.client.hotrod.value_size_estimate = 512 infinispan.client.hotrod.force_return_values = false ## below is connection pooling config maxActive=-1 maxTotal = -1 maxIdle = -1 whenExhaustedAction = 1 timeBetweenEvictionRunsMillis=120000 minEvictableIdleTimeMillis=300000 testWhileIdle = true minIdle = 1
保护远程缓存容器
可以使用 SSL 保护与远程红帽数据网格实例的通信。这可以通过在 JBoss EAP 实例 上配置 remote-cache-container
并在红帽数据网格实例上调整 hotrod 连接器以使用活动的安全域来完成。
在 JBoss EAP 中创建
客户端-ssl-context
。有关创建客户端-ssl-context
的更多信息,包括生成其他 elytron 组件,请参阅 如何为 JBoss EAP 配置服务器 安全性中的 客户端-ssl-context。/subsystem=elytron/client-ssl-context=CLIENT_SSL_CONTEXT:add(key-manager=KEY_MANAGER,trust-manager=TRUST_MANAGER)
配置远程缓存容器,以使用客户端 SSL 上下文。
/subsystem=infinispan/remote-cache-container=CACHE_CONTAINER/component=security:write-attribute(name=ssl-context,value=CLIENT_SSL_CONTEXT)
保护远程红帽数据网格实例,并为每个实例重复此操作。
-
将
client-ssl-context
中使用的密钥存储复制到远程红帽数据网格实例。 配置
ApplicationRealm
以使用此密钥存储。/core-service=management/security-realm=ApplicationRealm/server-identity=ssl:add(keystore-path="KEYSTORE_NAME",keystore-relative-to="jboss.server.config.dir",keystore-password="KEYSTORE_PASSWORD")
调整热连接器以指向此安全域。
/subsystem=datagrid-infinispan-endpoint/hotrod-connector=hotrod-connector/encryption=ENCRYPTION:add(require-ssl-client-auth=false,security-realm="ApplicationRealm")
重新载入远程红帽数据网格实例。
reload
-
将
24.3.10. 使用远程存储外部化到红帽数据网格的 HTTP 会话
您需要红帽数据网格订阅才能使用此功能。
此处的说明代表一种使会话外部化的旧方式。JBoss EAP 7.2 引入了基于与 elytron
子系统集成的 HotRod 协议的自定义优化缓存存储。建议您使用新的 热门存储
,如红帽数据网格外部化 HTTP 会话 中所述。
必须为每个 distributable 应用创建一个全新的缓存。它可以在现有的缓存容器中创建,如 web
。
使 HTTP 会话外部化:
通过添加网络信息到
socket-binding-group
,定义远程红帽数据网格服务器的位置。示例:添加远程套接字绑定
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-rhdg-server1:add(host=RHDGHostName1, port=11222) /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-rhdg-server2:add(host=RHDGHostName2, port=11222)
生成 XML
<socket-binding-group name="standard-sockets" ... > ... <outbound-socket-binding name="remote-rhdg-server1"> <remote-destination host="RHDGHostName1" port="11222"/> </outbound-socket-binding> <outbound-socket-binding name="remote-rhdg-server2"> <remote-destination host="RHDGHostName2" port="11222"/> </outbound-socket-binding> </socket-binding-group>
注意您需要为每个红帽数据网格服务器配置远程套接字绑定。
确保在 JBoss EAP 的
infinispan
子系统中定义了远程缓存容器;在位于remote-store
元素的cache
属性的示例中,定义远程红帽数据网格服务器上的缓存名称。如果您在受管域中运行,请在这些命令之前使用
/profile=PROFILE_NAME
。示例:添加远程缓存容器
/subsystem=infinispan/cache-container=web/invalidation-cache=rhdg:add(mode=SYNC) /subsystem=infinispan/cache-container=web/invalidation-cache=rhdg/component=locking:write-attribute(name=isolation,value=REPEATABLE_READ) /subsystem=infinispan/cache-container=web/invalidation-cache=rhdg/component=transaction:write-attribute(name=mode,value=BATCH) /subsystem=infinispan/cache-container=web/invalidation-cache=rhdg/store=remote:add(remote-servers=["remote-rhdg-server1","remote-rhdg-server2"], cache=default, socket-timeout=60000, passivation=false, purge=false, shared=true)
生成 XML
<subsystem xmlns="urn:jboss:domain:infinispan:7.0"> ... <cache-container name="web" default-cache="dist" module="org.wildfly.clustering.web.infinispan" statistics-enabled="true"> <transport lock-timeout="60000"/> <invalidation-cache name="rhdg" mode="SYNC"> <locking isolation="REPEATABLE_READ"/> <transaction mode="BATCH"/> <remote-store cache="default" socket-timeout="60000" remote-servers="remote-rhdg-server1 remote-rhdg-server2" passivation="false" purge="false" shared="true"/> </invalidation-cache> ... </cache-container> </subsystem>
将缓存信息添加到应用
jboss-web.xml
文件中。在以下示例中,web是
缓存容器的名称,rhdg
是此容器中相应缓存的名称。示例:
jboss-web.xml
文件<?xml version="1.0" encoding="UTF-8"?> <jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_10_0.xsd" version="10.0"> <replication-config> <replication-granularity>SESSION</replication-granularity> <cache-name>web.rhdg</cache-name> </replication-config> </jboss-web>