22.3. Infinispan


22.3.1. 关于 Infinispan

Infinispan 是一个 Java 数据网格平台,它为管理缓存的数据提供 Jakarta Persistence 2.2兼容缓存接口。

有关 Infinispan 功能和配置选项的更多信息,请参阅 Infinispan 文档

infinispan 子系统为 JBoss EAP 提供缓存支持。它允许您为命名缓存容器和缓存配置和查看运行时指标。

当使用提供高可用性功能的配置时,如受管域中的 hafull-ha 配置文件,或 standalone-ha.xmlstandalone-full-ha.xml 配置文件,infinispan 将提供缓存、状态复制和状态分发支持。在非高可用性配置中,infinispan 子系统提供本地缓存支持。

重要

Infinispan 是 JBoss EAP 8.0 中的公共模块。您可以使用 infinispan 子系统来创建和使用新的 cache-containers 或缓存。另外,应用程序支持使用 Infinispan API。

22.3.2. 缓存容器

缓存容器是子系统使用的缓存的存储库。每个缓存容器都定义了要使用的默认缓存。

JBoss EAP 8.0 定义以下默认的 Infinispan 缓存容器:

  • 服务器 用于单例缓存
  • Web 会话集群的 Web
  • 用于 有状态会话 Bean 集群的 EJB
  • Hibernate 用于实体缓存

示例:默认的 Infinispan 配置

<subsystem xmlns="{InfinispanSubsystemNamespace}">
  <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 缓存。

如需有关更改默认缓存和添加额外的缓存的信息,请参阅配置 缓存容器

22.3.2.1. 配置缓存容器

缓存容器和缓存属性可以使用管理控制台或管理 CLI 配置。

警告

您应该避免更改缓存或缓存容器名称,因为配置中的其他组件可能会引用它们。

22.3.2.1.1. 使用管理控制台配置缓存

从管理控制台中的 Configuration 选项卡导航到 Infinispan 子系统后,即可配置缓存和缓存容器。在受管域中,确保选择要配置的适当配置文件。

  • 添加缓存容器。

    单击 Cache Container 标题旁边的 Add (+)按钮,选择 Add Cache Container,并输入新缓存容器的设置。

  • 更新缓存容器设置。

    选择适当的缓存容器,然后单击 查看。根据需要配置缓存容器设置。

  • 更新缓存容器传输设置。

    选择适当的缓存容器,然后单击 查看。选择 Transport 选项卡,并根据需要配置缓存容器传输设置。

  • 配置缓存。

    选择适当的缓存容器,然后单击 查看。在适当的缓存选项卡中,例如 复制缓存,您可以添加、更新和删除缓存。

22.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)

    这会生成以下服务器配置:

    <cache-container name="web" default-cache="concurrent" module="org.wildfly.clustering.web.infinispan">
      ...
      <distributed-cache name="concurrent">
          <file-store/>
      </distributed-cache>
    </cache-container>
22.3.2.1.3. 更改默认的 Jakarta Enterprise Beans 缓存容器

您可以在 ejb3 子系统中使用缓存容器,如下所述:

  • 为了支持传递 Jakarta Enterprise Beans 会话 Bean,您可以使用 infinispan 子系统中定义的 ejb 缓存容器来存储会话。
  • 对于连接到服务器上集群部署的远程 Jakarta Enterprise Beans 客户端,您必须为这些客户端提供集群拓扑信息,以便在它们交互的节点失败时故障转移到集群中的其他节点。
22.3.2.1.4. 将 Infinispan 子系统的资源注入 Jakarta EE 应用

您可以使用 @Resource 注释,将 Infinispan 子系统中的 Infinispan 资源从 Infinispan 子系统注入到应用中。以下示例显示了使用 @Resource 注释将缓存注入 Jakarta EE 应用:

@Resource(lookup = "java:jboss/infinispan/cache/foo/bar")
private org.infinispan.Cache<Integer, Object> cache;

在上例中,foo 是缓存容器的名称,bar 是要注入的缓存的名称。

EAP 管理注入资源的生命周期,这意味着您的应用不需要管理这些资源,如缓存或缓存管理器。

注意

在手动创建任何资源时,应用会管理这些资源,而不是 EAP。

以下示例演示了如何将 Infinispan 子系统中的不同资源注入到应用中。

注入默认缓存的示例

要将缓存容器的默认缓存从 Infinispan 子系统注入应用程序中,请使用以下命令:

@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;
22.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 用户指南中的 驱除和数据 容器部分。

22.3.2.1.6. Hibernate 缓存容器中的过期功能

hibernate 缓存容器的过期功能是一个集群操作;因此,在使用集群缓存时,将从所有群集成员中删除过期的缓存条目。如需更多信息,请参阅 Infinispan 用户指南中的 Expiration 部分。

22.3.3. 集群模式

可以使用 Infinispan 在 JBoss EAP 中通过两种不同的方式配置集群。应用程序的最佳方法将取决于您的要求。对每个模式的可用性、一致性、可靠性和可扩展性之间存在利弊。在选择集群模式前,您必须确定网络最重要的功能,并平衡这些要求。

缓存模式
复制
复制模式会自动检测并在集群中添加新实例。对这些实例所做的更改将复制到集群中的所有节点。复制模式通常最适合在小集群中,因为需要通过网络复制的信息量。Infinispan 可以配置为使用 UDP 多播,这可将网络流量拥塞到位。
分发

分发模式允许 Infinispan 线性扩展集群。分发模式使用一致的哈希算法来确定应放置新节点的位置。要保留的信息数量或所有者是可配置的。副本数量保持、数据持久性和性能之间有一个权衡。保留更多副本,对性能有更大的影响,但不太可能在服务器失败时丢失数据。哈希算法还可通过查找条目而无多播或存储元数据来减少网络流量。

当集群大小超过 6-8 节点时,您应该考虑将分发模式用作缓存策略。使用分发模式时,数据仅分布到集群中的节点子集,而不是所有节点。

22.3.3.1. 配置缓存模式

您可以使用管理 CLI 更改默认缓存。

注意

本节介绍配置 Web 会话缓存的说明,默认是分发模式。可轻松调整步骤和管理 CLI 命令,以应用到其他缓存容器。

进入复制缓存模式

Web 会话缓存的默认 JBoss EAP 8.0 配置不包括重新复制缓存。必须首先添加此缓存。

注意

以下管理 CLI 命令适用于单机服务器。在受管域中运行时,您必须在 /subsystem=infinispan 命令前使用 /profile=PROFILE_NAME 指定要更新的配置集。

  1. 添加 repl 复制缓存并将其设置为默认缓存。

    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
  2. 重新加载服务器。

    reload
更改到分发缓存模式

Web 会话缓存的默认 JBoss EAP 8.0 配置已包含发行版的分发缓存。

注意

以下管理 CLI 命令适用于单机服务器。在受管域中运行时,您必须在 /subsystem=infinispan 命令前使用 /profile=PROFILE_NAME 指定要更新的配置集。

  1. 将默认缓存更改为 dist 分发缓存。

    /subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=dist)
  2. 设置分发缓存的所有者数。以下命令设置 5 所有者。默认值为 2

    /subsystem=infinispan/cache-container=web/distributed-cache=dist:write-attribute(name=owners,value=5)
  3. 重新加载服务器。

    reload

22.3.3.2. 缓存策略性能

使用 SYNC 缓存策略时,复制成本很容易测量,并直接看到,因为请求在复制完成前不会完成。

虽然 ASYNC 缓存策略应该比 SYNC 缓存策略的响应时间较低,但这只在正确的条件下是 true。ASYNC 缓存策略更难以测量,但当请求之间的持续时间足够长后,它可以比 SYNC 策略提供更好的性能。这是因为复制成本不会立即在响应时间中看到。

如果对同一会话的请求速度太快,则对前一个请求的复制成本会转移到后续请求的前面,因为它必须等待来自上一请求的复制完成。对于在收到响应后立即发送后续请求的快速触发请求,ASYNC 缓存策略将比 SYNC 缓存策略执行更糟糕的情况。因此,同一会话的请求之间有一个阈值,因为 SYNC 缓存策略实际上比 ASYNC 缓存策略更好地执行。在实际使用中,通常不会接收对同一会话的请求。通常,请求之间有几秒或更长时间。在这种情况下,ASYNC 缓存策略是可以接受的默认策略,提供最快的响应时间。

22.3.4. 州传输

State transfer 既是基本的数据网格和集群缓存功能。如果没有状态传输,则当节点添加到集群中或从集群中移除时,数据将会丢失。

State transfer 调整缓存的内部状态,以响应缓存成员资格的更改。当节点加入或离开集群时,当两个或者多个集群分区合并或之后,或这些事件的任意组合后,此更改会自动发生。新启动缓存的初始状态转移最昂贵,因为新缓存必须根据缓存的模式接收最大状态量,如下所述。

timeout 属性可用于控制新启动缓存等待接收其状态的时长。如果 timeout 属性为正数,则缓存将等待接收其所有初始状态,然后再提供给服务请求。如果状态转移没有在指定时间内完成,则默认值为 240000 毫秒,则缓存会抛出错误并取消启动。如果 timeout 设为 0, 则缓存会立即可用,它将在后台操作期间接收其初始状态。在初始状态传输完成前,任何尚未接收缓存的缓存条目请求都将从远程节点获取。

可以使用以下命令将 timeout 属性设置为 0。

/subsystem=infinispan/cache-container=server/CACHE_TYPE=CACHE/component=state-transfer:write-attribute(name=timeout,value=0)

状态传输行为由缓存的模式决定。

  • 在复制模式中,加入缓存的新节点从现有节点接收整个缓存状态。当节点离开集群时,没有状态传输。
  • 在分发模式中,新节点只从现有节点接收状态的一部分,现有节点删除其状态,以便让每个密钥 的所有者 副本保留在缓存中,由一致的哈希决定。当节点离开集群时,分发缓存需要为该节点上存储的密钥进行额外的副本,以便每个密钥的所有者都仍然存在。
  • 在无效模式下,初始状态转移与复制模式类似,节点的唯一差别无法保证具有相同的状态。当节点离开集群时,没有状态传输。

默认情况下,状态传输传输内存和持久状态,但它们可以在配置中禁用。当禁用状态传输时,必须配置 ClusterLoader,否则节点将成为密钥的所有者或备份所有者,而无需将数据加载到其缓存中。另外,如果状态转移在分发模式下被禁用,则密钥偶尔会小于缓存中的 所有者 副本。

22.3.5. 配置 Infinispan 线程池

infinispan 子系统包含 async-operations,expiration,listener,persistence,remote-command,state-transfer, 和 transport 线程池。可以为任何 Infinispan 缓存容器配置这些池。

下表列出了您可以为 infinispan 子系统中的每个线程池配置的属性,以及每个线程池的默认值。

线程池名称keepalive-timemax-threadsmin-threadsqueue-length

async-operations

60000L

25

25

1000

过期

60000L

1

N/A

N/A

listener

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)

以下是在 服务器 缓存容器 的持久性 线程池中将 max-threads 值设置为 10 的示例。

/subsystem=infinispan/cache-container=server/thread-pool=persistence:write-attribute(name="max-threads", value="10")

22.3.6. Infinispan statistics

对于监控目的,可以启用 Infinispan 缓存和缓存容器的运行时统计信息。出于性能的原因,默认情况下不启用统计集合。

可以为每个缓存容器、缓存或两者启用统计数据集合。每个缓存的 statistics 选项会覆盖缓存容器的选项。为缓存容器启用或禁用统计信息集合将导致该容器中的所有缓存继承设置,除非它们明确指定自己的设置。

22.3.6.1. 启用 Infinispan 统计

警告

启用 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)

22.3.7. Infinispan 分区处理

Infinispan 集群 由存储数据的多个节点构建。为防止在多个节点失败时数据丢失,Infinispan 会在多个节点上复制相同的数据。这种级别的数据冗余是使用 owners 属性配置的。只要同时减少配置的节点数量,Infinispan 将具有可用数据的副本。

但是,当节点从集群中消失时,可能会出现潜在的灾难性情况:

脑裂

这会在两个或者多个分区(或子集群)中分割集群,它们独立运行。在这些情况下,多个客户端从不同分区读取和写入,可以看到同一缓存条目的不同版本,而对于许多应用程序来说都有问题。

注意

有可能减少脑裂发生的可能性,如冗余网络或 IP 绑定 ;但是,它们只会减少问题发生的时间窗口。

按顺序导致多个节点崩溃
如果多个节点(特别是所有者数)在快速序列中崩溃,并且 Infinispan 没有时间在崩溃之间正确重新平衡其状态,则结果是部分数据丢失。

目的是避免因为出现脑裂或多个节点崩溃而给用户造成错误数据的情况。

22.3.7.1. 脑裂

在脑裂情形中,每个网络分区将安装自己的 JGroups 视图,从而将节点从其他分区中删除。我们没有直接的方法来确定集群是否被分成两个或者多个分区,因为分区相互不知道。相反,我们假定当一个或多个节点从 JGroups 集群消失而不发送显式离开消息时,我们假定集群已被分割。

禁用分区处理后,每个这样的分区将继续作为独立集群运行。每个分区可能只看到数据的一部分,每个分区都可能会在缓存中写入冲突更新。

启用分区处理后,如果我们检测到分割,每个分区都不会立即启动重新平衡,而是首先检查它是否应该进入降级模式:

  • 如果至少有一个片段丢失了所有所有者,这意味着自上次重新平衡起,至少指定的拥有者数至少保留下来,则分区进入降级状态。
  • 如果分区不包含 最新稳定拓扑 中的简单大多数节点(floor (numNodes/2)+ 1),则分区还会进入 degraded 模式。
  • 否则,分区会保持正常运行,并启动重新平衡。

每次重新平衡操作结束时都会更新 stable 拓扑,协调器决定不需要另一个重新平衡。这些规则确保,一个分区最多处于可用模式,另一个分区进入 degraded 模式。

当分区处于降级模式时,它只允许访问拥有的密钥:

  • 在此分区的节点上具有所有副本的条目的请求(读取和写入)会被遵守。
  • 对部分或全部已消失的节点拥有的请求将被拒绝,并显示 AvailabilityException

这样可保证分区无法为同一密钥写入不同的值(缓存是一致的),而且一个分区无法读取已在其他分区中更新的键(没有过时的数据)。

注意

两个分区可以启动隔离,只要它们没有合并,它们可以读取和写入不一致的数据。以后,我们可能会允许自定义可用性策略(例如,检查某个节点是集群的一部分,或者检查外部机器是否可以访问)可以处理这种情况。

22.3.7.2. 配置分区处理

默认禁用分区处理。当您启用分区处理时,有两个可配置的属性:

属性

when-split

"DENY_READ_WRITES", "ALLOW_READS", "ALLOW_READ_WRITES"

merge-policy

"NONE", "PREFERRED_ALWAYS", "PREFERRED_NON_NULL", "REMOVE_ALL"

配置 when-split,以确定在检测到网络分区时缓存的读写行为。

配置 merge-policy,以确定合并两个网络分区时冲突解析策略策略。

CLI 命令示例:

/subsystem=infinispan/cache-container=web/distributed-cache=dist/component=partition-handling:write-attribute(name=when-split, value=DENY_READ_WRITES)

22.3.7.3. 配置远程缓存容器

您必须为受管域中的每个服务器组配置远程缓存。您可以使用 statistics-enabled 属性为给定 remote-cache-container 和关联的运行时缓存启用一组指标。

22.3.7.3.1. 创建远程缓存容器

受管域中的每个服务器组都需要唯一的远程缓存。缓存可以属于同一数据网格。因此,用户必须通过为服务器组定义套接字绑定并将套接字绑定与远程缓存容器关联,为每个服务器组配置远程缓存。

流程

  1. 定义 socket-binding,根据需要为集群中的每个远程 Red Hat Data Grid 实例重复该命令。

    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=SOCKET_BINDING:add(host=HOSTNAME,port=PORT)
  2. 定义 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
22.3.7.3.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
  • 其中一些指标计算了值(example、average condition),另一些则被处理,如 hits 和 misses。以下操作可重置常规指标:
/subsystem=infinispan/remote-cache-container=foo/remote-cache=bar.war:reset-statistics()

22.3.8. Red Hat Data Grid 外部 HTTP 会话

注意

您需要 Red Hat Data Grid 订阅才能使用此功能。

Red Hat Data Grid 可用作 JBoss EAP 中特定应用程序数据的外部缓存容器,如 HTTP 会话。这允许独立于应用程序扩展数据层,并启用不同的 JBoss EAP 集群(可能位于各种域中),以访问来自同一 Red Hat Data Grid 集群的数据。此外,其他应用程序还可与 Red Hat Data Grid 提供的缓存进行接口。

以下示例演示了如何外部化 HTTP 会话。它适用于 JBoss EAP 和受管域的独立实例。

  1. 创建 remote-cache-container。如需更多信息,请参阅配置远程缓存容器
  2. 配置 HotRod 存储。HotRod 存储为 JBoss EAP 服务器创建的每个缓存使用一个专用远程缓存。通常,JBoss EAP 服务器上会使用一个失效缓存,如以下 CLI 脚本所示。

    注意

    需要在 Red Hat Data Grid 服务器上手动配置远程缓存。推荐的缓存配置是事务分布模式缓存,它带有 pesimistic locking。缓存名称必须与部署文件名对应,如 test.war

    配置远程缓存容器后,可以配置 hotrod 存储来替换任何现有存储。以下 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

    该脚本配置一个新的无效缓存。然后,会话数据在缓存中维护,以提高性能并写入存储,以实现弹性。

    HotRod 客户端可以使用 @Resource 注释直接注入 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 保护与远程 Red Hat Data Grid 实例的通信。这可以通过在 JBoss EAP 实例上配置 remote-cache-container 并调整 Red Hat Data Grid 实例上的 hotrod 连接器以使用活跃的安全域来实现。

  1. 在 JBoss EAP 中创建 client-ssl-context。有关创建 client-ssl-context 的更多信息,包括生成其他 elytron 组件,请参阅如何为 JBoss EAP 配置服务器安全性中的 使用 client-ssl-context

    /subsystem=elytron/client-ssl-context=CLIENT_SSL_CONTEXT:add(key-manager=KEY_MANAGER,trust-manager=TRUST_MANAGER)
  2. 将远程缓存容器配置为使用客户端 SSL 上下文。

    /subsystem=infinispan/remote-cache-container=CACHE_CONTAINER/component=security:write-attribute(name=ssl-context,value=CLIENT_SSL_CONTEXT)
  3. 保护远程 Red Hat Data Grid 实例,根据需要对每个实例重复此操作。

    1. client-ssl-context 中使用的密钥存储复制到远程 Red Hat Data Grid 实例。
    2. 配置 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")
    3. 调整 hotrod 连接器以指向此安全域。

      /subsystem=datagrid-infinispan-endpoint/hotrod-connector=hotrod-connector/encryption=ENCRYPTION:add(require-ssl-client-auth=false,security-realm="ApplicationRealm")
    4. 重新加载远程 Red Hat Data Grid 实例。

      reload

22.3.9. 使用远程存储向 Red Hat Data Grid 外部化 HTTP 会话

注意

您需要 Red Hat Data Grid 订阅才能使用此功能。

此处的说明代表了旧的外部化会话方法。JBoss EAP 7.2 引入了基于与 elytron 子系统集成的 HotRod 协议的自定义优化的缓存存储。建议您使用新的 热插拔 存储,如 红帽 Data Grid 的外部 HTTP 会话 中所述。

注意

对于每个 distributable 应用,必须创建一个全新的缓存。它可以在现有缓存容器中创建,如 web

对 HTTP 会话外部化:

  1. 通过将网络信息添加到 socket-binding-group 来定义远程 Red Hat Data Grid 服务器的位置。

    示例:添加远程套接字绑定

    /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>

    注意

    您需要为每个 Red Hat Data Grid 服务器配置远程套接字绑定。

  2. 确保远程缓存容器在 JBoss EAP 的 infinispan 子系统中定义;在 remote-store 元素的 cache 属性下,定义了远程 Red Hat Data Grid 服务器上的缓存名称。

    如果您在受管域中运行,请在这些命令前加上 /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="{InfinispanSubsystemNamespace}">
      ...
      <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>

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.