22.3. Infinispan


22.3.1. 关于 Infinispan

Infinispan 是一个 Java 网格平台,提供 JSR-107- 兼容缓存接口来管理缓存数据。有关 Infinispan 功能和配置选项的更多信息,请参阅 Infinispan 文档

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

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

重要

Infinispan 作为 JBoss EAP 中的私有模块提供,提供 JBoss EAP 的缓存功能。Infinispan 不支持直接供应用程序使用。

22.3.2. 缓存容器

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

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

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

示例:默认的 Infinispan 配置

<subsystem xmlns="urn:jboss:domain:infinispan:4.0">
  <cache-container name="server" aliases="singleton cluster" default-cache="default" module="org.wildfly.clustering.server">
    <transport lock-timeout="60000"/>
    <replicated-cache name="default" mode="SYNC">
      <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" mode="ASYNC" l1-lifespan="0" owners="2">
      <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" mode="ASYNC" l1-lifespan="0" owners="2">
      <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">
      <eviction strategy="LRU" max-entries="10000"/>
      <expiration max-idle="100000"/>
    </local-cache>
    <invalidation-cache name="entity" mode="SYNC">
      <transaction mode="NON_XA"/>
      <eviction strategy="LRU" max-entries="10000"/>
      <expiration max-idle="100000"/>
    </invalidation-cache>
    <replicated-cache name="timestamps" mode="ASYNC"/>
  </cache-container>
</subsystem>

注意每个缓存容器中定义的默认缓存。例如,web 缓存容器 分布式缓存定义为默认值。因此,集群 Web 会话将使用 dist 缓存。

重要

您可以添加额外的缓存和缓存容器,例如,用于 HTTP 会话、有状态会话 Bean 或单例服务或部署。不支持直接由用户应用程序使用这些缓存。

22.3.2.1. 配置缓存容器

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

警告

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

使用管理控制台配置缓存

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

  • 添加缓存容器。

    单击 Cache Container 标题旁边的 Add 按钮,再输入新缓存容器的设置。

  • 更新缓存容器设置。

    选择适当的缓存容器,然后从下拉菜单中选择 Container Settings。根据需要配置缓存容器设置。

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

    选择适当的缓存容器,然后从下拉菜单中选择 Transport Settings。根据需要配置缓存容器传输设置。

  • 配置缓存。

    选择适当的缓存容器并选择 View。从适当的缓存选项卡中(例如,复制缓存),您可以添加、更新和删除缓存。

使用管理 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)
更改默认 EJB 缓存容器

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

  • 要支持传递 EJB 会话 Bean,您可以使用 infinispan 子系统中定义的 ejb 缓存容器来存储会话。
  • 对于连接到服务器上的集群部署的远程 EJB 客户端,您必须为这些客户端提供集群拓扑信息,以便在它们与之交互的节点失败时能够切换到集群中的其他节点。

如果要更改或重命名默认缓存容器,名为 ejb,它支持传递和置备拓扑信息,您必须将 cache-container 属性添加到 passivation-stores 元素,并将集群属性添加到 remote 元素,如下例所示。如果您只是为自己的用途添加新缓存,则不需要进行这些更改。

<subsystem xmlns="urn:jboss:domain:ejb3:4.0">
    <passivation-stores>
        <passivation-store name="infinispan" cache-container="ejb-cltest" max-size="10000"/>
    </passivation-stores>

    <remote cluster="ejb-cltest" connector-ref="http-remoting-connector" thread-pool-name="default"/>
</subsystem>

<subsystem xmlns="urn:jboss:domain:infinispan:4.0">
    ...
    <cache-container name="ejb-cltest" aliases="sfsb" default-cache="dist" module="org.wildfly.clustering.ejb.infinispan">
</subsystem>

22.3.3. 集群模式

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

缓存模式
复制
复制模式会自动检测到并在集群中添加新实例。对这些实例所做的更改将复制到集群中的所有节点。复制模式通常可在小集群中正常工作,因为必须通过网络复制的信息量。Infinispan 可以配置为使用 UDP 多播,从而将网络流量拥塞到某种程度上。
分布式

分布式模式允许 Infinispan 线性扩展集群。分布式模式使用一致的哈希算法来确定应该放置新节点的位置。要保留的信息副本数可以配置。在副本数量之间有一个权衡,保持数据持久性和性能。保留的副本越多,对性能的影响越高,但不太可能在服务器故障中丢失数据。哈希算法还可在没有多播或存储元数据的情况下查找条目来减少网络流量。

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

同步和同步复制

复制可以在同步或异步模式下执行,所选的模式取决于您的要求和您的应用程序。

同步复制
使用同步复制时,处理用户请求的线程会被阻断,直到复制成功为止。当复制成功时,响应会发回到客户端,然后才会释放线程。同步复制对网络流量有影响,因为它需要来自集群中每个节点的响应。但是,它的优点在于确保对集群中的所有节点进行了所有修改。
异步复制
通过异步复制,Infinispan 使用线程池在后台执行复制。发件人不会等待来自集群中其他节点的回复。但是,在上一个复制完成前,对同一会话的缓存读取将阻止,以便不读取过时的数据。复制是根据时间或队列大小触发的。复制尝试失败的写入日志,而不是实时通知。

22.3.3.1. 配置缓存模式

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

注意

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

进入 Replicated Cache Mode

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

注意

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

  1. 添加 重新 复制缓存。

    /subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode=ASYNC)
    /subsystem=infinispan/cache-container=web/replicated-cache=repl/component=transaction:write-attribute(name=mode,value=BATCH)
    /subsystem=infinispan/cache-container=web/replicated-cache=repl/component=locking:write-attribute(name=isolation, value=REPEATABLE_READ)
    /subsystem=infinispan/cache-container=web/replicated-cache=repl/store=file:add
  2. 将默认缓存更改为重新 复制 缓存。

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

    reload
进入分布式缓存模式

Web 会话缓存的默认 JBoss EAP 7 配置 已包含 分布式缓存。

注意

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

  1. 将默认缓存 更改为 分布式缓存。

    /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 缓存策略降低响应时间,但这只在正确的条件下也是如此。ASYNC 缓存策略难以测量,但当请求之间的持续时间足够长时,可以比 SYNC 策略提供更好的性能,以便完成缓存操作。这是因为在响应时间中不会立即看到复制成本。

如果同一会话的请求速度太快,则上一个请求的复制成本将转移到后续请求的前方,因为它必须等待上一个请求中的复制完成。对于在收到响应后立即发送后续请求的快速触发请求,ASYNC 缓存策略将比 SYNC 缓存策略更糟。因此,同一会话的请求之间有阈值,其中 SYNC 缓存策略实际上的性能优于 ASYNC 缓存策略。在现实世界中,对同一会话的请求通常不会被快速成功。相反,请求之间通常按几秒或更长的时间。在这种情况下,ASYNC 缓存策略是一个可辨识的默认策略,提供最快的响应时间。

22.3.4. 配置 Infinispan Thread 池

infinispan 子系统包含 async-operationsexpiration侦听器持久性remote-commandstate-transfertransport 线程池。可以为任何 Infinispan 缓存容器配置这些池。

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

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

async-operations

60000L

25

25

1000

过期

60000L

1

N/A

N/A

listener

60000L

1

1

100000

Persistence

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 命令的示例,在服务器缓存容器 的持久性 线程池中将 max-threads 值设置为 10

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

22.3.5. Infinispan Statistics

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

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

22.3.5.1. 启用 Infinispan Statistics

警告

启用 Infinispan 统计数据可能会对 infinispan 子系统的性能造成负面影响。只有在需要时才应启用统计数据。

您可以使用管理控制台或管理 CLI 启用或禁用 Infinispan 统计的集合。从管理控制台中,从 Configuration 选项卡导航到 Infinispan 子系统,选择适当的缓存或缓存容器,然后编辑 启用统计信息的属性。使用以下命令,通过管理 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 属性,以便它将继承其缓存容器启用 统计属性的设置

/subsystem=infinispan/cache-container=CACHE_CONTAINER/CACHE_TYPE=CACHE:undefine-attribute(name=statistics-enabled)

22.3.6. Infinispan 分区处理

Infinispan 集群 基于存储数据的多个节点而构建。为了防止多个节点出现故障,Infinispan 会在多个节点中复制相同的数据。这种数据冗余级别使用 owners 属性进行配置。只要同时超过配置的节点数量崩溃,Infinispan 将具有可用数据的副本。

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

脑裂

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

注意

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

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

目标是避免因为脑裂或多个节点快速崩溃而向用户返回不正确的数据的情况。

22.3.6.1. split Brain

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

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

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

  • 如果至少有一个片段丢失其所有所有者,这意味着指定的最少所有者数量自上次重新平衡结束后保留,则分区进入 degraded 模式。
  • 如果分区没有在 最新的稳定拓扑中 包含简单的大多数节点(floor (numNodes/2)+ 1),分区也会进入 degraded 模式。
  • 否则,分区会保持正常运行,并开始重新平衡。

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

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

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

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

注意

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

22.3.6.2. 配置分区处理

目前默认禁用分区处理。使用以下管理 CLI 命令启用分区处理:

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

22.3.7. 向 JBoss Data Grid 外部化 HTTP 会话

注意

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

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

以下示例演示了如何外部使用 HTTP 会话。它适用于 JBoss EAP 的独立实例和受管域。但是,在受管域中,每个服务器组都需要配置唯一的远程缓存。虽然多个服务器组可以使用相同的红帽 JBoss Data Grid 集群,但对应的远程缓存对 JBoss EAP 服务器组是唯一的。

注意

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

外部化 HTTP 会话:

  1. 通过在 socket-binding-group 中添加网络信息,定义远程红帽 JBoss Data Grid 服务器的位置。

    添加远程套接字绑定示例

    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-jdg-server1:add(host=JDGHostName1, port=11222)
    
    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-jdg-server2:add(host=JDGHostName2, port=11222)

    生成的 XML

    <socket-binding-group name="standard-sockets" ... >
      ...
      <outbound-socket-binding name="remote-jdg-server1">
        <remote-destination host="JDGHostName1" port="11222"/>
      </outbound-socket-binding>
      <outbound-socket-binding name="remote-jdg-server2">
        <remote-destination host="JDGHostName2" port="11222"/>
      </outbound-socket-binding>
    </socket-binding-group>

    注意

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

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

    如果您在受管域中运行,请在这些命令前使用 /profile=PROFILE_NAME

    添加远程缓存容器示例

    /subsystem=infinispan/cache-container=web/invalidation-cache=jdg:add(mode=SYNC)
    
    /subsystem=infinispan/cache-container=web/invalidation-cache=jdg/component=locking:write-attribute(name=isolation,value=REPEATABLE_READ)
    
    /subsystem=infinispan/cache-container=web/invalidation-cache=jdg/component=transaction:write-attribute(name=mode,value=BATCH)
    
    /subsystem=infinispan/cache-container=web/invalidation-cache=jdg/store=remote:add(remote-servers=["remote-jdg-server1","remote-jdg-server2"], cache=default, socket-timeout=60000, passivation=false, purge=false, shared=true)

    生成的 XML

    <subsystem xmlns="urn:jboss:domain:infinispan:4.0">
      ...
      <cache-container name="web" default-cache="dist" module="org.wildfly.clustering.web.infinispan" statistics-enabled="true">
        <transport lock-timeout="60000"/>
        <invalidation-cache name="jdg" mode="SYNC">
          <locking isolation="REPEATABLE_READ"/>
          <transaction mode="BATCH"/>
          <remote-store cache="default" socket-timeout="60000" remote-servers="remote-jdg-server1 remote-jdg-server2" passivation="false" purge="false" shared="true"/>
        </invalidation-cache>
        ...
      </cache-container>
    </subsystem>

  3. 将缓存信息添加到应用程序的 jboss-web.xml 中。在以下示例中,web 是缓存容器的名称,jdg 是此容器中的相应缓存的名称。

    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.jdg</cache-name>
        </replication-config>
    </jboss-web>

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.