搜索

Data Grid 服务器指南

download PDF
Red Hat Data Grid 8.1

部署、保护和管理 Data Grid 服务器

Red Hat Customer Content Services

摘要

配置、运行和监控数据网格服务器并从远程客户端应用程序访问您的数据。

Red Hat Data Grid

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

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

Data Grid 文档

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

Data Grid 下载

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

注意

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

使开源包含更多

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

第 1 章 Data Grid Server 入门

快速设置数据网格服务器并了解基础知识。

1.1. 数据网格服务器要求

Data Grid Server 需要 Java 虚拟机。有关支持版本的详情,请参阅 Data Grid 支持的配置

1.2. 下载服务器发布

Data Grid 服务器分发是 Java 库(JAR 文件)、配置文件 和数据 目录的存档。

流程

  1. 访问红帽客户门户。
  2. 软件下载部分 下载 Red Hat Data Grid 8.1 Server。
  3. 使用服务器下载存档作为参数运行 md5sumsha256sum 命令,例如:

    $ sha256sum jboss-datagrid-${version}-server.zip
  4. 与 Data Grid Software Details 页面中的 MD5SHA-256 校验和值进行比较。

参考

1.3. 安装 Data Grid Server

在主机系统上安装 Data Grid Server 分发。

前提条件

下载数据网格服务器分发存档。

流程

  • 使用任何合适的工具将 Data Grid Server 存档提取到主机文件系统中。
$ unzip redhat-datagrid-8.1.1-server.zip

生成的目录是 $RHDG_HOME

1.4. 创建和修改用户

Data Grid Server 要求用户对默认属性域进行身份验证。在访问 Data Grid Server 之前,您必须至少创建一个用户和密码来添加凭证。您还可以添加和修改用户所属的安全授权组。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 使用 user 命令创建和修改 Data Grid 用户。
提示

使用 命令,运行 help user 的更多详细信息。

创建用户和密码

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!"
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!"

创建具有组成员资格的用户

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!" -g supervisor,reader,writer
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!" -g supervisor,reader,writer

1.5. 启动 Data Grid Server

在本地主机上运行 Data Grid Server。

前提条件

  • 至少创建一个 Data Grid 用户。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 使用 服务器 脚本运行 Data Grid Server。

    Linux
    $ bin/server.sh
    Microsoft Windows
    bin\server.bat

当数据网格服务器记录以下信息时,它成功运行:

ISPN080004: Protocol SINGLE_PORT listening on 127.0.0.1:11222
ISPN080034: Server '...' listening on http://127.0.0.1:11222
ISPN080001: Data Grid Server <version> started in <mm>ms

验证

  1. 在任何浏览器中打开 127.0.0.1:11222/console/
  2. 在提示符处输入您的凭证,然后继续到 Data Grid 控制台。

1.6. 验证集群视图

同一网络上的 Data Grid 节点会自动发现相互发现并形成集群。

完成此流程,在使用本地运行的 Data Grid Server 实例的默认 TCP 堆栈中使用 MPING 协议观察集群发现。如果要针对自定义网络要求调整集群传输,请参阅设置 Data Grid 集群的文档。

注意

此流程旨在演示集群发现的原则,它不适用于生产环境。在命令行中指定端口偏移等操作不是为生产环境配置集群传输的可靠方法。

前提条件

有一个 Data Grid Server 实例正在运行。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 将根目录复制到 server2

    $ cp -r server server2
  3. 指定端口偏移和 server2 目录。

    $ bin/server.sh -o 100 -s server2

验证

您可以在控制台的 127.0.0.1:11222/console/cluster-membership 中查看集群成员资格。

Data Grid 还会在节点加入集群时记录以下信息:

INFO  [org.infinispan.CLUSTER] (jgroups-11,<server_hostname>)
ISPN000094: Received new cluster view for channel cluster:
[<server_hostname>|3] (2) [<server_hostname>, <server2_hostname>]

INFO  [org.infinispan.CLUSTER] (jgroups-11,<server_hostname>)
ISPN100000: Node <server2_hostname> joined the cluster

1.7. 关闭 Data Grid 服务器

停止单独运行的服务器,或者安全地关闭集群。

流程

  1. 创建与 Data Grid 的 CLI 连接。
  2. 使用以下方法之一关闭 Data Grid 服务器:

    • 使用 shutdown cluster 命令停止集群中的所有节点,例如:

      [//containers/default]> shutdown cluster

      此命令将集群状态保存到集群中每个节点的 data 文件夹。如果使用缓存存储,shutdown cluster 命令也会保留缓存中的所有数据。

    • 使用 shutdown server 命令和服务器主机名停止单个服务器实例,例如:

      [//containers/default]> shutdown server <my_server01>
重要

shutdown server 命令不会等待重新平衡操作完成,如果同时指定了多个主机名,这可能会导致数据丢失。

提示

有关使用 命令的更多详细信息,运行 help shutdown

验证

在关闭服务器时,Data Grid 会记录以下信息:

ISPN080002: Data Grid Server stopping
ISPN000080: Disconnecting JGroups channel cluster
ISPN000390: Persisted state, version=<$version> timestamp=YYYY-MM-DDTHH:MM:SS
ISPN080003: Data Grid Server stopped

1.7.1. 重启 Data Grid 集群

当您将 Data Grid 集群在关闭后重新上线时,您应该在添加或删除节点或修改集群状态前等待集群可用。

如果您使用 shutdown server 命令关闭集群节点,则必须以相反的顺序重启每台服务器。
例如,如果您关闭 server1,然后关闭 server2,您应该首先启动 server2,然后启动 server1

如果您使用 shutdown cluster 命令关闭集群,集群只有在所有节点重新加入后才能完全正常工作。
您可以以任何顺序重启节点,但集群处于 DEGRADED 状态,直到关闭前加入的所有节点都处于运行状态。

1.8. Data Grid Server Filesystem

Data Grid Server 在主机文件系统上使用 $RHDG_HOME 的以下文件夹:

├── bin
├── boot
├── docs
├── lib
├── server
└── static
提示

有关 $RHDG_HOME 目录中每个文件夹的描述,以及可以用来自定义文件系统的系统属性,请参阅 Data Grid Server README

1.8.1. 服务器根目录

除了 bindocs 文件夹中的资源外,您应该与之交互的 $RHDG_HOME 下的唯一文件夹是服务器根目录,默认情况下名为 server

您可以在同一 $RHDG_HOME 目录或不同的目录中创建多个节点,但每个 Data Grid Server 实例必须具有自己的服务器根目录。例如,5 个节点的集群可以在文件系统中有以下服务器根目录:

├── server
├── server1
├── server2
├── server3
└── server4

每个服务器根目录都应该包含以下文件夹:

├── server
│   ├── conf
│   ├── data
│   ├── lib
│   └── log
server/conf

包含 Data Grid Server 实例的 infinispan.xml 配置文件。

Data Grid 将配置分成两个层:

dynamic
为数据可扩展性创建可变缓存配置。
Data Grid 服务器会永久保存您在运行时创建的缓存,以及跨节点分布的集群状态。每个加入节点都会收到一个完整的集群状态,在发生更改时 Data Grid Server 同步所有节点。
Static
将配置添加到 infinispan.xml 中用于底层服务器机制,如集群传输、安全性和共享数据源。
server/data

提供 Data Grid 服务器用来维护集群状态的内部存储。

重要

切勿直接删除或修改 server/data 中的内容。

在服务器运行时 修改 cache.xml 等文件可能会导致损坏。删除内容可能会导致状态不正确,这意味着集群在关闭后无法重启。

server/lib

包含用于自定义过滤器、自定义事件监听程序、JDBC 驱动程序、自定义 ServerTask 实现等的扩展 JAR 文件。

server/log

包含 Data Grid Server 日志文件。

第 2 章 配置 Data Grid 服务器网络

通过数据网格服务器,您可以配置接口和端口,使端点在网络上可用。

默认情况下,Data Grid 服务器多个x 端点到单个 TCP/IP 端口,并自动检测入站客户端请求的协议。

2.1. 服务器接口

Data Grid 服务器可以使用不同的策略来绑定到 IP 地址。

2.1.1. 地址策略

使用 inet-address 策略,将单个 公共接口 映射到 IPv4 回环地址(127.0.0.1)。

<interfaces>
  <interface name="public">
    <inet-address value="${infinispan.bind.address:127.0.0.1}"/>
  </interface>
</interfaces>
提示

您可以使用 CLI -b 参数或 infinispan.bind.address 属性从命令行选择特定地址。请参阅 更改默认绑定地址

2.1.2. 环回策略

选择回环地址。

  • IPv4 为回送地址保留了地址块 127.0.0.0/8
  • IPv6::1 是唯一的回环地址。
<interfaces>
    <interface name="public">
        <loopback/>
    </interface>
</interfaces>

2.1.3. 非循环策略

选择非回环地址。

<interfaces>
    <interface name="public">
        <non-loopback/>
    </interface>
</interfaces>

2.1.4. 网络地址策略

根据 IP 地址选择网络。

<interfaces>
    <interface name="public">
        <inet-address value="10.1.2.3"/>
    </interface>
</interfaces>

2.1.5. 任何地址策略

选择 INADDR_ANY 通配符地址。因此,Data Grid 服务器侦听所有接口。

<interfaces>
    <interface name="public">
        <any-address/>
    </interface>
</interfaces>

2.1.7. 站点本地策略

选择 site-local (专用)IP 地址。

  • IPv4 地址块 10.0.0.0/8,172.16.0.0/12, 和 192.168.0.0/16 保留用于站点本地寻址。
  • IPv6 为站点链路单播地址保留了地址块 fc00::/7
<interfaces>
    <interface name="public">
        <inet-address value="10.1.2.3"/>
    </interface>
</interfaces>

2.1.8. 匹配主机策略

解析主机名并选择分配给任何网络接口的 IP 地址之一。

Data Grid 服务器枚举所有可用的操作系统接口,以查找从配置中的主机名解析的 IP 地址。

<interfaces>
    <interface name="public">
        <match-host value="my_host_name"/>
    </interface>
</interfaces>

2.1.9. 匹配接口策略

选择分配给与正则表达式匹配的网络接口的 IP 地址。

Data Grid 服务器枚举所有可用的操作系统接口,以在您的配置中找到接口名称。

提示

将正则表达式与此策略一起使用以获得额外的灵活性。

<interfaces>
    <interface name="public">
        <match-interface value="eth0"/>
    </interface>
</interfaces>

2.1.10. 匹配地址策略

inet-address 类似,但使用正则表达式选择 IP 地址。

Data Grid 服务器枚举所有可用的操作系统接口,以查找您的配置中的 IP 地址。

提示

将正则表达式与此策略一起使用以获得额外的灵活性。

<interfaces>
    <interface name="public">
        <match-address value="132\..*"/>
    </interface>
</interfaces>

2.1.11. 回退策略

接口配置可以包含多个策略。Data Grid 服务器按声明的顺序尝试每个策略。

例如,在以下配置中,Data Grid 服务器首先尝试匹配主机,然后尝试一个 IP 地址,然后回退到 INADDR_ANY 通配符地址:

<interfaces>
    <interface name="public">
        <match-host value="my_host_name"/>
        <match-address value="132\..*"/>
        <any-address/>
    </interface>
</interfaces>

2.1.12. 更改 Data Grid 服务器的默认绑定地址

您可以使用 server -b 开关或 infinispan.bind.address 系统属性绑定到不同的地址。

例如,将 公共接口 绑定到 127.0.0.2,如下所示:

Linux
$ bin/server.sh -b 127.0.0.2
Windows
bin\server.bat -b 127.0.0.2

2.2. 套接字绑定

套接字绑定将端点连接器映射到服务器接口和端口。

默认情况下,Data Grid 服务器提供以下套接字绑定:

<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
    <socket-binding name="default" port="${infinispan.bind.port:11222}"/>
    <socket-binding name="memcached" port="11221"/>
</socket-bindings>
  • socket-bindings 声明默认的接口和端口偏移。
  • 默认 绑定到 hotrod 和 rest 连接器到默认端口 11222
  • Memcached 将 memcached 连接器绑定到端口 11221

    注意

    默认情况下禁用 memcached 端点。

要覆盖 socket-binding 声明的默认接口,请指定 interface 属性。

例如,您可以添加名为 "private" 的接口 声明:

<interfaces>
  ...
  <interface name="private">
    <inet-address value="10.1.2.3"/>
  </interface>
</interfaces>

然后,您可以在 socket-binding 声明中指定 interface="private" 来绑定到私有 IP 地址,如下所示:

<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
  ...
  <socket-binding name="private_binding" interface="private" port="1234"/>
</socket-bindings>

2.2.1. 指定端口偏移

在同一主机上运行多个实例时,使用 Data Grid 服务器配置端口偏移。默认端口偏移为 0。

使用带有 Data Grid CLI 或 infinispan.socket.binding.port-offset 系统属性的 -o 开关来设置端口偏移。

例如,启动偏移为 100 的服务器实例,如下所示:使用默认配置时,这会导致 Data Grid 服务器侦听端口 11322

Linux
$ bin/server.sh -o 100
Windows
bin\server.bat -o 100

2.3. 数据网格协议处理

数据网格服务器使用路由器连接器通过同一 TCP 端口 11222 公开多个协议。通过减少未授权用户的攻击面,将单个端口用于多个协议简化了配置和管理,并提高安全性。

数据网格服务器通过端口 11222 处理 HTTP/1.1、HTTP/2 和 Hot Rod 协议请求,如下所示:

HTTP/1.1 升级标头
客户端请求可以包含 HTTP/1.1 升级标头字段,以启动与 Data Grid 服务器的 HTTP/1.1 连接。然后,客户端应用程序可以发送 Upgrade: protocol 标头字段,其中 protocol 是 Data Grid 服务器端点。
Application-Layer Protocol Negotiation (ALPN)/Transport Layer Security (TLS)
客户端应用程序指定 Data Grid 服务器端点的 Server Name Indication (SNI)映射,以安全的方式协商协议。
自动 Hot Rod 检测
如果单一端口路由器配置包含 Hot Rod,则包含 Hot Rod 的客户端请求会自动路由到 Hot Rod。

2.3.1. 为 ALPN 配置客户端

配置客户端,以在 TLS 握手与 Data Grid 服务器期间为协议协商提供 ALPN 消息。

前提条件

  • 通过加密启用数据网格服务器端点。

流程

  1. 为您的客户端应用程序提供适当的库,以处理与 Data Grid 服务器的 ALPN/TLS 交换。

    注意

    Data Grid 为 Java 使用 Wildfly OpenSSL 绑定。

  2. 根据情况配置具有信任存储的客户端。

以编程方式

ConfigurationBuilder builder = new ConfigurationBuilder()
      .addServers("127.0.0.1:11222");

builder.security().ssl().enable()
      .trustStoreFileName("truststore.pkcs12")
      .trustStorePassword(DEFAULT_TRUSTSTORE_PASSWORD.toCharArray());

RemoteCacheManager remoteCacheManager = new RemoteCacheManager(builder.build());
RemoteCache<String, String> cache = remoteCacheManager.getCache("default"");

热 Rod 客户端属性

infinispan.client.hotrod.server_list = 127.0.0.1:11222
infinispan.client.hotrod.use_ssl = true
infinispan.client.hotrod.trust_store_file_name = truststore.pkcs12
infinispan.client.hotrod.trust_store_password = trust_store_password

第 3 章 配置 Data Grid Server 端点

Data Grid 服务器提供侦听器端点,用于处理来自远程客户端应用程序的请求。

3.1. Data Grid Endpoints

Data Grid 端点通过不同的连接器协议公开 CacheManager 接口,以便您可以远程访问数据并执行操作来管理和维护 Data Grid 集群。

您可以在不同的套接字绑定中定义多个端点连接器。

3.1.1. 热 Rod

热 Rod 是一种二进制 TCP 客户端-服务器协议,与基于文本的协议相比,提供更快的数据访问和提高性能。

Data Grid 以 Java、C++、C++、Node.js 和其他编程语言提供 Hot Rod 客户端库。

拓扑状态传输

Data Grid 使用拓扑缓存为客户端提供集群视图。拓扑缓存包含将内部 JGroups 传输地址映射到公开的 Hot Rod 端点的条目。

当客户端发送请求时,Data Grid 服务器会将请求标头中的拓扑 ID 与缓存中的拓扑 ID 进行比较。如果客户端有旧的拓扑 ID,则数据网格服务器会发送新的拓扑视图。

集群拓扑视图允许 Hot Rod 客户端在节点加入和离开时立即检测,从而启用动态负载平衡和故障转移。

在分布式缓存模式中,一致的哈希算法也使得 Hot Rod 客户端请求直接路由到主要所有者。

3.1.2. REST

参考

Data Grid 公开了一个 RESTful 接口,它允许 HTTP 客户端访问数据、监控和维护集群,以及执行管理操作。

您可以使用标准 HTTP 负载均衡器为客户端提供负载均衡和故障转移功能。但是,HTTP 负载均衡器会维护静态集群视图,并在集群拓扑更改时需要手动更新。

3.1.3. 协议比较

表 3.1. 参考
 热 RodHTTP / REST

Topology-aware

Y

N

hash-aware

Y

N

加密

Y

Y

身份验证

Y

Y

条件操作

Y

Y

bulk ops

Y

N

Transactions

Y

N

监听器

Y

N

查询

Y

Y

执行

Y

N

跨站点故障切换

Y

N

3.2. 端点连接器

您可以使用连接器声明配置数据网格服务器端点,用于指定套接字绑定、身份验证机制和加密配置。

默认端点连接器配置如下:

<endpoints socket-binding="default">
   <hotrod-connector name="hotrod"/>
   <rest-connector name="rest"/>
   <memcached-connector socket-binding="memcached"/>
</endpoints>
  • 端点 包含端点连接器声明,并为端点定义全局配置,如默认套接字绑定、安全域,以及客户端是否需要提供有效的 TLS 证书。
  • <HotRod-connector name="hotrod"/&gt; 声明一个 Hot Rod 连接器。
  • <REST-connector name="rest"/&gt; 声明一个 Hot Rod 连接器。
  • <memcached-connector socket-binding="memcached" /> 声明使用 memcached 套接字绑定的 Memcached 连接器。

参考

urn:infinispan:server 模式提供所有可用的端点配置。

3.2.1. 热 Rod Connectors

热 Rod 连接器声明启用 Hot Rod 服务器。

<hotrod-connector name="hotrod">
  <topology-state-transfer />
  <authentication>
    ...
  </authentication>
  <encryption>
    ...
  </encryption>
</hotrod-connector>
  • name="hotrod" 逻辑上命名 Hot Rod 连接器。
  • topology-state-transfer 调整为 Hot Rod 客户端提供集群拓扑的状态传输操作。
  • 身份验证配置 SASL 身份验证机制。
  • 加密 配置客户端连接的 TLS 设置。

参考

urn:infinispan:server 模式提供所有可用的 Hot Rod 连接器配置。

3.2.2. REST Connectors

REST 连接器声明启用 REST 服务器。

<rest-connector name="rest">
  <authentication>
    ...
  </authentication>
  <cors-rules>
    ...
  </cors-rules>
  <encryption>
    ...
  </encryption>
</rest-connector>
  • name="rest" 逻辑上命名 REST 连接器。
  • 身份验证配置 身份验证机制。
  • CORS -rules 为跨域请求指定 CORS (Cross Origin 资源共享)规则。
  • 加密 配置客户端连接的 TLS 设置。

参考

urn:infinispan:server 模式提供所有可用的 REST 连接器配置。

3.3. 数据网格服务器端口和协议

Data Grid Server 在您的网络上公开端点以进行远程客户端访问。

端口协议描述

11222

TCP

hot Rod 和 REST 端点

11221

TCP

Memcached 端点,默认为禁用。

3.3.1. 为远程连接配置网络防火墙

调整任何防火墙规则,以允许服务器和外部客户端之间的流量。

流程

例如,在 Red Hat Enterprise Linux (RHEL)工作站中,您可以使用 firewalld 允许到端口 11222 的流量,如下所示:

# firewall-cmd --add-port=11222/tcp --permanent
success
# firewall-cmd --list-ports | grep 11222
11222/tcp

要配置在网络间应用的防火墙规则,您可以使用 nftables 工具。

第 4 章 保护对 Data Grid 服务器的访问

配置身份验证和加密机制,以保护对数据的访问并保护您的数据。

4.1. 定义 Data Grid Server Security Realms

安全域为 Data Grid 服务器端点提供身份、加密、身份验证和授权信息。

4.1.1. 属性 Realms

属性域使用属性文件来定义用户和组。

users.properties 以纯文本格式将用户名映射到密码。如果您使用 DIGEST-MD5 SASL 机制或 Digest HTTP 机制,也可以预先提取密码。

myuser=a_password
user2=another_password

groups.properties 将用户映射到角色。

myuser=supervisor,reader,writer
user2=supervisor

属性域配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <properties-realm groups-attribute="Roles"> 1
            <user-properties path="users.properties" 2
                             relative-to="infinispan.server.config.path" 3
                             plain-text="true"/> 4
            <group-properties path="groups.properties" 5
                              relative-to="infinispan.server.config.path"/>
         </properties-realm>
      </security-realm>
   </security-realms>
</security>

1
将组定义为 Data Grid 服务器授权的角色。
2
指定 users.properties 文件。
3
指定该文件相对于 $ISPN_HOME/server/conf 目录。
4
指定 users.properties 中的密码采用纯文本格式。
5
指定 groups.properties 文件。

支持的验证机制

属性域支持以下身份验证机制:

  • sasl: PLAIN,DIGEST114, 和 SCRAM114
  • HTTP (REST): BasicDigest
4.1.1.1. 创建和修改用户

Data Grid Server 要求用户对默认属性域进行身份验证。在访问 Data Grid Server 之前,您必须至少创建一个用户和密码来添加凭证。您还可以添加和修改用户所属的安全授权组。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 使用 user 命令创建和修改 Data Grid 用户。
提示

使用 命令,运行 help user 的更多详细信息。

创建用户和密码

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!"
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!"

创建具有组成员资格的用户

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!" -g supervisor,reader,writer
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!" -g supervisor,reader,writer

4.1.2. LDAP 域

LDAP 域连接到 LDAP 服务器,如 OpenLDAP、红帽目录服务器、Apache 目录服务器或 Microsoft Active Directory,以验证用户并获取成员资格信息。

注意

LDAP 服务器可以有不同的条目布局,具体取决于服务器和部署的类型。因此,LDAP 域配置比较复杂。本文档超出了本文档的范围,为所有可能的配置提供示例。

LDAP 域配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
        <ldap-realm name="ldap" 1
                    url="ldap://my-ldap-server:10389" 2
                    principal="uid=admin,ou=People,dc=infinispan,dc=org" 3
                    credential="strongPassword"
                    connection-timeout="3000" read-timeout="30000" 4
                    connection-pooling="true" referral-mode="ignore"
                    page-size="30"
                    direct-verification="true"> 5
            <identity-mapping rdn-identifier="uid" 6
                              search-dn="ou=People,dc=infinispan,dc=org"> 7
               <attribute-mapping> 8
                  <attribute from="cn"
                             to="Roles"
                             filter="(&amp;(objectClass=groupOfNames)(member={1}))"
                             filter-dn="ou=Roles,dc=infinispan,dc=org"/>
               </attribute-mapping>
            </identity-mapping>
         </ldap-realm>
      </security-realm>
   </security-realms>
</security>

1
将 LDAP 域命名为。
2
指定 LDAP 服务器连接 URL。
3
指定要连接到 LDAP 服务器的主体和凭证。
重要

LDAP 连接的主体必须具有执行 LDAP 查询和访问特定属性所需的权限。

4
(可选)通过指定连接超时等来调优 LDAP 服务器连接。
5
验证用户凭据。Data Grid 会尝试使用配置的凭证连接到 LDAP 服务器。或者,您可以使用 user-password-mapper 元素来指定密码。
6
将 LDAP 条目映射到身份。rdn-identifier 指定一个 LDAP 属性,它根据提供的标识符查找用户条目,通常是用户名;例如 uidsAMAccountName 属性。
7
定义一个起始上下文,将搜索限制为包含用户条目的 LDAP 子树。
8
检索用户所属的所有组。通常可通过两种方式存储成员资格信息:
  • 在组条目下,通常在 member 属性中具有 class groupOfNames。在这种情况下,您可以使用属性过滤器,如上例配置中所示。此过滤器搜索与提供的过滤器匹配的条目,该条目将找到与用户的 DN 相等的 成员属性 的组。然后,过滤器提取组条目的 CN (由 指定),并将其添加到用户的 Roles 中。
  • memberOf 属性的用户条目中。在这种情况下,您应该使用如下属性引用:

    <attribute-reference reference="memberOf" from="cn" to="Roles" />

    此引用从用户条目中获取所有 memberOf 属性,提取由 指定的 CN,并将它们添加到用户的 Roles 中。

支持的验证机制

LDAP 域直接支持以下身份验证机制:

  • sasl: PLAIN,DIGEST114, 和 SCRAM114
  • HTTP (REST): BasicDigest
4.1.2.1. LDAP Realm Principal Rewriting

有些 SASL 身份验证机制,如 GSSAPIGS2-KRB5Negotiate,提供需要 清理 的用户名,然后才能使用它来搜索 LDAP 服务器。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <ldap-realm name="ldap"
                     url="ldap://${org.infinispan.test.host.address}:10389"
                     principal="uid=admin,ou=People,dc=infinispan,dc=org"
                     credential="strongPassword">
            <name-rewriter> 1
               <regex-principal-transformer name="domain-remover"
                                            pattern="(.*)@INFINISPAN\.ORG"
                                            replacement="$1"/>
            </name-rewriter>
            <identity-mapping rdn-identifier="uid"
                              search-dn="ou=People,dc=infinispan,dc=org">
               <attribute-mapping>
                  <attribute from="cn" to="Roles"
                             filter="(&amp;(objectClass=groupOfNames)(member={1}))"
                             filter-dn="ou=Roles,dc=infinispan,dc=org" />
               </attribute-mapping>
               <user-password-mapper from="userPassword" />
            </identity-mapping>
         </ldap-realm>
      </security-realm>
   </security-realms>
</security>
1
定义使用正则表达式从主体中提取用户名的重写器。

4.1.3. 信任存储域

信任存储域使用密钥存储,其中包含允许连接到 Data Grid 服务器的所有客户端的公共证书。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <keystore path="server.p12" 1
                         relative-to="infinispan.server.config.path" 2
                         keystore-password="secret" 3
                         alias="server"/> 4
            </ssl>
         </server-identities>
         <truststore-realm path="trust.p12" 5
                           relative-to="infinispan.server.config.path"
                           keystore-password="secret"/>
      </security-realm>
   </security-realms>
</security>
1
使用包含服务器证书的密钥存储提供 SSL 服务器身份。
2
指定该文件相对于 $ISPN_HOME/server/conf 目录。
3
指定密钥存储密码。
4
指定密钥存储别名。
5
提供包含所有客户端公共证书的密钥存储。

支持的验证机制

信任存储域使用 client-certificate 身份验证机制:

  • SASL: EXTERNAL
  • HTTP (REST): CLIENT_CERT

4.1.4. 令牌域

令牌域使用外部服务来验证令牌,并需要与 RFC-7662 (OAuth2 Token Introspection)兼容的提供程序,如 Red Hat SSO。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <token-realm name="token"
                      auth-server-url="https://oauth-server/auth/"> 1
            <oauth2-introspection
                    introspection-url="https://oauth-server/auth/realms/infinispan/protocol/openid-connect/token/introspect" 2
                    client-id="infinispan-server" 3
                    client-secret="1fdca4ec-c416-47e0-867a-3d471af7050f"/> 4
         </token-realm>
      </security-realm>
   </security-realms>
</security>
1
指定身份验证服务器的 URL。
2
指定令牌内省端点的 URL。
3
为 Data Grid 服务器命名客户端标识符。
4
指定 Data Grid 服务器的客户端 secret。

支持的验证机制

令牌域支持以下身份验证机制:

  • SASL: OAUTH BEARER
  • HTTP (REST): Bearer

4.2. 创建 Data Grid Server Identities

服务器身份在安全域中定义,并使数据网格服务器能够将其身份证明给客户端。

4.2.1. 设置 SSL 标识

SSL 身份使用密钥存储,该密钥存储包含证书或证书链。

注意

如果安全域包含 SSL 身份,Data Grid 服务器会自动为使用这些安全域的端点启用加密。

流程

  1. 为 Data Grid 服务器创建密钥存储。

    重要

    数据网格服务器支持以下密钥存储格式:JKS、JCEKS、PKCS12、BKS、BCFKS 和 UBER。

    在生产环境中,服务器证书应由可信证书颁发机构(包括 Root 或 Intermediate CA)签名。

  2. 将密钥存储添加到 $ISPN_HOME/server/conf 目录中。
  3. 向 Data Grid 服务器安全域添加服务器身份 定义。
  4. 指定密钥存储的名称以及密码和别名。
4.2.1.1. SSL 身份配置

以下示例为 Data Grid 服务器配置 SSL 身份:

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities> 1
            <ssl> 2
               <keystore path="server.p12" 3
                         relative-to="infinispan.server.config.path" 4
                         keystore-password="secret" 5
                         alias="server"/> 6
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
1
定义 Data Grid 服务器的身份。
2
为 Data Grid 服务器配置 SSL 身份。
3
命名包含 Data Grid 服务器 SSL 证书的密钥存储。
4
指定密钥存储相对于 $ISPN_HOME 中的 server/conf 目录。
5
指定密钥存储密码。
6
指定密钥存储别名。
4.2.1.2. 自动生成密钥存储

配置 Data Grid 服务器,以在启动时自动生成密钥存储。

重要

自动生成的密钥存储:

  • 不应该在生产环境中使用。
  • 在需要时生成;例如,从客户端获取第一个连接时。
  • 包含您可以在 Hot Rod 客户端中使用的证书。

流程

  1. 在服务器配置中包含 keystore 元素的 generate-self-signed-certificate-host 属性。
  2. 为服务器证书指定主机名作为值。

带有生成的密钥存储的 SSL 服务器身份

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret"
                         alias="server"
                         generate-self-signed-certificate-host="localhost"/> 1
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>

1
使用 localhost生成密钥存储
4.2.1.3. 调优 SSL 协议和加密套件

您可以通过 Data Grid 服务器 SSL 身份配置 SSL 引擎,以使用特定的协议和密码。

重要

您必须确保为您要使用的协议功能设置正确的密码;例如 HTTP/2 ALPN。

流程

  1. engine 元素添加到您的 Data Grid 服务器 SSL 身份。
  2. 使用 enabled-protocolsenabled-ciphersuites 属性配置 SSL 引擎。

SSL 引擎配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0
          https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret" alias="server"/>
               <engine enabled-protocols="TLSv1.2 TLSv1.1" 1
                       enabled-ciphersuites="SSL_RSA_WITH_AES_128_GCM_SHA256 2
                       SSL_RSA_WITH_AES_128_CBC_SHA256"/>
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>

1
将 SSL 引擎配置为使用 TLS v1 和 v2 协议。
2
配置 SSL 引擎以使用指定的密码套件。

4.2.2. 设置 Kerberos 标识

Kerberos 身份使用 keytab 文件,其中包含来自 Kerberos 密码的服务主体名称和加密密钥。

注意

keytab 文件可以包含用户和服务帐户主体。但是,Data Grid 服务器只使用服务主体。因此,Data Grid 服务器可以为客户端提供身份,并允许客户端与 Kerberos 服务器进行身份验证。

在大多数情况下,您可以为 Hot Rod 和 REST 连接器创建唯一的主体。例如,您在"INFINISPAN.ORG"域中有一个"datagrid"服务器。在这种情况下,您应该创建以下服务主体:

  • HotRod/datagrid@INFINISPAN.ORG 标识 Hot Rod 服务。
  • HTTP/datagrid@INFINISPAN.ORG 标识 REST 服务。

流程

  1. 为 Hot Rod 和 REST 服务创建 keytab 文件。

    Linux
    $ ktutil
    ktutil:  addent -password -p datagrid@INFINISPAN.ORG -k 1 -e aes256-cts
    Password for datagrid@INFINISPAN.ORG: [enter your password]
    ktutil:  wkt http.keytab
    ktutil:  quit
    Microsoft Windows
    $ ktpass -princ HTTP/datagrid@INFINISPAN.ORG -pass * -mapuser INFINISPAN\USER_NAME
    $ ktab -k http.keytab -a HTTP/datagrid@INFINISPAN.ORG
  2. 将 keytab 文件复制到 $ISPN_HOME/server/conf 目录中。
  3. 向 Data Grid 服务器安全域添加服务器身份 定义。
  4. 指定为 Hot Rod 和 REST 连接器提供服务主体的 keytab 文件的位置。
  5. 将 Kerberos 服务主体命名为。
4.2.2.1. Kerberos 身份配置

以下示例为 Data Grid 服务器配置 Kerberos 身份:

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities> 1
            <kerberos keytab-path="hotrod.keytab" 2
                      principal="hotrod/datagrid@INFINISPAN.ORG" 3
                      required="true"/> 4
            <kerberos keytab-path="http.keytab" 5
                      principal="HTTP/localhost@INFINISPAN.ORG" 6
                      required="true"/>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
1
定义 Data Grid 服务器的身份。
2
指定为 Hot Rod 连接器提供 Kerberos 身份的 keytab 文件。
3
为 Hot Rod 连接器命名 Kerberos 服务主体。
4
指定 Data Grid 服务器启动时必须存在 keytab 文件。
5
指定为 REST 连接器提供 Kerberos 身份的 keytab 文件。
6
为 REST 连接器命名 Kerberos 服务主体。

4.3. 配置端点身份验证机制

使用 SASL 或 HTTP 身份验证机制配置 Hot Rod 和 REST 连接器,以与客户端进行身份验证。

Data Grid 服务器需要用户身份验证才能访问命令行界面(CLI)和控制台以及 Hot Rod 和 REST 端点。Data Grid 服务器还根据您定义的安全域自动配置身份验证机制。

4.3.1. Data Grid 服务器身份验证

Data Grid 服务器根据您分配给端点的安全域自动配置身份验证机制。

SASL 身份验证机制

以下 SASL 身份验证机制适用于 Hot Rod 端点:

Security RealmSASL 身份验证机制

属性 Realms 和 LDAP Realms

SCRAMJPEG, DIGEST可以, CRAM-MD5

令牌域

OAUTHBEARER

信任 Realms

EXTERNAL

Kerberos Identities

GSSAPI, GS2-KRB5

SSL/TLS 标识

PLAIN

HTTP 身份验证机制

以下 HTTP 身份验证机制适用于 REST 端点:

Security RealmHTTP 身份验证机制

属性 Realms 和 LDAP Realms

摘要

令牌域

BEARER_TOKEN

信任 Realms

CLIENT_CERT

Kerberos Identities

SPNEGO

SSL/TLS 标识

BASIC

默认配置

Data Grid 服务器提供了一个名为 "default" 的安全域,它使用一个属性 realm,在 $RHDG_HOME/server/ conf/users.properties 中定义的纯文本凭证,如以下代码片段所示:

<security-realm name="default">
  <properties-realm groups-attribute="Roles">
    <user-properties path="users.properties"
                     relative-to="infinispan.server.config.path"
                     plain-text="true"/>
    <group-properties path="groups.properties"
                      relative-to="infinispan.server.config.path" />
  </properties-realm>
</security-realm>

端点配置将"默认"安全域分配给 Hot Rod 和 REST 连接器,如下所示:

<endpoints socket-binding="default" security-realm="default">
  <hotrod-connector name="hotrod"/>
  <rest-connector name="rest"/>
</endpoints>

由于上述配置,Data Grid 服务器需要使用属性 realm 支持的机制进行身份验证。

4.3.2. 手动配置 Hot Rod 身份验证

明确配置 Hot Rod 连接器身份验证,以覆盖 Data Grid 服务器用于安全域的默认 SASL 身份验证机制。

流程

  1. 在 Hot Rod 连接器配置中添加 身份验证 定义。
  2. 指定 Hot Rod 连接器用来进行身份验证的 Data Grid 安全域。
  3. 指定要使用的 Hot Rod 端点的 SASL 身份验证机制。
  4. 根据需要配置 SASL 身份验证属性。
4.3.2.1. 热 Rod 身份验证配置

带有 SCRAM、DIGEST 和 PLAIN 验证的热 Rod 连接器

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0
           https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default"> 1
   <hotrod-connector name="hotrod">
      <authentication>
         <sasl mechanisms="SCRAM-SHA-512 SCRAM-SHA-384 SCRAM-SHA-256 2
                           SCRAM-SHA-1 DIGEST-SHA-512 DIGEST-SHA-384
                           DIGEST-SHA-256 DIGEST-SHA DIGEST-MD5 PLAIN"
               server-name="infinispan" 3
               qop="auth"/> 4
      </authentication>
   </hotrod-connector>
</endpoints>

1
启用针对名为 "default" 的安全域进行身份验证。
2
指定用于身份验证的 SASL 机制。
3
定义 Data Grid 服务器声明给客户端的名称。服务器名称应与客户端配置匹配。
4
启用 auth QoP。

带有 Kerberos 验证的热 Rod 连接器

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default">
   <hotrod-connector name="hotrod">
      <authentication>
         <sasl mechanisms="GSSAPI GS2-KRB5" 1
               server-name="datagrid" 2
               server-principal="hotrod/datagrid@INFINISPAN.ORG"/> 3
      </authentication>
   </hotrod-connector>
</endpoints>

1
为 Kerberos 身份验证启用 GSSAPIGS2-KRB5 机制。
2
定义 Data Grid 服务器名称,它等同于 Kerberos 服务名称。
3
指定服务器的 Kerberos 身份。
4.3.2.2. 热 Rod 端点身份验证机制

Data Grid 支持带有 Hot Rod 连接器的以下 SASL 验证机制:

身份验证机制描述相关详情

PLAIN

以纯文本格式使用凭据。您应该只在加密连接中使用 PLAIN 身份验证。

基本 HTTP 机制类似。

DIGEST-*

使用哈希算法和非ce 值。热 Rod 连接器支持 DIGEST-MD 5、DIGEST-SHA -256、DIGEST-SHA-256DIGEST-SHA-384DIGEST-SHA-512 哈希算法,以强度顺序。

Digest HTTP 机制类似。

SCRAM-*

除了哈希算法和非ce 值外,还使用 salt 值。热 Rod 连接器支持 SCRAM-SHASCRAM-SHA-256SCRAM-SHA-384SCRAM-SHA-512 哈希算法(按强度排序)。

Digest HTTP 机制类似。

GSSAPI

使用 Kerberos 票据并需要一个 Kerberos 域控制器。您必须在 realm 配置中添加对应的 kerberos 服务器身份。在大多数情况下,您还指定一个 ldap-realm 来提供用户成员资格信息。

SPNEGO HTTP 机制类似。

GS2-KRB5

使用 Kerberos 票据并需要一个 Kerberos 域控制器。您必须在 realm 配置中添加对应的 kerberos 服务器身份。在大多数情况下,您还指定一个 ldap-realm 来提供用户成员资格信息。

SPNEGO HTTP 机制类似。

EXTERNAL

使用客户端证书。

CLIENT_CERT HTTP 机制类似。

OAUTHBEARER

使用 OAuth 令牌并需要一个 token-realm 配置。

与EARER _TOKEN HTTP 机制类似。

4.3.2.3. SASL 服务质量(QoP)

如果 SASL 机制支持完整性和隐私保护设置,您可以使用 qop 属性将它们添加到 Hot Rod 连接器配置中。

QoP 设置描述

auth

仅进行身份验证。

auth-int

使用完整性保护进行身份验证。

auth-conf

使用完整性和隐私保护进行身份验证。

4.3.2.4. SASL 策略

SASL 策略可让您控制哪些身份验证机制 Hot Rod 连接器可以使用。

策略描述默认值

forward-secrecy

只使用支持会话之间转发保密的 SASL 机制。这意味着破坏一个会话不会自动提供破坏未来会话的信息。

false

pass-credentials

仅使用需要客户端凭证的 SASL 机制。

false

no-plain-text

不要使用易受简单纯文本攻击的 SASL 机制。

false

no-active

不要使用易受活跃、非字典、攻击的 SASL 机制。

false

无字典

不要使用易受被动字典攻击的 SASL 机制。

false

no-anonymous

不要使用接受匿名登录的 SASL 机制。

true

提示

数据网格缓存授权根据角色和权限限制对缓存的访问。如果配置缓存授权,您可以设置 < no-anonymous value=false /&gt; 以允许匿名登录并将访问逻辑委派给缓存授权。

使用 SASL 策略配置的热 Rod 连接器

<hotrod-connector socket-binding="hotrod" cache-container="default">
   <authentication security-realm="ApplicationRealm">
      <sasl server-name="myhotrodserver"
            mechanisms="PLAIN DIGEST-MD5 GSSAPI EXTERNAL" 1
            qop="auth">
         <policy> 2
            <no-active value="true" />
            <no-anonymous value="true" />
            <no-plain-text value="true" />
         </policy>
      </sasl>
   </authentication>
</hotrod-connector>

1
为 Hot Rod 连接器指定多个 SASL 身份验证机制。
2
定义 SASL 机制的策略。

由于上述配置,Hot Rod 连接器使用 GSSAPI 机制,因为它是唯一适用于所有策略的机制。

4.3.3. 手动配置 REST 身份验证

明确配置 REST 连接器身份验证,以覆盖 Data Grid 服务器用于安全域的默认 HTTP 身份验证机制。

流程

  1. 在 REST 连接器配置中添加 身份验证 定义。
  2. 指定 REST 连接器用来进行身份验证的 Data Grid 安全域。
  3. 指定要使用的 REST 端点的身份验证机制。
4.3.3.1. REST 身份验证配置

带有 BASIC 和 DIGEST 验证的 REST 连接器

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default"> 1
   <rest-connector name="rest">
      <authentication mechanisms="DIGEST BASIC"/> 2
   </rest-connector>
</endpoints>

1
启用针对名为 "default" 的安全域进行身份验证。
2
指定用于身份验证的 SASL 机制

带有 Kerberos 验证的 REST 连接器

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default">
   <rest-connector name="rest">
      <authentication mechanisms="SPNEGO" 1
                      server-principal="HTTP/localhost@INFINISPAN.ORG"/> 2
   </rest-connector>
</endpoints>

1
为 Kerberos 验证启用 SPENGO 机制。
2
指定服务器的 Kerberos 身份。
4.3.3.2. REST 端点身份验证机制

Data Grid 通过 REST 连接器支持以下验证机制:

身份验证机制描述相关详情

BASIC

以纯文本格式使用凭据。您应该只使用带有加密连接的 BASIC 身份验证。

对应于 基本 HTTP 验证方案,类似于 PLAIN SASL 机制。

摘要

使用哈希算法和非ce 值。REST 连接器支持 SHA-512SHA-256MD5 哈希算法。

对应于 Digest HTTP 验证方案,类似于 DIGESTGPU SASL 机制。

SPNEGO

使用 Kerberos 票据并需要一个 Kerberos 域控制器。您必须在 realm 配置中添加对应的 kerberos 服务器身份。在大多数情况下,您还指定一个 ldap-realm 来提供用户成员资格信息。

对应于 Negotiate HTTP 验证方案,类似于 GSSAPIGS2-KRB5 SASL 机制。

BEARER_TOKEN

使用 OAuth 令牌并需要一个 token-realm 配置。

对应于 Bearer HTTP 身份验证方案,类似于 OAUTHBEARER SASL 机制。

CLIENT_CERT

使用客户端证书。

EXTERNAL SASL 机制类似。

4.4. 禁用 Data Grid 服务器身份验证

在本地开发环境或隔离的网络中,您可以配置 Data Grid 服务器以允许未经身份验证的客户端请求。

流程

  1. 从端点配置中删除任何 security-realm 属性。
  2. 确保 Hot Rod 和 REST 连接器不包含任何 身份验证 定义。

例如,以下配置允许未经身份验证的对 Data Grid 的访问:

<endpoints socket-binding="default">
  <hotrod-connector name="hotrod"/>
  <rest-connector name="rest"/>
</endpoints>

4.5. 配置数据网格授权

授权限制了使用 Data Grid 和 access 数据执行操作的功能。您可以使用具有不同权限级别的角色分配用户。

4.5.1. Data Grid Authorization

借助 Data Grid,您可以配置授权来保护缓存管理器和缓存实例。当用户应用程序或客户端试图对安全缓存管理器和缓存执行操作时,它们必须提供一个有足够权限的角色来执行该操作。

例如,您可以在特定的缓存实例上配置授权,以便调用 Cache.get () 需要分配具有 read 权限的角色,而 Cache.put () 需要具有写入权限的角色。

在这种情况下,如果具有 reader 角色的用户应用程序或客户端尝试编写条目,则 Data Grid 会拒绝请求并抛出安全异常。如果具有 writer 角色的用户应用程序或客户端发送写入请求,则数据网格会验证授权,并为后续操作发布令牌。

身份到角色映射

身份是类型为 java.security.Principal 的安全主体。使用 javax.security.auth.Subject 类实施的主题代表一组安全主体。换句话说,Subject 代表一个用户以及它所属的所有组。

Data Grid 使用角色映射器,以便安全主体与代表一个或多个权限的角色对应。

下图演示了安全主体如何映射到角色:

4.5.1.1. 权限

通过限制您可以执行的操作来控制对缓存管理器和缓存的访问权限。权限也可以应用到指定缓存等特定实体。

表 4.1. 缓存管理器权限
权限功能描述

配置

defineConfiguration

定义新的缓存配置。

LISTEN

addListener

针对缓存管理器注册监听程序。

生命周期

stop

停止缓存管理器。

ALL

-

包括所有缓存管理器权限。

表 4.2. 缓存权限
权限功能描述

READ

Get包含

从缓存检索条目。

放置 , put IfAbsent,replace,remove,eviction

写入、替换、删除、驱除缓存中的数据。

EXEC

distexec,stream

允许针对缓存执行代码。

LISTEN

addListener

针对缓存注册监听程序。

BULK_READ

keySet,values,entrySet,query

执行批量检索操作。

BULK_WRITE

清除,putAll

执行批量写入操作。

生命周期

启动,stop

启动和停止缓存。

ADMIN

getVersion,addInterceptor*, removeInterceptor,getInterceptorChain,getEvictionManager,getComponentRegistry,getDistributionManager,getAuthorizationManager,evict,getRpcManager,getCacheConfiguration,getCacheManager, getInvocationContextContainer,setAvailability,getDataContainer,getStats,getXAResource

允许访问底层组件和内部结构。

ALL

-

包括所有缓存权限。

ALL_READ

-

组合了 READ 和 BULK_READ 权限。

ALL_WRITE

-

组合 WRITE 和 BULK_WRITE 权限。

合并权限

您可能需要组合权限,以便它们很有用。例如,要允许"supervisors"运行流操作,但限制"标准"用户仅放置并获得,您可以定义以下映射:

<role name="standard" permission="READ WRITE" />
<role name="supervisors" permission="READ WRITE EXEC BULK"/>
4.5.1.2. 角色映射程序

Data Grid 包括了一个 PrincipalRoleMapper API,它将 Subject 中的安全主体映射到授权角色。默认有两个角色映射器:

IdentityRoleMapper

使用 Principal 名称作为角色名称。

  • Java class: org.infinispan.security.mappers.IdentityRoleMapper
  • 声明性配置:&lt ;identity-role-mapper />
CommonNameRoleMapper

如果主体名称是可辨识名称(DN),则使用 Common Name (CN)作为角色名称。例如,cn=managers,ou=people,dc=example,dc=com DN 映射到 managers 角色。

  • Java class: org.infinispan.security.mappers.CommonRoleMapper
  • 声明性配置: &lt ;common-name-role-mapper />

您还可以使用实现 org.infinispan.security.PrincipalRoleMapper 接口的自定义角色映射程序。要以声明性方式配置自定义角色映射程序,请使用: &lt ;custom-role-mapper class="my.custom.RoleMapper" />

4.5.2. 声明性配置授权

infinispan.xml 文件中配置授权。

流程

  1. cache-container 中配置全局授权设置,用于指定角色映射器,并定义一组角色和权限。
  2. 配置缓存授权,以根据用户角色限制访问权限。

    <infinispan>
       <cache-container default-cache="secured" name="secured">
          <security>
             <authorization> 1
                <identity-role-mapper /> 2
                <role name="admin" permissions="ALL" /> 3
                <role name="reader" permissions="READ" />
                <role name="writer" permissions="WRITE" />
                <role name="supervisor" permissions="READ WRITE EXEC"/>
             </authorization>
          </security>
          <local-cache name="secured">
             <security>
                <authorization/> 4
             </security>
          </local-cache>
       </cache-container>
    </infinispan>
    1
    为 Cache Manager 启用 Data Grid 授权。
    2
    指定 PrincipalRoleMapper 的实现,它将 Principals 映射到角色。
    3
    定义角色及其关联的权限。
    4
    隐式添加全局配置中的所有角色。

    如果您不想将所有角色应用到缓存,请明确定义授权缓存的角色,如下所示:

    <infinispan>
       <cache-container default-cache="secured" name="secured">
          <security>
             <authorization>
                <identity-role-mapper />
                <role name="admin" permissions="ALL" />
                <role name="reader" permissions="READ" />
                <role name="writer" permissions="WRITE" />
                <role name="supervisor" permissions="READ WRITE EXEC"/>
             </authorization>
          </security>
          <local-cache name="secured">
             <security>
                <authorization roles="admin supervisor reader"/> 1
             </security>
          </local-cache>
       </cache-container>
    
    </infinispan>
    1
    定义缓存的授权角色。在本例中,只有 writer 角色的用户没有授权"secured"缓存。Data Grid 拒绝来自这些用户的任何访问请求。

第 5 章 设置 Data Grid 集群

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

5.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

    jar 文件位于 $RHDG_HOME/lib 目录中。

  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>
      1
      default-jgroups-udp.xml 用于集群传输。
    • 在启动服务器时使用 cluster-stack 参数:

      $ bin/server.sh --cluster-stack=udp

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

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack udp

参考

5.1.1. 默认 JGroups Stacks

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

文件名堆栈名称描述

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 节点。

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

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

默认端口协议描述

7800

TCP/UDP

JGroups 集群绑定端口

46655

UDP

JGroups 多播

跨站点复制

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

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

5.2. 自定义 JGroups 堆栈

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

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

流程

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

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

    <infinispan>
      <jgroups>
        <stack name="my-stack" extends="tcp"> 1
        </stack>
      </jgroups>
    </infinispan>
    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>
    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>
    1
    配置 Data Grid,以将 "my-stack" 用于集群传输。
  6. 检查 Data Grid 日志,以确保它使用堆栈。

    [org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack my-stack

参考

5.2.1. 继承属性

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

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

    描述

    组合

    覆盖协议属性。

    REPLACE

    替换协议。

    INSERT_AFTER

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

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

    删除

    从堆栈中删除协议。

5.3. 使用 JGroups 系统属性

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

流程

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

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

$ bin/server.sh -Djgroups.bind.port=1234 -Djgroups.bind.address=192.0.2.0

5.3.1. JGroups 堆栈的系统属性

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

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

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

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

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

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

jgroups.dns.query

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

没有默认值。

必需

Google Cloud Platform

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

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

jgroups.google.bucket_name

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

没有默认值。

必需

5.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>
    1
    包含一个或多个 JGroups 堆栈定义。
    2
    定义一个名为 "prod" 的自定义 JGroups 堆栈。
    3
    将 Data Grid 配置为使用 "prod" 进行集群传输。

5.5. 使用外部 JGroups 堆栈

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

流程

  1. 将自定义 JGroups 堆栈文件添加到 $RHDG_HOME/server/conf 目录中。

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

  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>
    1
    创建名为"prod-tcp"的堆栈,它使用 "prod-jgroups-tcp.xml" 定义。
    2
    配置数据网格,以将 "prod-tcp" 用于集群传输。

5.6. 集群发现协议

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

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

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

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

5.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>

参考

5.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>

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

5.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>

5.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>

5.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>

重要

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

5.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>

参考

5.7. 加密集群传输

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

5.7.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 密钥。

5.7.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>
    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>

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

[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it

参考

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

5.7.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>
    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>

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

[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it

参考

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

第 6 章 远程创建数据网格缓存

将缓存添加到 Data Grid 服务器,以便您可以存储数据。

6.1. 使用 Data Grid Server 进行缓存配置

缓存在 Data Grid 服务器上配置数据容器。

您可以通过控制台、命令行界面(CLI)、Hot Rod 端点或 REST 端点添加基于 org.infinispan 模板或 Data Grid 配置的定义在运行时创建缓存。

重要

当您在运行时创建缓存时,Data Grid 服务器在集群中复制缓存定义。

您直接在 infinispan.xml 中声明的配置不会在 Data Grid 集群中自动同步。在这种情况下,您应该使用 Ansible 或 Chef 等配置来将配置传播到集群中的所有节点。

6.2. 默认缓存管理器

Data Grid Server 提供默认的缓存管理器配置。当您启动 Data Grid Server 时,它会实例化 Cache Manager,以便您可以在运行时远程创建缓存。

默认缓存管理器

<cache-container name="default" 1
                 statistics="true"> 2
  <transport cluster="${infinispan.cluster.name:cluster}" 3
             stack="${infinispan.cluster.stack:tcp}" 4
             node-name="${infinispan.node.name:}"/> 5
</cache-container>

1
创建名为"default"的缓存管理器。
2
通过 指标端点 导出缓存管理器统计信息。
3
添加 JGroups 集群传输,允许 Data Grid 服务器互相自动发现并形成集群。
4
将默认 TCP 堆栈用于集群流量。
5
节点的独立名称,在集群中必须是唯一的。默认使用统一主机名。

检查缓存管理器

启动 Data Grid Server 并添加用户凭证后,您可以通过命令行界面(CLI)或 REST 端点访问默认的缓存管理器,如下所示:

  • CLI:在默认容器中使用 describe 命令。

    [//containers/default]> describe
  • rest: 在任何浏览器中导航到 <server_hostname>:11222/rest/v2/cache-managers/default/

6.3. 使用 Data Grid 控制台创建缓存

通过 Data Grid 控制台从模板或配置文件动态添加缓存。

前提条件

创建用户,并至少启动一个 Data Grid 服务器实例。

流程

  1. 在任何浏览器中导航到 <server_hostname>:11222/console/
  2. 登录到控制台。
  3. 打开 Data Container 视图。
  4. 选择 Create Cache,然后从模板或以 XML 或 JSON 格式使用 Data Grid 配置添加缓存。
  5. 返回到 Data Container 视图,并验证您的 Data Grid 缓存。

6.4. 使用 Data Grid Command Line Interface (CLI)创建缓存

使用 Data Grid CLI 以 XML 或 JSON 格式从模板或配置文件添加缓存。

前提条件

创建用户,并至少启动一个 Data Grid 服务器实例。

流程

  1. 创建与 Data Grid 的 CLI 连接。
  2. 使用 create cache 命令添加缓存定义。

    • 使用 --file 选项,从 XML 或 JSON 文件添加缓存定义。

      [//containers/default]> create cache --file=configuration.xml mycache
    • 使用 --template 选项从模板创建缓存定义。

      [//containers/default]> create cache --template=org.infinispan.DIST_SYNC mycache
      提示

      --template= 参数后按 tab 键以列出可用的缓存模板。

  3. 使用 ls 命令验证缓存是否存在。

    [//containers/default]> ls caches
    mycache
  4. 使用 describe 命令检索缓存配置。

    [//containers/default]> describe caches/mycache

6.5. 使用 Hot Rod 客户端创建缓存

通过 RemoteCacheManager API 在 Data Grid Server 上以编程方式创建缓存。

注意

以下流程演示了使用 Hot Rod Java 客户端进行编程缓存创建。但是,Hot Rod 客户端以 Javascript 或 C++ 等不同语言提供。

前提条件

  • 创建用户,并至少启动一个 Data Grid 服务器实例。
  • 获取 Hot Rod Java 客户端。

流程

  1. 使用 ConfigurationBuilder 类配置您的客户端。

    import org.infinispan.client.hotrod.RemoteCacheManager;
    import org.infinispan.client.hotrod.DefaultTemplate;
    import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
    import org.infinispan.commons.configuration.XMLStringConfiguration;
    ...
    
    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.addServer()
             .host("127.0.0.1")
             .port(11222)
           .security().authentication()
              .enable()
              .username("username")
              .password("password")
              .realm("default")
              .saslMechanism("DIGEST-MD5");
    
    manager = new RemoteCacheManager(builder.build());
  2. 使用 XMLStringConfiguration 类以 XML 格式添加缓存定义。
  3. 调用 getOrCreateCache () 方法,以添加缓存(如果已存在)或创建缓存(如果不存在)。

    private void createCacheWithXMLConfiguration() {
        String cacheName = "CacheWithXMLConfiguration";
        String xml = String.format("<infinispan>" +
                                      "<cache-container>" +
                                      "<distributed-cache name=\"%s\" mode=\"SYNC\"
                                      statistics=\"true\">" +
                                        "<locking isolation=\"READ_COMMITTED\"/>" +
                                        "<transaction mode=\"NON_XA\"/>" +
                                        "<expiration lifespan=\"60000\" interval=\"20000\"/>" +
                                      "</distributed-cache>" +
                                      "</cache-container>" +
                                    "</infinispan>"
                                    , cacheName);
        manager.administration().getOrCreateCache(cacheName, new XMLStringConfiguration(xml));
        System.out.println("Cache created or already exists.");
    }
  4. 使用 org.infinispan 模板创建缓存,如下例所示,使用 createCache () 调用:

    private void createCacheWithTemplate() {
        manager.administration().createCache("myCache", "org.infinispan.DIST_SYNC");
        System.out.println("Cache created.");
    }

后续步骤

尝试一些工作代码示例,其中演示了如何使用 Hot Rod Java 客户端创建远程缓存。访问 Data Grid Tutorials

6.6. 使用 HTTP 客户端创建数据网格缓存

使用任何合适的 HTTP 客户端通过 REST 端点向 Data Grid 服务器添加缓存定义。

前提条件

创建用户,并至少启动一个 Data Grid 服务器实例。

流程

  • 使用 POST 请求到 /rest/v2/caches/$cacheName 创建缓存。

通过在请求有效负载中包含 XML 或 JSON 配置。

POST /rest/v2/caches/mycache

使用 ?template= 参数从 org.infinispan 模板创建缓存。

POST /rest/v2/caches/mycache?template=org.infinispan.DIST_SYNC

6.7. Data Grid 配置

以 XML 和 JSON 格式进行数据网格配置。

6.7.1. XML 配置

XML 格式的数据网格配置必须符合架构并包括:

  • <Infinispan& gt; root 元素。
  • <cache-container&gt; 定义。

XML 配置示例

<infinispan>
    <cache-container>
        <distributed-cache name="myCache" mode="SYNC">
          <encoding media-type="application/x-protostream"/>
          <memory max-count="1000000" when-full="REMOVE"/>
        </distributed-cache>
    </cache-container>
</infinispan>

6.7.2. JSON 配置

以 JSON 格式的数据网格配置:

  • 仅要求缓存定义。
  • 必须遵循 XML 配置的结构。

    • XML 元素成为 JSON 对象。
    • XML 属性成为 JSON 字段。

JSON 配置示例

{
  "distributed-cache": {
    "name": "myCache",
    "mode": "SYNC",
    "encoding": {
      "media-type": "application/x-protostream"
      },
    "memory": {
      "max-count": 1000000,
      "when-full": "REMOVE"
    }
  }
}

第 7 章 配置 Data Grid Server Datasources

创建受管数据源,以优化数据库连接的连接池和性能。

您可以将数据库连接属性指定为 JDBC 缓存存储配置的一部分。但是,您必须为每个缓存定义执行此操作,通过创建多个不同的连接池来重复配置并浪费资源。

通过使用共享、管理的数据源,您可以集中连接配置和池,以便更有效地使用。

7.1. JDBC 缓存存储的数据源配置

数据源的数据网格服务器配置由两个部分组成:

  • 定义如何连接到数据库的 连接工厂
  • 定义如何池和重复利用连接的连接池。
<data-sources>
   <data-source name="ds" jndi-name="jdbc/datasource" statistics="true"> 1
      <connection-factory driver="org.database.Driver" 2
                          username="db_user" 3
                          password="secret" 4
                          url="jdbc:db://database-host:10000/dbname" 5
                          new-connection-sql="SELECT 1" 6
                          transaction-isolation="READ_COMMITTED"> 7
         <connection-property name="name">value</connection-property> 8
      </connection-factory>
      <connection-pool
         initial-size="1" 9
         max-size="10" 10
         min-size="3" 11
         background-validation="1000" 12
         idle-removal="1" 13
         blocking-timeout="1000" 14
         leak-detection="10000"/> 15
   </data-source>
</data-sources>
1
定义数据源名称、JNDI 名称,以及是否启用统计集合。
2
指定创建连接的 JDBC 驱动程序。将驱动程序 JAR 放在 server/lib 目录中。
3
指定连接的用户名。
4
为连接指定对应的密码。
5
指定特定于正在使用的驱动程序的 JDBC URL。
6
添加验证新连接的查询。
7
为连接配置其中一个事务隔离级别: NONEREAD_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READ、SERIZABLE.
8
设置可选的 JDBC 驱动程序的连接属性。
9
定义池包含的初始连接数。
10
设置池中连接的最大数量。
11
设置池应包含的最小连接数。
12
指定后台验证运行之间的时间(以毫秒为单位)。
13
指定连接被删除前可以保持闲置的时间(以分钟为单位)。
14
指定在等待连接时阻止的时间(以毫秒为单位),在等待连接后抛出异常。
15
指定在发生泄漏警告前可以保存连接的时间(以毫秒为单位)。

7.2. 在 JDBC Cache Stores 中使用 Datasources

在 JDBC 缓存存储配置中使用共享管理的数据源,而不是为每个缓存定义指定单独的连接属性。

前提条件

在您的 Data Grid 服务器配置中为 JDBC 缓存存储创建一个受管数据源。

流程

  • 在缓存配置的 JDBC 缓存存储配置中引用数据源的 JNDI 名称,如下例所示:
<distributed-cache-configuration name="persistent-cache" xmlns:jdbc="urn:infinispan:config:store:jdbc:11.0">
    <persistence>
        <jdbc:string-keyed-jdbc-store>
            <jdbc:data-source jndi-url="jdbc/postgres"/> 1
            <jdbc:string-keyed-table drop-on-exit="true"
                          create-on-start="true"
                          prefix="TBL">
                <jdbc:id-column name="ID" type="VARCHAR(255)"/>
                <jdbc:data-column name="DATA" type="BYTEA"/>
                <jdbc:timestamp-column name="TS" type="BIGINT"/>
                <jdbc:segment-column name="S" type="INT"/>
            </jdbc:string-keyed-table>
        </jdbc:string-keyed-jdbc-store>
    </persistence>
</distributed-cache-configuration>
1
指定您为 Data Grid 服务器配置中数据源连接提供的 JNDI 名称。

第 8 章 远程执行服务器侧任务

定义并添加可从 Data Grid 命令行界面、REST API 或 Hot Rod 客户端调用的 Data Grid 服务器的任务。

您可以将任务实施为自定义 Java 类,也可以使用 JavaScript 等语言定义脚本。

8.1. 创建服务器任务

创建自定义任务实施,并将它们添加到 Data Grid 服务器中。

8.1.1. 服务器任务

Data Grid 服务器任务是扩展 org.infinispan.tasks.ServerTask 接口且通常包括以下方法调用的类:

setTaskContext()
允许访问执行上下文信息,包括任务参数、对执行任务的缓存引用,等等。在大多数情况下,实施将此信息存储在本地,并在实际执行任务时使用这些信息。
getName()
返回任务的唯一名称。客户端使用这些名称调用任务。
getExecutionMode()

返回任务的执行模式。

  • TaskExecutionMode.ONE_NODE 仅处理请求的节点执行该脚本。虽然脚本仍然可以调用集群操作。
  • TaskExecutionMode.ALL_NODES Data Grid 使用集群 executors 在节点间运行脚本。例如,需要在单个节点上执行调用流处理的服务器任务,因为流处理被分发到所有节点。
call()
计算结果。此方法在 java.util.concurrent.Callable 接口中定义,并通过服务器任务调用。
重要

服务器任务实施必须遵循服务加载程序模式要求。例如,实施必须具有零参数构造器。

以下 HelloTask 类实现提供了一个示例任务,它有一个参数:

package example;

import org.infinispan.tasks.ServerTask;
import org.infinispan.tasks.TaskContext;

public class HelloTask implements ServerTask<String> {

   private TaskContext ctx;

   @Override
   public void setTaskContext(TaskContext ctx) {
      this.ctx = ctx;
   }

   @Override
   public String call() throws Exception {
      String name = (String) ctx.getParameters().get().get("name");
      return "Hello " + name;
   }

   @Override
   public String getName() {
      return "hello-task";
   }

}

8.1.2. 在 Data Grid 服务器中部署服务器任务

将自定义服务器任务类添加到 Data Grid 服务器。

前提条件

停止任何正在运行的 Data Grid 服务器。Data Grid 不支持自定义类的运行时部署。

流程

  1. 将服务器任务实施打包在 JAR 文件中。
  2. 添加 META-INF/services/org.infinispan.tasks.ServerTask 文件,其中包含服务器任务的完全限定域名,例如:

    example.HelloTask
  3. 将 JAR 文件复制到 Data Grid 服务器的 $RHDG_HOME/server/lib 目录中。
  4. 将您的类添加到 Data Grid 配置中的 deserialization whitelist 中。或者,使用系统属性设置白名单。

8.2. 创建服务器脚本

创建自定义脚本并将其添加到 Data Grid 服务器中。

8.2.1. 服务器脚本

Data Grid 服务器脚本基于 javax.script API,兼容任何基于 JVM 的 ScriptEngine 实施。

hello World 脚本示例

以下是在单个 Data Grid 服务器上运行的简单示例,具有一个参数,并使用 JavaScript:

// mode=local,language=javascript,parameters=[greetee]
"Hello " + greetee

运行前面的脚本时,您将传递 greetee 参数的值,Data Grid 返回 "Hello ${value}"

8.2.1.1. 脚本元数据

元数据提供有关在运行脚本时数据网格服务器使用的脚本的附加信息。

脚本元数据是添加到脚本第一行中的注释的 property=value 对,如下例所示:

// name=test, language=javascript
// mode=local, parameters=[a,b,c]
  • 使用与脚本语言(//;;, #)匹配的注释样式。
  • 使用逗号分隔 property=value 对。
  • 使用单引号(')或双引号(")分隔值。
表 8.1. 元数据属性
属性描述

模式

定义 exection 模式,并具有以下值:

local 仅处理请求的节点执行该脚本。虽然脚本仍然可以调用集群操作。

分布式 数据网格使用集群 executors 在节点间运行脚本。

语言

指定执行脚本的 ScriptEngine。

extension

指定文件名扩展作为设置 ScriptEngine 的替代方法。

role

指定用户必须执行脚本的角色。

parameters

指定此脚本的有效参数名称数组。指定此列表中不包含的参数的调用会导致异常。

datatype

(可选)设置用于存储数据的 MediaType (MIME 类型),以及参数和返回值。此属性仅适用于仅支持特定数据格式的远程客户端。

目前,您只能设置 text/plain;charset=utf-8 使用 String UTF-8 格式进行数据。

8.2.1.2. 脚本绑定

Data Grid 将内部对象公开为脚本执行的绑定。

绑定描述

缓存

指定运行脚本的缓存。

marshaller

指定用于将数据序列化到缓存的 marshaller。

cacheManager

指定缓存的 cacheManager

scriptingManager

指定运行脚本的脚本管理器的实例。您可以使用此绑定从脚本运行其他脚本。

8.2.1.3. 脚本参数

借助 Data Grid,您可以将命名参数作为运行脚本的绑定传递。

参数是 name,value 对,其中 name 是字符串,value 是 marshaller 可以解释的任何值。

以下示例脚本有两个参数,即 multiplicandmultiplier。脚本采用 multiplicand 的值,并将该值乘以 倍数

// mode=local,language=javascript
multiplicand * multiplier

运行前面的脚本时,Data Grid 会以表达式评估的结果进行响应。

8.2.2. 将脚本添加到 Data Grid 服务器

使用命令行界面向 Data Grid 服务器添加脚本。

前提条件

Data Grid 服务器将脚本存储在 ___script_cache 缓存中。如果您启用缓存授权,用户需要 ___script_manager 角色来访问 ___script_cache

流程

  1. 根据需要定义脚本。

    例如,创建一个名为 multiplication.js 的文件,该文件在单一 Data Grid 服务器上运行,有两个参数,并使用 JavaScript 来多次使用给定值:

    // mode=local,language=javascript
    multiplicand * multiplier
  2. 创建与 Data Grid 的 CLI 连接。
  3. 使用 task 命令上传脚本,如下例所示:

    [//containers/default]> task upload --file=multiplication.js multiplication
  4. 验证您的脚本是否可用。

    [//containers/default]> ls tasks
    multiplication

8.2.3. 以编程方式创建脚本

使用 Hot Rod RemoteCache 接口添加脚本,如下例所示:

RemoteCache<String, String> scriptCache = cacheManager.getCache("___script_cache");
scriptCache.put("multiplication.js",
  "// mode=local,language=javascript\n" +
  "multiplicand * multiplier\n");

8.3. 运行服务器端任务和脚本

在 Data Grid 服务器上执行任务和自定义脚本。

8.3.1. 运行任务和脚本

使用命令行界面在 Data Grid 集群中运行的任务和脚本。

流程

  1. 创建与 Data Grid 的 CLI 连接。
  2. 使用 task 命令运行任务和脚本,如下例所示:

    • 执行名为 multipler.js 的脚本并指定两个参数:

      [//containers/default]> task exec multipler.js -Pmultiplicand=10 -Pmultiplier=20
      200.0
    • 执行名为 @@cache@names 的任务,以检索所有可用缓存的列表:

      //containers/default]> task exec @@cache@names
      ["___protobuf_metadata","mycache","___script_cache"]

8.3.2. 以编程方式运行脚本

调用 execute () 方法以使用 Hot Rod RemoteCache 接口运行脚本,如下例所示:

RemoteCache<String, Integer> cache = cacheManager.getCache();
// Create parameters for script execution.
Map<String, Object> params = new HashMap<>();
params.put("multiplicand", 10);
params.put("multiplier", 20);
// Run the script with the parameters.
Object result = cache.execute("multiplication.js", params);

8.3.3. 以编程方式运行任务

调用 execute () 方法以使用 Hot Rod RemoteCache 接口运行任务,如下例所示:

// Add configuration for a locally running server.
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host("127.0.0.1").port(11222);

// Connect to the server.
RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build());

// Retrieve the remote cache.
RemoteCache<String, String> cache = cacheManager.getCache();

// Create task parameters.
Map<String, String> parameters = new HashMap<>();
parameters.put("name", "developer");

// Run the server task.
String greet = cache.execute("hello-task", parameters);
System.out.println(greet);

第 9 章 监控数据网格服务器

9.1. 使用 Data Grid 服务器日志

Data Grid 使用 Apache Log4j 2 提供可配置的日志机制,用于捕获环境和记录缓存操作的详细信息,以进行故障排除和根本原因分析。

9.1.1. Data Grid 日志文件

Data Grid 将日志消息写入以下目录:
$RHDG_HOME/${infinispan.server.root}/log

server.log
以人类可读格式的消息,包括与服务器启动相关的引导日志。
在启动服务器时,Data Grid 默认创建此文件。
server.log.json
JSON 格式的消息,允许您解析和分析 Data Grid 日志。
在启用 JSON-FILE 附加程序时,Data Grid 会创建此文件。

9.1.2. 配置数据网格日志属性

您可以使用 log4j2.xml 配置 Data Grid 日志,该日志在 Log4j 2 manual 中进行了描述。

流程

  1. 使用任何文本编辑器打开 $RHDG_HOME/${infinispan.server.root}/conf/log4j2.xml
  2. 根据需要更改日志记录配置。
  3. 保存并关闭 log4j2.xml
9.1.2.1. 日志级别

日志级别表示消息的性质和严重性。

日志级别描述

TRACE

细粒度调试消息,通过应用程序捕获单个请求的流。

DEBUG

常规调试消息,与单个请求无关。

INFO

有关应用程序整体进度的消息,包括生命周期事件。

WARN

可能导致错误或降低性能的事件。

ERROR

可能会阻止操作或激活成功但不会阻止应用程序运行的错误条件。

FATAL

可能导致关键服务失败和应用程序关闭的事件。

除了上面提供的单个消息级别外,配置还允许另外两个值: ALL 包含所有消息,OFF 排除所有消息。

9.1.2.2. Data Grid Log Categories

Data Grid 为 INFO,WARN,ERROR,FATAL 级别提供按功能区域组织日志的类别。

org.infinispan.CLUSTER
特定于 Data Grid 集群的消息,其中包括状态传输操作、重新平衡事件、分区等。
org.infinispan.CONFIG
特定于 Data Grid 配置的消息。
org.infinispan.CONTAINER
特定于过期和驱除操作的数据容器、缓存侦听器通知、事务等。
org.infinispan.PERSISTENCE
特定于缓存加载程序和存储的消息。
org.infinispan.SECURITY
特定于 Data Grid 安全性的消息。
org.infinispan.SERVER
特定于 Data Grid 服务器的消息。
org.infinispan.XSITE
特定于跨站点复制操作的消息。
9.1.2.3. 日志应用程序

日志附加程序定义 Data Grid 记录日志消息的方式。

控制台
将日志消息写入主机标准输出(stdout)或标准错误(stderr)流。
默认使用 org.apache.logging.log4j.core.appender.ConsoleAppender 类。
FILE
将日志消息写入文件。
默认使用 org.apache.logging.log4j.core.appender.RollingFileAppender 类。
JSON-FILE
将日志消息写入 JSON 格式的文件。
默认使用 org.apache.logging.log4j.core.appender.RollingFileAppender 类。
9.1.2.4. 日志模式

CONSOLEFILE 附加程序使用 PatternLayout 来根据 模式 格式化日志消息。

例如,FILE appender 中的默认模式:
%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p (%t)[%c Array] %m%throwable%n

  • %d{yyyy-MM-dd HH:mm:ss,SSS} 添加当前时间和日期。
  • %-5p 指定日志级别,与右侧一致。
  • % T 添加当前线程的名称。
  • %c consumption 添加日志记录类别的短名称。
  • % M 添加日志消息。
  • %throwable 添加异常堆栈追踪。
  • %n 添加新行。

PatternLayout 文档 完全描述了模式。

9.1.2.5. 启用并配置 JSON 日志处理程序

Data Grid 提供了一个 JSON 日志处理程序,以 JSON 格式写入消息。

前提条件

确保 Data Grid 未在运行。您无法动态启用日志处理程序。

流程

  1. 使用任何文本编辑器打开 $RHDG_HOME/${infinispan.server.root}/conf/log4j2.xml
  2. 取消注释 JSON-FILE 附加程序并注释掉 FILE 附加器:

          <!--<AppenderRef ref="FILE"/>-->
          <AppenderRef ref="JSON-FILE"/>
  3. (可选)配置 JSON 附加器 和布局
  4. 保存并关闭 logging.properties

当您启动 Data Grid 时,它会在以下文件中将每个日志消息写为 JSON 映射:
$RHDG_HOME/${infinispan.server.root}/log/server.log.json

9.1.3. 访问日志

热 Rod 和 REST 端点可使用以下类别将所有入站客户端请求记录为日志条目:

  • org.infinispan.HOTROD_ACCESS_LOG 日志记录类别用于 Hot Rod 端点。
  • org.infinispan.REST_ACCESS_LOG 日志记录类别用于 REST 端点。
9.1.3.1. 启用访问日志

默认情况下,禁用 Hot Rod 和 REST 端点的访问日志。要启用任一日志记录类别,请在 Data Grid 日志记录配置中将级别设置为 TRACE,如下例所示:

<Logger name="org.infinispan.HOTROD_ACCESS_LOG" additivity="false" level="TRACE">
   <AppenderRef ref="HR-ACCESS-FILE"/>
</Logger>
9.1.3.2. 访问日志属性

访问日志的默认格式如下:

%X{address} %X{user} [%d{dd/MMM/yyyy:HH:mm:ss Z}] &quot;%X{method} %m
%X{protocol}&quot; %X{status} %X{requestSize} %X{responseSize} %X{duration}%n

以上格式会创建日志条目,如下所示:

127.0.0.1 - [DD/MM/YYYY:HH:MM:SS +0000] "PUT /rest/v2/caches/default/key HTTP/1.1" 404 5 77 10

日志记录属性使用 %X{name} 表示法,并允许您修改访问日志的格式。以下是默认的日志记录属性:

属性描述

address

X-Forwarded-For 标头或客户端 IP 地址。

user

主体名称,如果使用身份验证。

方法

使用的方法。PUTGET 等等。

protocol

使用的协议。HTTP/1.1HTTP/ 2、WildROD/2.9 等。

status

REST 端点的 HTTP 状态代码。Hot Rod 端点的 OK 或例外。

requestSize

请求的大小,以字节为单位。

responseSize

响应的大小(以字节为单位)。

duration

服务器处理请求的毫秒数。

提示

使用前缀为 h: 的标头名称来记录请求中包含的标头;例如: %X{h:User-Agent}

9.2. 配置统计、指标和 JMX

启用数据网格导出到 MicroProfile 指标端点或通过 JMX MBeans 统计信息。您还可以注册 JMX MBeans 来执行管理操作。

9.2.1. 启用 Data Grid Statistics

借助 Data Grid,您可以为缓存管理器和缓存启用统计信息。但是,为缓存管理器启用统计信息不会为其控制的缓存启用统计信息。您必须明确启用缓存的统计信息。

注意

默认情况下,Data Grid 服务器为缓存管理器启用统计信息。

流程

  • 以声明性方式或以编程方式启用统计信息。

声明性

<cache-container statistics="true"> 1
  <local-cache name="mycache" statistics="true"/> 2
</cache-container>

1
为 Cache Manager 启用统计信息。
2
为指定缓存启用统计信息。

以编程方式

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  .cacheContainer().statistics(true) 1
  .build();

 ...

Configuration config = new ConfigurationBuilder()
  .statistics().enable() 2
  .build();

1
为 Cache Manager 启用统计信息。
2
为指定缓存启用统计信息。

9.2.2. 启用 Data Grid Metrics

配置 Data Grid 以导出量表和直方图。

流程

  • 以声明性方式或以编程方式配置指标。

声明性

<cache-container statistics="true"> 1
  <metrics gauges="true" histograms="true" /> 2
</cache-container>

1
计算和收集有关缓存管理器的统计信息。
2
将收集的统计信息导出为量表和直方图指标。

以编程方式

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  .statistics().enable() 1
  .metrics().gauges(true).histograms(true) 2
  .build();

1
计算和收集有关缓存管理器的统计信息。
2
将收集的统计信息导出为量表和直方图指标。

9.2.3. 收集数据网格指标

使用 Prometheus 等监控工具来收集数据网格指标。

前提条件

  • 启用统计信息。如果没有启用统计信息,Data Grid 为指标提供 0-1 值。
  • (可选)启用直方图。默认情况下,Data Grid 生成量表,但不生成直方图。

流程

  • 获取 Prometheus (OpenMetrics)格式的指标:

    $ curl -v http://localhost:11222/metrics
  • 以 MicroProfile JSON 格式获取指标:

    $ curl --header "Accept: application/json" http://localhost:11222/metrics

后续步骤

配置监控应用程序以收集数据网格指标。例如,将以下内容添加到 prometheus.yml 中:

static_configs:
    - targets: ['localhost:11222']

参考

9.2.4. 配置数据网格以注册 JMX MBeans

Data Grid 可以注册可以用来收集统计信息并执行管理操作的 JMX MBeans。但是,您必须将统计信息单独启用到 JMX,否则 Data Grid 都为所有统计属性提供 0 值。

流程

  • 以声明性方式或以编程方式启用 JMX。

声明性

<cache-container>
  <jmx enabled="true" /> 1
</cache-container>

1
注册数据网格 JMX MBeans.

以编程方式

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  .jmx().enable() 1
  .build();

1
注册数据网格 JMX MBeans.
9.2.4.1. Data Grid MBeans

Data Grid 公开了代表可管理资源的 JMX MBeans。

org.infinispan:type=Cache
可用于缓存实例的属性和操作。
org.infinispan:type=CacheManager
可用于缓存管理器的属性和操作,包括数据网格缓存和集群健康统计信息。

有关可用 JMX MBeans 的完整列表以及描述和可用的操作和属性,请参阅 Data Grid JMX 组件 文档。

9.3. 检索服务器健康统计

使用以下方法监控 Data Grid 集群的健康状态:

  • 使用 embeddedCacheManager.getHealth () 方法调用进行编程。
  • JMX MBeans
  • Data Grid REST Server

9.3.1. 通过 JMX 访问 Health API

通过 JMX 检索 Data Grid 集群健康统计信息。

流程

  1. 使用任何 JMX 功能工具(如 JConsole)连接到 Data Grid 服务器,并导航到以下对象:

    org.infinispan:type=CacheManager,name="default",component=CacheContainerHealth
  2. 选择可用的 MBeans 来检索集群运行状况统计。

9.3.2. 通过 REST 访问 Health API

通过 REST API 获取 Data Grid 集群健康状况。

流程

  • 调用 GET 请求以检索集群健康状况。

    GET /rest/v2/cache-managers/{cacheManagerName}/health

Data Grid 使用 JSON 文档响应,如下所示:

{
    "cluster_health":{
        "cluster_name":"ISPN",
        "health_status":"HEALTHY",
        "number_of_nodes":2,
        "node_names":[
            "NodeA-36229",
            "NodeB-28703"
        ]
    },
    "cache_health":[
        {
            "status":"HEALTHY",
            "cache_name":"___protobuf_metadata"
        },
        {
            "status":"HEALTHY",
            "cache_name":"cache2"
        },
        {
            "status":"HEALTHY",
            "cache_name":"mycache"
        },
        {
            "status":"HEALTHY",
            "cache_name":"cache1"
        }
    ]

}
提示

获取缓存管理器状态,如下所示:

GET /rest/v2/cache-managers/{cacheManagerName}/health/status

参考

如需更多信息,请参阅 REST v2 (版本 2)API 文档。

第 10 章 为 Data Grid 服务器执行滚动升级

执行数据网格集群的滚动升级,以便在版本之间更改,而不会停机或数据丢失。滚动升级通过 Hot Rod 将您的数据同时迁移到目标版本。

10.1. 设置目标集群

创建一个运行目标 Data Grid 版本的集群,并使用远程缓存存储从源集群加载数据。

前提条件

  • 使用目标升级版本安装 Data Grid 集群。
重要

确保目标集群的网络属性不会与源集群的网络属性重叠。您应该在 JGroups 传输配置中为目标和源集群指定唯一名称。根据您的环境,您还可以使用不同的网络接口并指定端口偏移来保持目标和源集群分开。

流程

  1. 在目标集群上为您要从源集群迁移的每个缓存添加一个 RemoteCacheStore

    远程缓存存储使用 Hot Rod 协议从远程网格集群检索数据。将远程缓存存储添加到目标集群时,它可以从源集群中完全加载数据来处理客户端请求。

  2. 将客户端切换到目标集群,以便它开始处理所有请求。

    1. 使用目标集群的位置更新客户端配置。
    2. 重新启动客户端。

10.1.1. Rolling 升级的远程缓存存储

您必须使用特定的远程缓存存储配置来执行滚动升级,如下所示:

<persistence passivation="false"> 1
   <remote-store xmlns="urn:infinispan:config:store:remote:11.0"
                 cache="myDistCache" 2
                 protocol-version="2.5" 3
                 hotrod-wrapping="true" 4
                 raw-values="true" 5
                 segmented="false"> 6
      <remote-server host="127.0.0.1" port="11222"/> 7
   </remote-store>
</persistence>
1
禁用 passivation。用于滚动升级的远程缓存存储必须禁用传递。
2
与源集群中的缓存名称匹配。目标集群使用远程缓存存储从此缓存中加载数据。
3
与源集群的 Hot Rod 协议版本匹配。2.5 是最低版本,适用于任何升级路径。您不需要设置另一个 Hot Rod 版本。
4
确保条目以合适的格式嵌套为 Hot Rod 协议。
5
以原始格式将数据存储在远程缓存存储中。这样可确保客户端直接使用远程缓存存储中的数据。
6
为远程缓存存储禁用分段。只有在目标集群中的片段数量与源集群中的缓存数量匹配时,才应为远程缓存启用分段存储。
7
指向源集群的位置。

10.2. 将数据同步到目标集群

当目标集群正在运行并处理使用远程缓存存储的客户端请求时,您可以按需加载数据,您可以将源集群的数据同步到目标集群。

此操作从源集群读取数据并将其写入目标集群。数据会并行迁移到目标集群中的所有节点,每个节点都接收数据的子集。您必须在 Data Grid 配置中为每个缓存执行同步。

流程

  1. 在您要迁移到目标集群的数据网格配置中启动每个缓存的同步操作。

    使用 Data Grid REST API,并通过 ?action=sync- data 参数调用 POST 请求。例如,要将名为"myCache"的数据从源集群同步到目标集群,请执行以下操作:

    POST /v2/caches/myCache?action=sync-data

    当操作完成后,Data Grid 使用复制到目标集群的条目总数进行响应。

    或者,您可以通过在 RollingUpgradeManager MBean 上调用 synchronizeData (migratorName=hotrod) 来使用 JMX。

  2. 断开目标集群中的每个节点与源集群的连接。

    例如,要从源集群断开"myCache"缓存,请调用以下 POST 请求:

    POST /v2/caches/myCache?action=disconnect-source

    要使用 JMX,请在 RollingUpgradeManager MBean 上调用 disconnectSource (migratorName=hotrod)

后续步骤

同步源集群中的所有数据后,滚动升级过程已完成。现在,您可以停用源集群。

第 11 章 Data Grid Servers 故障排除

收集 Data Grid 服务器部署的诊断信息,并执行故障排除步骤以解决问题。

11.1. 获取 Data Grid 服务器的诊断报告

Data Grid 服务器在 tar.gz 存档中提供聚合报告,其中包含有关 Data Grid 服务器和主机的诊断信息。除了配置和日志文件外,该报告还提供有关 CPU、内存、打开文件、网络套接字和路由线程的详细信息。

流程

  1. 创建与 Data Grid 的 CLI 连接。
  2. 使用 server report 命令下载 tar.gz 归档:

    [//containers/default]> server report
    Downloaded report 'infinispan-<hostname>-<timestamp>-report.tar.gz'
  3. tar.gz 文件移动到您文件系统中合适的位置。
  4. 使用任何归档工具提取 tar.gz 文件。

11.2. 在运行时更改 Data Grid Server Logging 配置

在运行时修改 Data Grid 服务器的日志记录配置,以临时调整日志记录来排除问题并执行根本原因分析。

通过 CLI 修改日志记录配置是一种运行时操作,这意味着更改:

  • 不会保存到 log4j2.xml 文件中。重启服务器节点或整个集群会将日志记录配置重置为 log4j2.xml 文件中的默认属性。
  • 仅在调用 CLI 时应用到集群中的节点。更改日志记录配置后加入集群的节点使用默认属性。

流程

  1. 创建与 Data Grid 的 CLI 连接。
  2. 使用 日志记录 进行所需的调整。

    • 列出服务器中定义的所有附加程序:
[//containers/default]> logging list-appenders

前面的命令返回:

{
  "STDOUT" : {
    "name" : "STDOUT"
  },
  "JSON-FILE" : {
    "name" : "JSON-FILE"
  },
  "HR-ACCESS-FILE" : {
    "name" : "HR-ACCESS-FILE"
  },
  "FILE" : {
    "name" : "FILE"
  },
  "REST-ACCESS-FILE" : {
    "name" : "REST-ACCESS-FILE"
  }
}
  • 列出服务器上定义的所有日志记录器配置:
[//containers/default]> logging list-loggers

前面的命令返回:

[ {
  "name" : "",
  "level" : "INFO",
  "appenders" : [ "STDOUT", "FILE" ]
}, {
  "name" : "org.infinispan.HOTROD_ACCESS_LOG",
  "level" : "INFO",
  "appenders" : [ "HR-ACCESS-FILE" ]
}, {
  "name" : "com.arjuna",
  "level" : "WARN",
  "appenders" : [ ]
}, {
  "name" : "org.infinispan.REST_ACCESS_LOG",
  "level" : "INFO",
  "appenders" : [ "REST-ACCESS-FILE" ]
} ]
  • 使用 set 子命令添加和修改日志记录器配置

例如,以下命令将 org.infinispan 软件包的日志级别设置为 DEBUG

[//containers/default]> logging set --level=DEBUG org.infinispan
  • 使用 remove 子命令删除现有日志记录器配置。

例如,以下命令会删除 org.infinispan logger 配置,这意味着改为使用 root 配置:

[//containers/default]> logging remove org.infinispan

11.3. 资源统计

您可以使用 stats 命令检查 Data Grid 服务器中的某些资源的 server-collected 统计信息。

从收集统计信息(容器、缓存)的资源上下文中使用 stats 命令,或使用指向此类资源的路径:

[//containers/default]> stats
{
  "statistics_enabled" : true,
  "number_of_entries" : 0,
  "hit_ratio" : 0.0,
  "read_write_ratio" : 0.0,
  "time_since_start" : 0,
  "time_since_reset" : 49,
  "current_number_of_entries" : 0,
  "current_number_of_entries_in_memory" : 0,
  "total_number_of_entries" : 0,
  "off_heap_memory_used" : 0,
  "data_memory_used" : 0,
  "stores" : 0,
  "retrievals" : 0,
  "hits" : 0,
  "misses" : 0,
  "remove_hits" : 0,
  "remove_misses" : 0,
  "evictions" : 0,
  "average_read_time" : 0,
  "average_read_time_nanos" : 0,
  "average_write_time" : 0,
  "average_write_time_nanos" : 0,
  "average_remove_time" : 0,
  "average_remove_time_nanos" : 0,
  "required_minimum_number_of_nodes" : -1
}
[//containers/default]> stats /containers/default/caches/mycache
{
  "time_since_start" : -1,
  "time_since_reset" : -1,
  "current_number_of_entries" : -1,
  "current_number_of_entries_in_memory" : -1,
  "total_number_of_entries" : -1,
  "off_heap_memory_used" : -1,
  "data_memory_used" : -1,
  "stores" : -1,
  "retrievals" : -1,
  "hits" : -1,
  "misses" : -1,
  "remove_hits" : -1,
  "remove_misses" : -1,
  "evictions" : -1,
  "average_read_time" : -1,
  "average_read_time_nanos" : -1,
  "average_write_time" : -1,
  "average_write_time_nanos" : -1,
  "average_remove_time" : -1,
  "average_remove_time_nanos" : -1,
  "required_minimum_number_of_nodes" : -1
}

第 12 章 参考

12.1. Data Grid Server 8.1.1 Readme

有关 Data Grid Server 11.0.9.Final-redhat-00001 发行版的信息。

12.1.1. 要求

Data Grid Server 需要 JDK 11 或更高版本。

12.1.2. 启动服务器

使用 服务器 脚本运行 Data Grid 服务器实例。

Unix / Linux

$RHDG_HOME/bin/server.sh

Windows

$RHDG_HOME\bin\server.bat

提示

包含 --help-h 选项以查看命令参数。

12.1.3. 停止服务器

使用 shutdown 命令和 CLI 执行安全关闭。

或者,从终端输入 Ctrl-C 以中断服务器进程或通过 TERM 信号终止它。

12.1.4. Configuration

服务器配置通过以下特定于服务器的元素扩展了数据网格配置:

cache-container
定义用于管理缓存生命周期的缓存容器。
端点
为客户端协议启用和配置端点连接器。
安全
配置端点安全域。
socket-bindings
将端点连接器映射到接口和端口。

默认的配置文件为 $RHDG_HOME/server/conf/infinispan.xml

使用带有 -c 参数的不同配置文件,如下例所示,该服务器在没有集群功能的情况下启动服务器:

Unix / Linux

$RHDG_HOME/bin/server.sh -c infinispan-local.xml

Windows

$RHDG_HOME\bin\server.bat -c infinispan-local.xml

12.1.5. 绑定地址

默认情况下,Data Grid 服务器绑定到网络上的 loopback IP 地址 localhost

使用 -b 参数设置不同的 IP 地址,如下例所示:

Unix / Linux

$RHDG_HOME/bin/server.sh -b 0.0.0.0

Windows

$RHDG_HOME\bin\server.bat -b 0.0.0.0

12.1.6. 绑定端口

默认情况下,Data Grid 服务器侦听端口 11222

使用 -p 参数设置替代端口:

Unix / Linux

$RHDG_HOME/bin/server.sh -p 30000

Windows

$RHDG_HOME\bin\server.bat -p 30000

12.1.7. 集群地址

Data Grid Server 配置定义了集群传输,以便同一网络上的多个实例相互发现并自动组成集群。

使用 -k 参数更改集群流量的 IP 地址:

Unix / Linux

$RHDG_HOME/bin/server.sh -k 192.168.1.100

Windows

$RHDG_HOME\bin\server.bat -k 192.168.1.100

12.1.8. 集群堆栈

JGroups 堆栈配置用于集群传输的协议。默认情况下,Data Grid 服务器使用 tcp 堆栈。

使用带有 -j 参数的替代集群堆栈,如下例所示,使用 UDP 进行集群传输:

Unix / Linux

$RHDG_HOME/bin/server.sh -j udp

Windows

$RHDG_HOME\bin\server.bat -j udp

12.1.9. 身份验证

Data Grid Server 需要身份验证。

使用 CLI 创建用户名和密码,如下所示:

Unix / Linux

$RHDG_HOME/bin/cli.sh user create username -p "qwer1234!"

Windows

$RHDG_HOME\bin\cli.bat user create username -p "qwer1234!"

12.1.10. 服务器主目录

Data Grid 服务器使用 infinispan.server.home.path 来查找主机文件系统上服务器分发的内容。

服务器主目录,称为 $RHDG_HOME,包含以下文件夹:

├── bin
├── boot
├── docs
├── lib
├── server
└── static
目录描述

/bin

包含用于启动服务器和 CLI 的脚本。

/boot

包含用于引导服务器的 JAR 文件。

/docs

提供配置示例、架构、组件许可证和其他资源。

/lib

包含服务器内部需要的 JAR 文件。
不要将自定义 JAR 文件放在这个文件夹中。

/server

为 Data Grid 服务器实例提供根文件夹。

/static

包含 Data Grid 控制台的静态资源。

12.1.11. 服务器根目录

Data Grid 服务器使用 infinispan.server.root.path 来查找 Data Grid 服务器实例的配置文件和数据。

您可以在相同目录或不同的目录中创建多个服务器根文件夹,然后使用 -s--server-root 参数指定位置,如下例所示:

Unix / Linux

$RHDG_HOME/bin/server.sh -s server2

Windows

$RHDG_HOME\bin\server.bat -s server2

每个服务器根目录都包含以下文件夹:

├── server
│   ├── conf
│   ├── data
│   ├── lib
│   └── log
目录描述系统属性覆盖

/server/conf

包含服务器配置文件。

infinispan.server.config.path

/server/data

包含按容器名称组织的数据文件。

infinispan.server.data.path

/server/lib

包含服务器扩展文件。
该目录是递归扫描的,并用作类路径。

Infinispan.server.lib.path
使用以下分隔符分隔多个路径
在 Unix / Linux
; on Windows

/server/log

包含服务器日志文件。

infinispan.server.log.path

12.1.12. 日志记录

使用 server/conf 文件夹中的 log4j2.xml 文件配置 Data Grid 服务器日志。

使用 --logging-config=<path_to_logfile > 参数来使用自定义路径,如下所示:

Unix / Linux

$RHDG_HOME/bin/server.sh --logging-config=/path/to/log4j2.xml

提示

为确保自定义路径生效,请不要使用 ~ 快捷方式。

Windows

$RHDG_HOME\bin\server.bat --logging-config=path\to\log4j2.xml

法律通告

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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

© 2024 Red Hat, Inc.