Data Grid Library 模式


Red Hat Data Grid 8.1

将 Data Grid 作为嵌入式库运行

Red Hat Customer Content Services

摘要

设置依赖项并运行 Data Grid 作为自定义应用程序中嵌入的库。

Red Hat Data Grid

Data Grid 是一个高性能分布式内存数据存储。

无架构数据结构
将不同对象存储为键值对的灵活性。
基于网格的数据存储
旨在在集群中分发和复制数据。
弹性扩展
动态调整节点数量,以便在不中断服务的情况下满足需求。
数据互操作性
从不同端点在网格中存储、检索和查询数据。

Data Grid 文档

红帽客户门户网站中提供了 Data Grid 的文档。

Data Grid 下载

访问红帽客户门户上的 Data Grid 软件下载

注意

您必须有一个红帽帐户才能访问和下载数据中心软件。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 配置 Data Grid Maven 存储库

Data Grid Java 发行版可从 Maven 获取。

您可以从客户门户网站下载 Data Grid Maven 存储库,或者从公共 Red Hat Enterprise Maven 存储库拉取 Data Grid 依赖项。

1.1. 下载 Data Grid Maven 存储库

如果您不想使用公共 Red Hat Enterprise Maven 存储库,将 Data Grid Maven 存储库下载并安装到本地文件系统、Apache HTTP 服务器或 Maven 存储库管理器。

流程

  1. 登录到红帽客户门户。
  2. 导航到 Data Grid 的软件下载
  3. 下载 Red Hat Data Grid 8.1 Maven 存储库。
  4. 将存档的 Maven 存储库提取到本地文件系统。
  5. 打开 README.md 文件,并按照适当的安装说明进行操作。

1.2. 添加 Red Hat Maven 存储库

在您的 Maven 构建环境中包括红帽 GA 存储库,以获取 Data Grid 工件和依赖项。

流程

  • 将 Red Hat GA 存储库添加到 Maven 设置文件中,通常为 ~/.m2/settings.xml,或者直接在项目的 pom.xml 文件中。

    <repositories>
      <repository>
        <id>redhat-ga-repository</id>
        <name>Red Hat GA Repository</name>
        <url>https://maven.repository.redhat.com/ga/</url>
      </repository>
    </repositories>
    <pluginRepositories>
      <pluginRepository>
        <id>redhat-ga-repository</id>
        <name>Red Hat GA Repository</name>
        <url>https://maven.repository.redhat.com/ga/</url>
      </pluginRepository>
    </pluginRepositories>
    Copy to Clipboard Toggle word wrap

1.3. 配置数据网格 POM

Maven 使用名为 Project Object Model (POM)文件的配置文件来定义项目并管理构建。POM 文件采用 XML 格式,描述生成的项目打包和输出的模块和组件依赖项、构建顺序和目标。

流程

  1. 打开您的项目 pom.xml 进行编辑。
  2. 使用正确的 Data Grid 版本定义 version.infinispan 属性。
  3. dependencyManagement 部分中包含 infinispan-bom

    Bill Of Materials (BOM)控制依赖项版本,从而避免了版本冲突,这意味着您不需要为添加到项目的每个 Data Grid 工件设置版本。

  4. 保存并关闭 pom.xml

以下示例显示了 Data Grid 版本和 BOM:

<properties>
  <version.infinispan>11.0.9.Final-redhat-00001</version.infinispan>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.infinispan</groupId>
      <artifactId>infinispan-bom</artifactId>
      <version>${version.infinispan}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
Copy to Clipboard Toggle word wrap

后续步骤

根据需要,将 Data Grid 工件作为依赖项添加到 pom.xml 中。

第 2 章 在库模式中安装 Data Grid

添加 Data Grid 作为项目中的嵌入式库。

流程

  • infinispan-core 工件作为依赖项添加到 pom.xml 中,如下所示:
<dependencies>
  <dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-core</artifactId>
  </dependency>
</dependencies>
Copy to Clipboard Toggle word wrap

第 3 章 将 Data Grid 作为嵌入式库运行

了解如何将 Data Grid 作为嵌入式数据存储在项目中运行。

流程

  • 初始化默认缓存管理器并添加缓存定义,如下所示:
GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder();
DefaultCacheManager cacheManager = new DefaultCacheManager(global.build());
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.clustering().cacheMode(CacheMode.DIST_SYNC);
cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache("myCache", builder.build());
Copy to Clipboard Toggle word wrap

前面的代码初始化默认的集群缓存管理器。缓存管理器包含您的缓存定义和控制缓存生命周期。

Data Grid 不提供默认的缓存定义,因此在初始化默认缓存管理器后,您需要至少添加一个缓存实例。本例使用 ConfigurationBuilder 类来创建使用分布式同步缓存模式的缓存定义。然后,您可以调用 getOrCreateCache () 方法,该方法在集群的所有节点上创建一个名为"myCache"的缓存,如果已存在,则返回它。

后续步骤

现在,您已创建了带有缓存运行的缓存管理器,您可以添加更多缓存定义,将一些数据放在缓存中,或者根据需要配置 Data Grid。

第 4 章 设置 Data Grid 集群

Data Grid 需要传输层,以便节点可以自动加入和离开集群。传输层还可让数据在网络间复制或分发数据,并执行操作,如重新平衡和状态传输。

4.1. 默认堆栈入门

Data Grid 使用 JGroups 协议堆栈,以便节点可以在专用集群通道上发送其他消息。

Data Grid 为 UDPTCP 协议提供预配置的 JGroups 堆栈。您可以使用这些默认堆栈作为构建自定义集群传输配置的起点,该配置根据您的网络要求进行了优化。

流程

  1. infinispan-core-11.0.9.Final -redhat-00001.jar 文件的 default-configs 目录中找到默认的 JGroups 堆栈 default-jgroups-2022-3.xml
  2. 执行以下操作之一:

    • 使用 infinispan.xml 文件中的 stack 属性。

      <infinispan>
        <cache-container default-cache="replicatedCache">
          <transport cluster="${infinispan.cluster.name}"
                     stack="udp" 
      1
      
                     node-name="${infinispan.node.name:}"/>
        </cache-container>
      </infinispan>
      Copy to Clipboard Toggle word wrap
      1
      default-jgroups-udp.xml 用于集群传输。
    • 使用 addProperty () 方法设置 JGroups 堆栈文件:

      GlobalConfiguration globalConfig = new GlobalConfigurationBuilder().transport()
              .defaultTransport()
              .clusterName("qa-cluster")
              .addProperty("configurationFile", "default-jgroups-udp.xml") 
      1
      
              .build();
      Copy to Clipboard Toggle word wrap
      1
      default-jgroups-udp.xml 堆栈用于集群传输。

Data Grid 记录以下信息以指示它使用的堆栈:

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack udp
Copy to Clipboard Toggle word wrap

参考

4.1.1. 默认 JGroups Stacks

了解配置集群传输的默认 JGroups 堆栈。

Expand
文件名堆栈名称描述

default-jgroups-udp.xml

udp

使用 UDP 进行传输和 UDP 多播进行发现。适用于较大的集群(超过 100 个节点),或者使用复制缓存或无效模式。最小化打开的插槽数量。

default-jgroups-tcp.xml

tcp

使用 TCP 传输和 MPING 协议进行发现,它使用 UDP 多播。只有在使用分布式缓存 时,只适用于 较小的集群(在 100 个节点下),因为 TCP 比 UDP 作为点对点协议更高效。

default-jgroups-ec2.xml

ec2

使用 TCP 进行传输,S3_PING 进行发现。适用于 UDP 多播不可用的 Amazon EC2 节点。

default-jgroups-kubernetes.xml

kubernetes

使用 TCP 进行传输,DNS_PING 进行发现。适用于始终提供 UDP 多播的 Kubernetes 和 Red Hat OpenShift 节点。

default-jgroups-google.xml

google

使用 TCP 进行传输,GOOGLE_PING2 进行发现。适用于没有 UDP 多播的 Google Cloud Platform 节点。

default-jgroups-azure.xml

azure

使用 TCP 进行传输,AZURE_PING 进行发现。适用于没有 UDP 多播的 Microsoft Azure 节点。

4.1.2. 集群流量的 TCP 和 UDP 端口

Data Grid 对集群传输信息使用以下端口:

Expand
默认端口协议描述

7800

TCP/UDP

JGroups 集群绑定端口

46655

UDP

JGroups 多播

跨站点复制

Data Grid 为 JGroups RELAY2 协议使用以下端口:

7900
对于在 OpenShift 上运行的 Data Grid 集群。
7800
如果将 UDP 用于节点间的流量,使用 TCP 作为集群之间的流量。
7801
如果将 TCP 用于节点和 TCP 间的流量,用于集群之间的流量。

4.2. 自定义 JGroups 堆栈

调整和调优属性,以创建适合您的网络要求的集群传输配置。

Data Grid 提供可让您扩展默认 JGroups 堆栈以方便配置的属性。您可以在合并、删除和替换其他属性时从默认堆栈继承属性。

流程

  1. infinispan.xml 文件中创建一个新的 JGroups 堆栈声明。

    <infinispan>
      <jgroups>
        <stack name="my-stack"> 
    1
    
        </stack>
      </jgroups>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    创建名为"my-stack"的自定义 JGroups 堆栈。
  2. 添加 extends 属性,并指定 JGroups 堆栈来继承属性。

    <infinispan>
      <jgroups>
        <stack name="my-stack" extends="tcp"> 
    1
    
        </stack>
      </jgroups>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    从默认的 TCP 堆栈继承。
  3. 使用 stack.combine 属性修改继承堆栈中配置的协议的属性。
  4. 使用 stack.position 属性定义自定义堆栈的位置。

    例如,您可以使用 Gossip 路由器和使用默认 TCP 堆栈的对称加密来评估,如下所示:

    <jgroups>
      <stack name="my-stack" extends="tcp">
        <TCPGOSSIP initial_hosts="${jgroups.tunnel.gossip_router_hosts:localhost[12001]}"
                 stack.combine="REPLACE"
                 stack.position="MPING" /> 
    1
    
        <FD_SOCK stack.combine="REMOVE"/> 
    2
    
        <VERIFY_SUSPECT timeout="2000"/> 
    3
    
        <SYM_ENCRYPT sym_algorithm="AES"
                     keystore_name="mykeystore.p12"
                     keystore_type="PKCS12"
                     store_password="changeit"
                     key_password="changeit"
                     alias="myKey"
                     stack.combine="INSERT_AFTER"
                     stack.position="VERIFY_SUSPECT" /> 
    4
    
      </stack>
    </jgroups>
    Copy to Clipboard Toggle word wrap
    1
    使用 TCPGOSSIP 协议作为发现机制,而不是 MPING
    2
    从堆栈中删除 FD_SOCK 协议。
    3
    修改 VERIFY_SUSPECT 协议的超时值。
    4
    VERIFY_SUSPECT 协议后,将 SYM_ENCRYPT 协议添加到堆栈中。
  5. 指定堆栈名称,作为 传输 配置中 stack 属性的值。

    <infinispan>
      <jgroups>
        <stack name="my-stack" extends="tcp">
         ...
        </stack>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="my-stack" 
    1
    
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
      </jgroups>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    配置 Data Grid,以将 "my-stack" 用于集群传输。
  6. 检查 Data Grid 日志,以确保它使用堆栈。

    [org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack my-stack
    Copy to Clipboard Toggle word wrap

参考

4.2.1. 继承属性

当您扩展 JGroups 堆栈时,继承属性允许您调整您要扩展的堆栈中的协议和属性。

  • stack.position 指定要修改的协议。
  • stack.combine 使用以下值来扩展 JGroups 堆栈:

    Expand
    描述

    组合

    覆盖协议属性。

    REPLACE

    替换协议。

    INSERT_AFTER

    在另一个协议后将协议添加到堆栈中。不会影响指定为插入点的协议。

    JGroups 堆栈中的协议会根据堆栈中的位置相互影响。例如,您应该在 SYM_ENCRYPTASYM_ENCRYPT 协议后放置 NAKACK2 等协议,以便保护 NAKACK2

    删除

    从堆栈中删除协议。

4.3. 使用 JGroups 系统属性

在启动时将系统属性传递给 Data Grid,以调优群集传输。

流程

  • 根据需要,使用 -D<property-name>=<property-value > 参数设置 JGroups 系统属性。

例如,设置自定义绑定端口和 IP 地址,如下所示:

$ java -cp ... -Djgroups.bind.port=1234 -Djgroups.bind.address=192.0.2.0
Copy to Clipboard Toggle word wrap
注意

当您将 Data Grid 集群嵌入到集群红帽 JBoss EAP 应用程序中时,JGroups 系统属性可以相互冲突或覆盖。

例如,您没有为 Data Grid 集群或 Red Hat JBoss EAP 应用程序设置唯一的绑定地址。在这种情况下,Data Grid 和 Red Hat JBoss EAP 应用程序都使用 JGroups 默认属性,并尝试使用相同的绑定地址组成集群。

4.3.1. JGroups 堆栈的系统属性

设置配置 JGroups 集群传输堆栈的系统属性。

Expand
系统属性描述默认值必填/选填

jgroups.bind.address

集群传输的绑定地址。

SITE_LOCAL

选填

jgroups.bind.port

套接字的绑定端口。

7800

选填

jgroups.mcast_addr

用于多播的 IP 地址,包括发现和集群间通信。IP 地址必须是适合 IP 多播的有效"类 D"地址。

228.6.7.8

选填

jgroups.mcast_port

多播套接字的端口。

46655

选填

jgroups.ip_ttl

IP 多播数据包的时间到时间(TTL)。该值定义数据包在丢弃前可以进行的网络跃点数。

2

选填

jgroups.thread_pool.min_threads

线程池的最小线程数量。

0

选填

jgroups.thread_pool.max_threads

线程池的最大线程数。

200

选填

jgroups.join_timeout

等待加入请求成功的最大毫秒数。

2000

选填

jgroups.thread_dumps_threshold

在记录线程转储前,线程池需要满的次数。

10000

选填

Amazon EC3

以下系统属性只适用于 default-jgroups-ec2.xml

Expand
系统属性描述默认值必填/选填

jgroups.s3.access_key

S3 存储桶的 Amazon S3 访问密钥。

没有默认值。

选填

jgroups.s3.secret_access_key

用于 S3 存储桶的 Amazon S3 secret 密钥。

没有默认值。

选填

jgroups.s3.bucket

Amazon S3 存储桶的名称。名称必须存在,并且必须是唯一的。

没有默认值。

选填

Kubernetes

以下系统属性只适用于 default-jgroups-kubernetes.xml

Expand
系统属性描述默认值必填/选填

jgroups.dns.query

设置返回群集成员的 DNS 记录。

没有默认值。

必填

Google Cloud Platform

以下系统属性只适用于 default-jgroups-google.xml

Expand
系统属性描述默认值必填/选填

jgroups.google.bucket_name

Google Compute Engine 存储桶的名称。名称必须存在,并且必须是唯一的。

没有默认值。

必填

4.4. 使用 Inline JGroups Stacks

您可以将完整的 JGroups 堆栈定义插入到 infinispan.xml 文件中。

流程

  • infinispan.xml 文件中嵌入自定义 JGroups 堆栈声明。

    <infinispan>
      <jgroups> 
    1
    
        <stack name="prod"> 
    2
    
          <TCP bind_port="7800" port_range="30" recv_buf_size="20000000" send_buf_size="640000"/>
          <MPING bind_addr="127.0.0.1" break_on_coord_rsp="true"
                 mcast_addr="${jgroups.mping.mcast_addr:228.2.4.6}"
                 mcast_port="${jgroups.mping.mcast_port:43366}"
                 num_discovery_runs="3"
                 ip_ttl="${jgroups.udp.ip_ttl:2}"/>
          <MERGE3 />
          <FD_SOCK />
          <FD_ALL timeout="3000" interval="1000" timeout_check_interval="1000" />
          <VERIFY_SUSPECT timeout="1000" />
          <pbcast.NAKACK2 use_mcast_xmit="false" xmit_interval="100" xmit_table_num_rows="50"
                          xmit_table_msgs_per_row="1024" xmit_table_max_compaction_time="30000" />
          <UNICAST3 xmit_interval="100" xmit_table_num_rows="50" xmit_table_msgs_per_row="1024"
                    xmit_table_max_compaction_time="30000" />
          <pbcast.STABLE stability_delay="200" desired_avg_gossip="2000" max_bytes="1M" />
          <pbcast.GMS print_local_addr="false" join_timeout="${jgroups.join_timeout:2000}" />
          <UFC max_credits="4m" min_threshold="0.40" />
          <MFC max_credits="4m" min_threshold="0.40" />
          <FRAG3 />
        </stack>
      </jgroups>
      <cache-container default-cache="replicatedCache">
        <transport stack="prod" /> 
    3
    
        ...
      </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    包含一个或多个 JGroups 堆栈定义。
    2
    定义一个名为 "prod" 的自定义 JGroups 堆栈。
    3
    将 Data Grid 配置为使用 "prod" 进行集群传输。

4.5. 使用外部 JGroups 堆栈

引用在 infinispan.xml 文件中定义自定义 JGroups 堆栈的外部文件。

流程

  1. 将自定义 JGroups 堆栈文件放在应用类路径上。

    或者,您可以在声明外部堆栈文件时指定绝对路径。

  2. 使用 stack-file 元素引用外部堆栈文件。

    <infinispan>
      <jgroups>
         <stack-file name="prod-tcp" path="prod-jgroups-tcp.xml"/> 
    1
    
      </jgroups>
      <cache-container default-cache="replicatedCache">
        <transport stack="prod-tcp" /> 
    2
    
        <replicated-cache name="replicatedCache"/>
      </cache-container>
      ...
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    创建名为"prod-tcp"的堆栈,它使用 "prod-jgroups-tcp.xml" 定义。
    2
    配置数据网格,以将 "prod-tcp" 用于集群传输。

4.6. 集群发现协议

Data Grid 支持不同的协议,允许节点在网络上自动找到并形成集群。

Data Grid 可以使用两种发现机制:

  • 在大多数网络上工作且不依赖于外部服务的通用发现协议。
  • 依赖于外部服务的发现协议来存储和检索 Data Grid 集群的拓扑信息。
    例如,DNS_PING 协议通过 DNS 服务器记录执行发现。
注意

在托管平台上运行 Data Grid 需要使用针对各个云提供商实施的网络限制的发现机制。

4.6.1. PING

PING 或 UDPPING 是一种通用 JGroups 发现机制,它使用 UDP 协议的动态多播。

加入后,节点将 PING 请求发送到 IP 多播地址,以发现已在 Data Grid 集群中的其他节点。每个节点通过包含协调器节点地址的数据包以及自己的地址来响应 PING 请求。C=coordinator 的地址和 A=own 地址。如果没有节点响应 PING 请求,则加入节点会成为新集群中的协调节点。

PING 配置示例

<config>
  <PING num_discovery_runs="3"/>
  ...
</config>
Copy to Clipboard Toggle word wrap

参考

4.6.2. TCPPING

TCPPING 是一种通用 JGroups 发现机制,它对群集成员使用静态地址列表。

使用 TCPPING 时,您可以手动将 Data Grid 集群中每个节点的 IP 地址或主机名指定为 JGroups 堆栈的一部分,而不是让节点动态发现其他节点。

TCPPING 配置示例

<config>
  <TCP bind_port="7800" />
  <TCPPING timeout="3000"
           initial_hosts="${jgroups.tcpping.initial_hosts:hostname1[port1],hostname2[port2]}"
          port_range="0" 
1

          num_initial_members="3"/>
  ...
</config>
Copy to Clipboard Toggle word wrap

1
为了可靠发现,红帽建议 端口范围=0

4.6.3. MPING

MPING 使用 IP 多播来发现 Data Grid 集群的初始成员资格。

您可以使用 MPING 将 TCPPING 发现替换为 TCP 堆栈,并使用 multicasing 进行发现,而不使用初始主机的静态列表。但是,您还可以将 MPING 与 UDP 堆栈一起使用。

MPING 配置示例

<config>
  <MPING mcast_addr="${jgroups.mcast_addr:228.6.7.8}"
         mcast_port="${jgroups.mcast_port:46655}"
         num_discovery_runs="3"
         ip_ttl="${jgroups.udp.ip_ttl:2}"/>
  ...
</config>
Copy to Clipboard Toggle word wrap

4.6.4. TCPGOSSIP

gossip 路由器在网络上提供一个中央位置,用于您的数据网格集群可以检索其他节点的地址。

您可以将 Gossip 路由器的地址(IP:PORT)注入 Data Grid 节点,如下所示:

  1. 将 address 作为系统属性传递给 JVM;例如,-DGossipRouterAddress="10.10.2.4[12001]"
  2. 在 JGroups 配置文件中引用该系统属性。

gossip 路由器配置示例

<config>
  <TCP bind_port="7800" />
  <TCPGOSSIP timeout="3000"
             initial_hosts="${GossipRouterAddress}"
             num_initial_members="3" />
  ...
</config>
Copy to Clipboard Toggle word wrap

4.6.5. JDBC_PING

JDBC_PING 使用共享数据库存储数据网格集群的信息。此协议支持任何可以使用 JDBC 连接的数据库。

节点将其 IP 地址写入共享数据库,以便加入节点可以在网络上找到 Data Grid 集群。当节点离开 Data Grid 集群时,它们会从共享数据库中删除其 IP 地址。

JDBC_PING 配置示例

<config>
  <JDBC_PING connection_url="jdbc:mysql://localhost:3306/database_name"
             connection_username="user"
             connection_password="password"
             connection_driver="com.mysql.jdbc.Driver"/>
  ...
</config>
Copy to Clipboard Toggle word wrap

重要

将适当的 JDBC 驱动程序添加到类路径中,以便 Data Grid 可以使用 JDBC_PING。

4.6.6. DNS_PING

JGroups DNS_PING 查询 DNS 服务器,以便在 Kubernetes 环境中发现数据网格群集成员,如 OKD 和 Red Hat OpenShift。

DNS_PING 配置示例

<config>
  <dns.DNS_PING dns_query="myservice.myproject.svc.cluster.local" />
  ...
</config>
Copy to Clipboard Toggle word wrap

参考

4.7. 使用自定义 JChannels

构建自定义 JGroups JChannels,如下例所示:

GlobalConfigurationBuilder global = new GlobalConfigurationBuilder();
JChannel jchannel = new JChannel();
// Configure the jchannel as needed.
JGroupsTransport transport = new JGroupsTransport(jchannel);
global.transport().transport(transport);
new DefaultCacheManager(global.build());
Copy to Clipboard Toggle word wrap
注意

网格无法使用已经连接的自定义 JChannels。

4.8. 加密集群传输

保护集群传输,以便节点与加密消息通信。您还可以配置 Data Grid 集群来执行证书身份验证,以便只有具有有效身份的节点才能加入。

4.8.1. Data Grid 集群安全性

为了保护集群流量,您需要配置 Data Grid 节点,以使用 secret 密钥加密 JGroups 消息有效负载。

Data Grid 节点可以从以下方法获取 secret 密钥:

  • 协调器节点(symmetric 加密)。
  • 共享密钥存储(symmetric encryption)。

从协调器节点检索 secret 密钥

您可以通过在 Data Grid 配置中的 JGroups 堆栈中添加 ASYM_ENCRYPT 协议来配置非对称加密。这允许 Data Grid 集群生成和分发 secret 密钥。

重要

在使用非对称加密时,您还应提供密钥存储,以便节点能够执行证书身份验证并安全地交换机密密钥。这可保护集群不受中间人(MitM)攻击的影响。

非对称加密保护集群流量,如下所示:

  1. Data Grid 集群中的第一个节点(coordinator 节点)会生成一个 secret 密钥。
  2. 加入节点使用协调器执行证书身份验证,以互相验证身份。
  3. 加入的节点从 coordinator 节点请求 secret 密钥。该请求包含加入节点的公钥。
  4. 协调器节点使用公钥加密 secret 密钥,并将其返回到加入节点。
  5. 加入节点解密并安装 secret 密钥。
  6. 节点加入集群,使用 secret 密钥加密并解密信息。

从共享密钥存储检索 secret 密钥

您可以通过在 Data Grid 配置中的 JGroups 堆栈中添加 SYM_ENCRYPT 协议来配置对称加密。这允许 Data Grid 集群从您提供的密钥存储获取 secret 密钥。

  1. 节点在启动时从 Data Grid 类路径上的密钥存储安装 secret 密钥。
  2. 节点加入集群,使用 secret 密钥加密和解密消息。

非对称和对称加密的比较

带有证书身份验证的 ASYM_ENCRYPT 提供了额外的加密层,与 SYM_ENCRYPT 相比。您提供密钥存储来为 secret 密钥加密对协调节点的请求。Data Grid 会自动生成该 secret 密钥并处理集群流量,同时允许您指定何时生成 secret 密钥。例如,您可以配置集群以在节点离开时生成新的 secret 密钥。这样可确保节点无法绕过证书身份验证,并使用旧密钥加入。

另一方面,SYM_ENCRYPTASYM_ENCRYPT 快,因为节点不需要与集群协调器交换密钥。SYM_ENCRYPT 是没有配置在集群成员资格更改时自动生成新 secret 密钥的潜在缺陷。用户负责生成和分发节点用于加密集群流量的 secret 密钥。

4.8.2. 使用 Asymmetric Encryption 配置集群传输

配置 Data Grid 集群,以生成和分发加密 JGroups 消息的 secret 密钥。

流程

  1. 使用证书链创建密钥存储,使 Data Grid 能够验证节点身份。
  2. 将密钥存储放在集群中每个节点的 classpath 上。

    对于 Data Grid Server,您要将密钥存储放在 $RHDG_HOME 目录中。

  3. SSL_KEY_EXCHANGEASYM_ENCRYPT 协议添加到 Data Grid 配置中的 JGroups 堆栈,如下例所示:

    <infinispan>
        <jgroups>
             <stack name="encrypt-tcp" extends="tcp"> 
    1
    
               <SSL_KEY_EXCHANGE keystore_name="mykeystore.jks" 
    2
    
                                 keystore_password="changeit" 
    3
    
                                 stack.combine="INSERT_AFTER"
                                 stack.position="VERIFY_SUSPECT"/> 
    4
    
               <ASYM_ENCRYPT asym_keylength="2048" 
    5
    
                        asym_algorithm="RSA" 
    6
    
                        change_key_on_coord_leave = "false" 
    7
    
                        change_key_on_leave = "false" 
    8
    
                        use_external_key_exchange = "true" 
    9
    
                        stack.combine="INSERT_AFTER"
                        stack.position="SSL_KEY_EXCHANGE"/> 
    10
    
             </stack>
        </jgroups>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="encrypt-tcp" 
    11
    
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    创建名为"encrypt-tcp"的安全 JGroups 堆栈,用于扩展 Data Grid 的默认 TCP 堆栈。
    2
    将节点用来执行证书身份验证的密钥存储命名。
    3
    指定密钥存储密码。
    4
    使用 stack.combinestack.position 属性在 VERIFY_SUSPECT 协议后将 SSL_KEY_EXCHANGE 插入到默认的 TCP 堆栈中。
    5
    指定协调器节点生成的 secret 密钥长度。默认值为 2048
    6
    指定 coordinator 节点用来生成 secret 密钥的密码引擎。默认值为 RSA
    7
    配置 Data Grid,以在协调器节点更改时生成并分发新的 secret 密钥。
    8
    配置 Data Grid,以在节点离开时生成和分发新的 secret 密钥。
    9
    配置 Data Grid 节点,以使用 SSL_KEY_EXCHANGE 协议进行证书身份验证。
    10
    使用 stack.combinestack.position 属性在 SSL_KEY_EXCHANGE 协议后将 ASYM_ENCRYPT 插入默认的 TCP 堆栈。
    11
    配置 Data Grid 集群,以使用 secure JGroups 堆栈。

验证

当您启动 Data Grid 集群时,以下日志消息表示集群使用 secure JGroups 堆栈:

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
Copy to Clipboard Toggle word wrap

只有在它们使用 ASYM_ENCRYPT 且可以从协调器节点获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:

[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
Copy to Clipboard Toggle word wrap

参考

此流程中的 ASYM_ENCRYPT 配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。

4.8.3. 使用 Symmetric 加密配置集群传输

配置 Data Grid 集群,以使用您提供的密钥存储中的 secret 密钥加密 JGroups 消息。

流程

  1. 创建包含 secret 密钥的密钥存储。
  2. 将密钥存储放在集群中每个节点的 classpath 上。

    对于 Data Grid Server,您要将密钥存储放在 $RHDG_HOME 目录中。

  3. SYM_ENCRYPT 协议添加到 Data Grid 配置中的 JGroups 堆栈中,如下例所示:

    <infinispan>
        <jgroups>
             <stack name="encrypt-tcp" extends="tcp"> 
    1
    
               <SYM_ENCRYPT keystore_name="myKeystore.p12" 
    2
    
                            keystore_type="PKCS12" 
    3
    
                            store_password="changeit" 
    4
    
                            key_password="changeit" 
    5
    
                            alias="myKey" 
    6
    
                            stack.combine="INSERT_AFTER"
                            stack.position="VERIFY_SUSPECT"/> 
    7
    
             </stack>
        </jgroups>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="encrypt-tcp" 
    8
    
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    创建名为"encrypt-tcp"的安全 JGroups 堆栈,用于扩展 Data Grid 的默认 TCP 堆栈。
    2
    将密钥存储命名为从哪些节点获取 secret 密钥。
    3
    指定密钥存储类型。JGroups 默认使用 JCEKS。
    4
    指定密钥存储密码。
    5
    指定 secret 密钥密码。
    6
    指定 secret 密钥别名。
    7
    使用 stack.combinestack.position 属性在 VERIFY_SUSPECT 协议后将 SYM_ENCRYPT 插入到默认的 TCP 堆栈中。
    8
    配置 Data Grid 集群,以使用 secure JGroups 堆栈。

验证

当您启动 Data Grid 集群时,以下日志消息表示集群使用 secure JGroups 堆栈:

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
Copy to Clipboard Toggle word wrap

只有在使用 SYM_ENCRYPT 且可以从共享密钥存储获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:

[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
Copy to Clipboard Toggle word wrap

参考

此流程中的 SYM_ENCRYPT 配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat