Data Grid 服务器指南


Red Hat Data Grid 8.2

部署、保护和管理 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.2 Server。
  3. 使用服务器下载存档作为参数运行 md5sumsha256sum 命令,例如:

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

参考

1.3. 安装 Data Grid Server

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

前提条件

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

流程

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

生成的目录是 $RHDG_HOME

1.4. 启动 Data Grid Servers

在任何受支持主机上的 Java 虚拟机(JVM)中运行 Data Grid Server 实例。

前提条件

  • 下载并安装服务器分发。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 使用 服务器 脚本启动 Data Grid 服务器实例。

    Linux
    $ bin/server.sh
    Copy to Clipboard Toggle word wrap
    Microsoft Windows
    bin\server.bat
    Copy to Clipboard Toggle word wrap

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

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
Copy to Clipboard Toggle word wrap

验证

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

1.5. 创建和修改用户

添加 Data Grid 用户凭证并分配权限以控制对数据的访问。

Data Grid 服务器安装使用属性域来验证 Hot Rod 和 REST 端点的用户。这意味着,您需要在访问 Data Grid 前至少创建一个用户。

默认情况下,用户还需要具有访问缓存的权限并与 Data Grid 资源交互的角色。您可以单独为用户分配角色,或将用户添加到具有角色权限的组中。

您可以在 Data Grid 命令行界面(CLI)中使用 user 命令创建用户并分配角色。

提示

从 CLI 会话运行 help user 以获取完整的命令详情。

1.5.1. 添加凭证

您需要一个 admin 用户用于 Data Grid 控制台,并对数据网格环境进行完全控制。因此,您应该在第一次添加凭证时创建带有 admin 权限的用户。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 在 CLI 中,使用 user create 命令创建 admin 用户。

    $ bin/cli.sh user create myuser -p changeme -g admin
    Copy to Clipboard Toggle word wrap

    或者,用户名 "admin" 会自动获得 admin 权限。

    $ bin/cli.sh user create admin -p changeme
    Copy to Clipboard Toggle word wrap
  3. 使用任何文本编辑器打开 user.propertiesgroups.properties,以验证用户和组。

    $ cat server/conf/users.properties
    
    #$REALM_NAME=default$
    #$ALGORITHM=encrypted$
    myuser=scram-sha-1\:BYGcIAwvf6b...
    
    $ cat server/conf/groups.properties
    
    myuser=admin
    Copy to Clipboard Toggle word wrap

1.5.2. 为用户分配角色

为用户分配角色,以便他们具有访问数据和修改数据和修改数据的正确权限。

流程

  1. 使用 admin 用户启动 CLI 会话。

    $ bin/cli.sh
    Copy to Clipboard Toggle word wrap
  2. deployer 角色分配给 "katie"。

    [//containers/default]> user roles grant --roles=deployer katie
    Copy to Clipboard Toggle word wrap
  3. 列出 "katie" 的角色。

    [//containers/default]> user roles ls katie
    ["deployer"]
    Copy to Clipboard Toggle word wrap

1.5.3. 在组中添加用户

组可让您更改多个用户的权限。您可以为组分配角色,然后将用户添加到该组。用户从组角色继承权限。

流程

  1. 使用 admin 用户启动 CLI 会话。
  2. 使用 user create 命令创建组。

    1. 使用 --groups 参数指定"developers"作为组名称。
    2. 为组设置用户名和密码。

      在属性域中,组是特殊类型的用户,它还需要用户名和密码。

      [//containers/default]> user create --groups=developers developers -p changeme
      Copy to Clipboard Toggle word wrap
  3. 列出组。

    [//containers/default]> user ls --groups
    ["developers"]
    Copy to Clipboard Toggle word wrap
  4. application 角色分配给"developers"组。

    [//containers/default]> user roles grant --roles=application developers
    Copy to Clipboard Toggle word wrap
  5. 列出"developers"组的角色。

    [//containers/default]> user roles ls developers
    ["application"]
    Copy to Clipboard Toggle word wrap
  6. 根据需要向组添加现有用户。

    [//containers/default]> user groups john --groups=developers
    Copy to Clipboard Toggle word wrap

1.5.4. 用户角色和权限

Data Grid 包括一组默认的角色,为用户授予访问数据的权限并与 Data Grid 资源交互。

ClusterRoleMapper 是 Data Grid 用来将安全主体与授权角色关联的默认机制。

重要

ClusterRoleMapper 将主体名称与角色名称匹配。名为 admin 的用户会自动获得 admin 权限,名为 deployer 的用户会收到 部署器 权限,以此类推。

Expand
角色权限描述

admin

ALL

具有所有权限的超级用户,包括控制缓存管理器生命周期。

deployer

ALL_READ、ALL_WRITE、LISTEN、EXEC、MONITOR、CREATE

除了 应用程序 权限外,还可创建和删除 Data Grid 资源。

application

ALL_READ, ALL_WRITE, LISTEN, EXEC, MONITOR

观察者 权限外,还具有对 Data Grid 资源的读写访问权限。也可以侦听事件并执行服务器任务和脚本。

Observer

ALL_READ, MONITOR

除了监控权限外,还具有对 Data Grid 资源 的读取访问权限。

monitor

MONITOR

可以通过 JMX 和 指标端点 查看统计信息。

1.6. 验证集群视图

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

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

注意

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

前提条件

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

流程

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

    $ cp -r server server2
    Copy to Clipboard Toggle word wrap
  3. 指定端口偏移和 server2 目录。

    $ bin/server.sh -o 100 -s server2
    Copy to Clipboard Toggle word wrap

验证

您可以在控制台的 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
Copy to Clipboard Toggle word wrap

1.7. 关闭 Data Grid 服务器

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

流程

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

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

      [//containers/default]> shutdown cluster
      Copy to Clipboard Toggle word wrap

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

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

      [//containers/default]> shutdown server <my_server01>
      Copy to Clipboard Toggle word wrap
重要

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
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap
提示

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

1.8.1. 服务器根目录

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

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

├── server
├── server1
├── server2
├── server3
└── server4
Copy to Clipboard Toggle word wrap

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

├── server
│   ├── conf
│   ├── data
│   ├── lib
│   └── log
Copy to Clipboard Toggle word wrap
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 Server 绑定到 IP 地址,通过网络接口公开数据网格服务器。然后,您可以将端点配置为使用接口,以便 Data Grid 服务器可以处理来自远程客户端应用程序的请求。

注意

默认情况下,Data Grid 服务器公开了一个自动检测到入站请求的协议的端口。

2.1. 网络接口

Data Grid Server 多路端点到单个 TCP/IP 端口,并自动检测入站客户端请求的协议。您可以配置 Data Grid 服务器如何绑定到网络接口来侦听客户端请求。

互联网协议(IP)地址

<!-- Selects a specific IPv4 address, which can be public, private, or loopback.
     This is the default network interface for Data Grid Server. -->
<interfaces>
  <interface name="public">
    <inet-address value="${infinispan.bind.address:127.0.0.1}"/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

回送地址

<!-- Selects an IP address in an IPv4 or IPv6 loopback address block. -->
<interfaces>
  <interface name="public">
    <loopback/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

非循环地址

<!-- Selects an IP address in an IPv4 or IPv6 non-loopback address block. -->
<interfaces>
  <interface name="public">
    <non-loopback/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

任何地址

<!-- Uses the `INADDR_ANY` wildcard address which means Data Grid Server
     listens for inbound client requests on all interfaces. -->
<interfaces>
  <interface name="public">
    <any-address/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

Link local

<!-- Selects a link-local IP address in an IPv4 or IPv6 address block. -->
<interfaces>
  <interface name="public">
    <link-local/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

站点本地

<!-- Selects a site-local (private) IP address in an IPv4 or IPv6 address block. -->
<interfaces>
  <interface name="public">
    <site-local/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

匹配和回退策略

Data Grid Server 可以枚举主机系统上的所有网络接口,并绑定到与值匹配的接口、主机或 IP 地址,该地址可以包括正则表达式来获得额外的灵活性。

匹配主机

<!-- Selects an IP address that is assigned to a matching host name. -->
<interfaces>
  <interface name="public">
    <match-host value="my_host_name"/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

匹配接口

<!--Selects an IP address assigned to a matching network interface. -->
<interfaces>
  <interface name="public">
    <match-interface value="eth0"/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

匹配地址

<!-- Selects an IP address that matches a regular expression. -->
<interfaces>
  <interface name="public">
    <match-address value="132\..*"/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

Fallback

<!-- Includes multiple strategies that Data Grid Server tries in the
     declared order until it finds a match. -->
<interfaces>
  <interface name="public">
    <match-host value="my_host_name"/>
    <match-address value="132\..*"/>
    <any-address/>
  </interface>
</interfaces>
Copy to Clipboard Toggle word wrap

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>
Copy to Clipboard Toggle word wrap
  • 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>
Copy to Clipboard Toggle word wrap

然后,您可以在 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>
Copy to Clipboard Toggle word wrap

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

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

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

Linux
$ bin/server.sh -b 127.0.0.2
Copy to Clipboard Toggle word wrap
Windows
bin\server.bat -b 127.0.0.2
Copy to Clipboard Toggle word wrap

2.4. 指定端口偏移

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

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

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

Linux
$ bin/server.sh -o 100
Copy to Clipboard Toggle word wrap
Windows
bin\server.bat -o 100
Copy to Clipboard Toggle word wrap

2.5. Data Grid Endpoints

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

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

2.5.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 客户端请求直接路由到主要所有者。

2.5.2. REST

参考

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

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

2.5.3. 协议比较

Expand
表 2.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

2.6. 端点连接器

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

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

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

声明空 &lt ;endpoints/&gt; 元素会隐式启用 Hot Rod 和 REST 连接器。

可以有多个 端点 绑定到不同的套接字。它们可以使用不同的安全域,并提供不同的身份验证和加密配置。以下配置在不同的套接字绑定中启用两个端点,每个端点都有一个专用安全域。此外,公共端点 将禁用管理功能,如控制台和 CLI。

<endpoints socket-binding="public" security-realm="application-realm" admin="false">
   <hotrod-connector/>
   <rest-connector/>
</endpoints>
<endpoints socket-binding="private" security-realm="management-realm">
   <hotrod-connector/>
   <rest-connector/>
</endpoints>
Copy to Clipboard Toggle word wrap

参考

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

2.6.1. 热 Rod Connectors

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

<hotrod-connector name="hotrod">
  <topology-state-transfer />
  <authentication>
    <!-- Hot Rod endpoint authentication configuration. -->
  </authentication>
  <encryption>
    <!-- Hot Rod endpoint SSL/TLS encryption configuration. -->
  </encryption>
</hotrod-connector>
Copy to Clipboard Toggle word wrap
  • name="hotrod" 逻辑上命名 Hot Rod 连接器。默认情况下,名称派生自套接字绑定名称,如 hotrod-default
  • topology-state-transfer 调整为 Hot Rod 客户端提供集群拓扑的状态传输操作。
  • 身份验证配置 SASL 身份验证机制。
  • 加密 配置客户端连接的 TLS 设置。

参考

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

2.6.2. REST Connectors

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

<rest-connector name="rest">
  <authentication>
    <!-- REST endpoint authentication configuration. -->
  </authentication>
  <cors-rules>
    <!-- Cross-Origin Resource Sharing (CORS) rules. -->
  </cors-rules>
  <encryption>
    <!-- REST endpoint SSL/TLS encryption configuration. -->
  </encryption>
</rest-connector>
Copy to Clipboard Toggle word wrap
  • name="rest" 逻辑上命名 REST 连接器。默认情况下,名称派生自套接字绑定名称,如 rest-default
  • 身份验证配置 身份验证机制。
  • CORS -rules 为跨域请求指定 CORS (Cross Origin 资源共享)规则。
  • 加密 配置客户端连接的 TLS 设置。

参考

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

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

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

Expand
端口协议描述

11222

TCP

hot Rod 和 REST 端点

11221

TCP

Memcached 端点,默认为禁用。

2.8. 单个端口

Data Grid 服务器通过单个 TCP 端口公开多个协议,默认为 11222。使用单一端口处理多个协议简化了配置,并在部署数据网格集群时降低管理复杂性。使用单个端口还可以通过最大程度减少网络上的攻击面来提高安全性。

数据网格服务器通过单一端口处理 HTTP/1.1、HTTP/2 和 Hot Rod 协议请求,以不同的方式处理来自客户端的 HTTP/1.1、HTTP/2 和 Hot Rod 协议请求。

HTTP/1.1 升级标头

客户端请求可以包含 HTTP/1.1 升级标头字段,以启动与 Data Grid 服务器的 HTTP/1.1 连接。然后,客户端应用程序可以发送 Upgrade: protocol 标头字段,其中 protocol 是服务器端点。

Application-Layer Protocol Negotiation (ALPN)/Transport Layer Security (TLS)

客户端请求包括 Data Grid Server 端点的 Server Name Indication (SNI)映射,以通过 TLS 连接协商协议。

注意

应用程序必须使用支持 ALPN 扩展的 TLS 库。Data Grid 为 Java 使用 WildFly OpenSSL 绑定。

自动 Hot Rod 检测

包含 Hot Rod 标头的客户端请求会自动路由到 Hot Rod 端点。

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

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

流程

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

# firewall-cmd --add-port=11222/tcp --permanent
success
# firewall-cmd --list-ports | grep 11222
11222/tcp
Copy to Clipboard Toggle word wrap

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

第 3 章 Security Realms

安全域为 Data Grid Server 端点定义身份、加密、身份验证和授权配置。

3.1. 属性 Realms

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

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

myuser=a_password
user2=another_password
Copy to Clipboard Toggle word wrap

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

myuser=supervisor,reader,writer
user2=supervisor
Copy to Clipboard Toggle word wrap

端点身份验证机制

当您将 Data Grid Server 配置为使用属性域时,您可以将端点配置为使用以下身份验证机制:

  • hot Rod (SASL): PLAIN,DIGEST114, 和 SCRAM114
  • REST (HTTP): BasicDigest

属性域配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <!-- Defines groups as roles for server authorization. -->
         <properties-realm groups-attribute="Roles">
            <!-- Specifies the properties file that holds usernames and passwords. -->
            <!-- The plain-text="true" attribute stores passwords in plain text. -->
            <user-properties path="users.properties"
                             relative-to="infinispan.server.config.path"
                             plain-text="true"/>
            <!-- Specifies the properties file that defines roles for users. -->
            <group-properties path="groups.properties"
                              relative-to="infinispan.server.config.path"/>
         </properties-realm>
      </security-realm>
   </security-realms>
</security>
Copy to Clipboard Toggle word wrap

3.1.1. 创建和修改用户

添加 Data Grid 用户凭证并分配权限以控制对数据的访问。

Data Grid 服务器安装使用属性域来验证 Hot Rod 和 REST 端点的用户。这意味着,您需要在访问 Data Grid 前至少创建一个用户。

默认情况下,用户还需要具有访问缓存的权限并与 Data Grid 资源交互的角色。您可以单独为用户分配角色,或将用户添加到具有角色权限的组中。

您可以在 Data Grid 命令行界面(CLI)中使用 user 命令创建用户并分配角色。

提示

从 CLI 会话运行 help user 以获取完整的命令详情。

3.1.1.1. 添加凭证

您需要一个 admin 用户用于 Data Grid 控制台,并对数据网格环境进行完全控制。因此,您应该在第一次添加凭证时创建带有 admin 权限的用户。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 在 CLI 中,使用 user create 命令创建 admin 用户。

    $ bin/cli.sh user create myuser -p changeme -g admin
    Copy to Clipboard Toggle word wrap

    或者,用户名 "admin" 会自动获得 admin 权限。

    $ bin/cli.sh user create admin -p changeme
    Copy to Clipboard Toggle word wrap
  3. 使用任何文本编辑器打开 user.propertiesgroups.properties,以验证用户和组。

    $ cat server/conf/users.properties
    
    #$REALM_NAME=default$
    #$ALGORITHM=encrypted$
    myuser=scram-sha-1\:BYGcIAwvf6b...
    
    $ cat server/conf/groups.properties
    
    myuser=admin
    Copy to Clipboard Toggle word wrap
3.1.1.2. 为用户分配角色

为用户分配角色,以便他们具有访问数据和修改数据和修改数据的正确权限。

流程

  1. 使用 admin 用户启动 CLI 会话。

    $ bin/cli.sh
    Copy to Clipboard Toggle word wrap
  2. deployer 角色分配给 "katie"。

    [//containers/default]> user roles grant --roles=deployer katie
    Copy to Clipboard Toggle word wrap
  3. 列出 "katie" 的角色。

    [//containers/default]> user roles ls katie
    ["deployer"]
    Copy to Clipboard Toggle word wrap
3.1.1.3. 在组中添加用户

组可让您更改多个用户的权限。您可以为组分配角色,然后将用户添加到该组。用户从组角色继承权限。

流程

  1. 使用 admin 用户启动 CLI 会话。
  2. 使用 user create 命令创建组。

    1. 使用 --groups 参数指定"developers"作为组名称。
    2. 为组设置用户名和密码。

      在属性域中,组是特殊类型的用户,它还需要用户名和密码。

      [//containers/default]> user create --groups=developers developers -p changeme
      Copy to Clipboard Toggle word wrap
  3. 列出组。

    [//containers/default]> user ls --groups
    ["developers"]
    Copy to Clipboard Toggle word wrap
  4. application 角色分配给"developers"组。

    [//containers/default]> user roles grant --roles=application developers
    Copy to Clipboard Toggle word wrap
  5. 列出"developers"组的角色。

    [//containers/default]> user roles ls developers
    ["application"]
    Copy to Clipboard Toggle word wrap
  6. 根据需要向组添加现有用户。

    [//containers/default]> user groups john --groups=developers
    Copy to Clipboard Toggle word wrap

3.2. LDAP 域

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

注意

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

端点身份验证机制

当您将 Data Grid Server 配置为使用 LDAP 域时,您可以将端点配置为使用以下身份验证机制:

  • hot Rod (SASL): PLAIN,DIGEST114, 和 SCRAM114
  • REST (HTTP): BasicDigest

LDAP 域配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
        <!-- Names an LDAP realm and specifies connection properties. -->
        <ldap-realm name="ldap"
                    url="ldap://my-ldap-server:10389"
                    principal="uid=admin,ou=People,dc=infinispan,dc=org"
                    credential="strongPassword"
                    connection-timeout="3000"
                    read-timeout="30000"
                    connection-pooling="true"
                    referral-mode="ignore"
                    page-size="30"
                    direct-verification="true">
            <!-- Defines how principals are mapped to LDAP entries. -->
            <identity-mapping rdn-identifier="uid"
                              search-dn="ou=People,dc=infinispan,dc=org"
                              search-recursive="false">
               <!-- Retrieves all the groups of which the user is a member. -->
               <attribute-mapping>
                  <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>
Copy to Clipboard Toggle word wrap

重要

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

作为使用 direct-verification 属性验证用户凭据的替代方法,您可以使用 user-password-mapper 元素指定 LDAP 密码。

rdn-identifier 属性指定一个 LDAP 属性,它根据提供的标识符查找用户条目,通常是用户名;例如 uidsAMAccountName 属性。在配置中添加 search-recursive="true" 以以递归方式搜索目录。默认情况下,搜索用户条目使用 (rdn_identifier={0}) 过滤器。使用 filter-name 属性指定不同的过滤器。

attribute-mapping 元素检索用户所属的所有组。通常可通过两种方式存储成员资格信息:

  • 在组条目下,通常在 member 属性中具有 class groupOfNames。在这种情况下,您可以使用属性过滤器,如上例配置中所示。此过滤器搜索与提供的过滤器匹配的条目,该条目将找到与用户的 DN 相等的 成员属性 的组。然后,过滤器提取组条目的 CN (由 指定),并将其添加到用户的 Roles 中。
  • memberOf 属性的用户条目中。在这种情况下,您应该使用如下属性引用:

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

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

3.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:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <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>
               <!-- Defines a rewriter that extracts the username from the principal using a regular expression. -->
               <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>
Copy to Clipboard Toggle word wrap

3.3. 令牌域

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

端点身份验证机制

当您将 Data Grid Server 配置为使用令牌域时,您必须将端点配置为使用以下身份验证机制:

  • hot Rod (SASL): OAUTHBEARER
  • REST (HTTP): Bearer

令牌域配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <!-- Specifies the URL of the authentication server. -->
         <token-realm name="token"
                      auth-server-url="https://oauth-server/auth/">
            <!-- Specifies the URL of the token introspection endpoint. -->
            <oauth2-introspection
                    introspection-url="https://oauth-server/auth/realms/infinispan/protocol/openid-connect/token/introspect"
                    client-id="infinispan-server"
                    client-secret="1fdca4ec-c416-47e0-867a-3d471af7050f"/>
         </token-realm>
      </security-realm>
   </security-realms>
</security>
Copy to Clipboard Toggle word wrap

3.4. 信任存储域

信任存储域使用证书或证书链,在数据协商连接时验证数据网格服务器和客户端身份。

keystores
包含向客户端提供 Data Grid 服务器身份的服务器证书。如果您使用服务器证书配置密钥存储,则数据网格服务器使用行业标准 SSL/TLS 协议加密流量。
信任存储
包含数据网格服务器的客户端证书或证书链。客户端信任存储是可选的,并允许 Data Grid 服务器执行客户端证书身份验证。

客户端证书身份验证

如果您希望 Data Grid Server 验证或验证客户端证书,您必须将 require-ssl-client-auth="true" 属性添加到端点配置中。

端点身份验证机制

如果您只使用密钥存储配置 Data Grid 服务器,您可以将加密与任何身份验证机制结合使用。

当您将 Data Grid Server 配置为使用客户端信任存储时,您必须配置端点以使用以下身份验证机制:

  • hot Rod (SASL): EXTERNAL
  • REST (HTTP): CLIENT_CERT

信任存储域配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <!-- Provides an SSL/TLS identity with a keystore that
                    contains server certificates. -->
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret"
                         alias="server"/>
               <!-- Configures a trust store that contains client certificates
                    or part of a certificate chain. -->
               <truststore path="trust.p12"
                           relative-to="infinispan.server.config.path"
                           password="secret"/>
            </ssl>
         </server-identities>
         <!-- Authenticates client certificates against the trust store.
              If you configure this, the trust store must contain
              the public certificates for all clients. -->
         <truststore-realm/>
      </security-realm>
   </security-realms>
</security>
<!-- Configures Data Grid Server to require client certificates
     with the "require-ssl-client-auth" attribute. -->
<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
           xmlns="urn:infinispan:server:12.1"
           socket-binding="default"
           security-realm="default"
           require-ssl-client-auth="true">
   <hotrod-connector>
     <!-- Configures the Hot Rod endpoint for client certificate authentication. -->
     <authentication>
       <sasl mechanisms="EXTERNAL"
             server-name="infinispan"
             qop="auth"/>
     </authentication>
   </hotrod-connector>
   <rest-connector>
      <!-- Configures the REST endpoint for client certificate authentication. -->
      <authentication mechanisms="CLIENT_CERT"/>
   </rest-connector>
</endpoints>
Copy to Clipboard Toggle word wrap

第 4 章 配置端点身份验证机制

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

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

4.1. Data Grid 服务器身份验证

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

SASL 身份验证机制

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

Expand
Security RealmSASL 身份验证机制

属性 Realms 和 LDAP Realms

SCRAMJPEG, DIGEST可以, CRAM-MD5

令牌域

OAUTHBEARER

信任 Realms

EXTERNAL

Kerberos Identities

GSSAPI, GS2-KRB5

SSL/TLS 标识

PLAIN

HTTP 身份验证机制

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

Expand
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>
Copy to Clipboard Toggle word wrap

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

<endpoints socket-binding="default" security-realm="default">
  <hotrod-connector name="hotrod"/>
  <rest-connector name="rest"/>
</endpoints>
Copy to Clipboard Toggle word wrap

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

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

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

流程

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

4.2.1. 热 Rod 身份验证配置

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

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:12.1
           https://infinispan.org/schemas/infinispan-server-12.1.xsd"
           xmlns="urn:infinispan:server:12.1"
           socket-binding="default"
           security-realm="default">
   <hotrod-connector>
      <authentication>
         <!-- Specifies SASL mechanisms to use for authentication. -->
         <!-- Defines the name that the server declares to clients. -->
         <sasl mechanisms="SCRAM-SHA-512 SCRAM-SHA-384 SCRAM-SHA-256
                           SCRAM-SHA-1 DIGEST-SHA-512 DIGEST-SHA-384
                           DIGEST-SHA-256 DIGEST-SHA DIGEST-MD5 PLAIN"
               server-name="infinispan"
               qop="auth"/>
      </authentication>
   </hotrod-connector>
</endpoints>
Copy to Clipboard Toggle word wrap

带有 Kerberos 验证的热 Rod 连接器

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
           xmlns="urn:infinispan:server:12.1"
           socket-binding="default"
           security-realm="default">
   <hotrod-connector>
      <authentication>
         <!-- Enables the GSSAPI and GS2-KRB5 mechanisms for Kerberos authentication. -->
         <!-- Defines the server name, which is equivalent to the Kerberos service name, and specifies the Kerberos identity for the server. -->
         <sasl mechanisms="GSSAPI GS2-KRB5"
               server-name="datagrid"
               server-principal="hotrod/datagrid@INFINISPAN.ORG"/>
      </authentication>
   </hotrod-connector>
</endpoints>
Copy to Clipboard Toggle word wrap

4.2.2. 热 Rod 端点身份验证机制

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

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

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.2.3. SASL 服务质量(QoP)

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

Expand
QoP 设置描述

auth

仅进行身份验证。

auth-int

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

auth-conf

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

4.2.4. SASL 策略

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

Expand
策略描述默认值

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">
      <!-- Specifies multiple SASL authentication mechanisms for the Hot Rod connector. -->
      <sasl server-name="myhotrodserver"
            mechanisms="PLAIN DIGEST-MD5 GSSAPI EXTERNAL"
            qop="auth">
         <!-- Defines policies for SASL mechanisms. -->
         <policy>
            <no-active value="true" />
            <no-anonymous value="true" />
            <no-plain-text value="true" />
         </policy>
      </sasl>
   </authentication>
</hotrod-connector>
Copy to Clipboard Toggle word wrap

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

4.3. 手动配置 REST 身份验证

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

流程

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

4.3.1. REST 身份验证配置

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

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
           xmlns="urn:infinispan:server:12.1"
           socket-binding="default"
           security-realm="default">
   <rest-connector>
      <!-- Specifies SASL mechanisms to use for authentication. -->
      <authentication mechanisms="DIGEST BASIC"/>
   </rest-connector>
</endpoints>
Copy to Clipboard Toggle word wrap

带有 Kerberos 验证的 REST 连接器

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
           xmlns="urn:infinispan:server:12.1"
           socket-binding="default"
           security-realm="default">
   <rest-connector>
      <!-- Enables the `SPENGO` mechanism for Kerberos authentication and specifies an identity for the server. -->
      <authentication mechanisms="SPNEGO"
                      server-principal="HTTP/localhost@INFINISPAN.ORG"/>
   </rest-connector>
</endpoints>
Copy to Clipboard Toggle word wrap

4.3.2. REST 端点身份验证机制

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

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

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. 打开 infinispan.xml 进行编辑。
  2. 从端点配置中删除任何 security-realm 属性。
  3. 确保 Hot Rod 和 REST 连接器不包含任何 身份验证配置

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

    <endpoints socket-binding="default">
      <hotrod-connector name="hotrod"/>
      <rest-connector name="rest"/>
    </endpoints>
    Copy to Clipboard Toggle word wrap
  4. cache-container 的安全配置和每个缓存配置中删除任何 授权 元素。

第 5 章 加密数据网格服务器连接

您可以通过配置包含 Data Grid 的公钥和私钥的密钥存储来保护使用 SSL/TLS 加密的数据网格服务器连接。如果需要 mutual TLS,您还可以配置客户端证书身份验证。

5.1. 配置 Data Grid Server Keystores

将密钥存储添加到 Data Grid Server,并将其配置为显示验证其对客户端身份的 SSL/TLS 证书。如果安全域包含 TLS/SSL 身份,它会加密到使用该安全域的 Data Grid Server 端点的任何连接。

前提条件

  • 为 Data Grid 服务器创建包含证书或证书链的密钥存储。

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

重要

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

流程

  1. 将包含 Data Grid 服务器的 SSL/TLS 身份的密钥存储添加到 $RHDG_HOME/server/conf 目录。
  2. 向 Data Grid Server 安全域添加 服务器身份 定义。
  3. 使用 path 属性指定密钥存储文件名。
  4. 为密钥存储密码和证书别名提供 keystore-passwordalias 属性。

Data Grid Server keystore 配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <!-- Adds a keystore that contains server certificates
                    that provide SSL/TLS identities to clients. -->
               <keystore path="server.pfx"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret"
                         alias="rhdg-server"/>
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
Copy to Clipboard Toggle word wrap

后续步骤

使用信任存储配置客户端,以便它们能够验证 Data Grid 服务器的 SSL/TLS 身份。

5.1.1. 自动生成密钥存储

配置 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:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <!-- Generates a keystore that includes a self-signed certificate with the specified hostname. -->
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret"
                         alias="server"
                         generate-self-signed-certificate-host="localhost"/>
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
Copy to Clipboard Toggle word wrap

5.1.2. 配置 TLS 版本和密码套件

当使用 SSL/TLS 加密来保护部署时,您可以将 Data Grid 服务器配置为使用 TLS 协议的特定版本以及协议中的特定密码套件。

流程

  1. engine 元素添加到 Data Grid 服务器的 SSL 配置中。
  2. 将 Data Grid 配置为使用带有 enabled-protocols 属性的一个或多个 TLS 版本。

    默认情况下,Data Grid 服务器支持 TLS 版本 1.2 和 1.3。如果适当,您可以设置 TLSv1.3,以限制客户端连接的安全协议。Data Grid 不推荐启用 TLSv1.1,因为它是一个有限的旧协议,并提供弱安全性。您不应该启用任何早于 1.1 的 TLS 版本。

    警告

    如果您修改了 Data Grid 服务器的 SSL 引擎 配置,则必须使用 enabled-protocols 属性明确配置 TLS 版本。省略 enabled-protocols 属性允许任何 TLS 版本。

    <engine enabled-protocols="TLSv1.3 TLSv1.2" />
    Copy to Clipboard Toggle word wrap
  3. 将 Data Grid 配置为使用带有 enabled-ciphersuites 属性的一个或多个密码套件。

    您必须确保设置了支持您要使用的任何协议功能的密码套件;例如 HTTP/2 ALPN

SSL 引擎配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1
          https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret" alias="server"/>
               <!-- Configures Data Grid Server to use specific TLS versions and cipher suites. -->
               <engine enabled-protocols="TLSv1.3"
                       enabled-ciphersuites="TLS_AES_256_GCM_SHA384 TLS_AES_128_GCM_SHA256 TLS_AES_128_CCM_8_SHA256"/>
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
Copy to Clipboard Toggle word wrap

5.2. 配置客户端证书身份验证

将 Data Grid Server 配置为使用 mutual TLS 来保护客户端连接。

您可以配置 Data Grid,以两种方式在信任存储中验证来自证书的客户端身份:

  • 需要仅包含签名证书的信任存储,通常是证书颁发机构(CA)。任何提供 CA 签名的证书的客户端都可以连接到 Data Grid。
  • 除了签名证书外,还需要包含所有客户端证书的信任存储。只有提供信任存储中存在的签名证书的客户端才能连接到 Data Grid。
提示

另外,您还可以提供信任存储,您可以使用共享系统证书。

前提条件

  • 创建包含 CA 证书或所有公共证书的客户端信任存储。
  • 为 Data Grid 服务器创建密钥存储并配置 SSL/TLS 身份。

流程

  1. 在您的 端点 配置中添加 require-ssl-client-auth="true" 参数。
  2. 将客户端信任存储添加到 $RHDG_HOME/server/conf 目录中。
  3. 在 Data Grid Server 安全域配置中指定 truststore 元素 的路径 和密码 属性。
  4. 如果您希望 Data Grid 服务器验证每个客户端证书,请将 < truststore-realm /> 元素添加到安全域中。

Data Grid Server 信任存储域配置

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <!-- Provides an SSL/TLS identity with a keystore that
                    contains server certificates. -->
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret"
                         alias="server"/>
               <!-- Configures a trust store that contains client certificates
                    or part of a certificate chain. -->
               <truststore path="trust.p12"
                           relative-to="infinispan.server.config.path"
                           password="secret"/>
            </ssl>
         </server-identities>
         <!-- Authenticates client certificates against the trust store.
              If you configure this, the trust store must contain
              the public certificates for all clients. -->
         <truststore-realm/>
      </security-realm>
   </security-realms>
</security>
<!-- Configures Data Grid Server to require client certificates
     with the "require-ssl-client-auth" attribute. -->
<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
           xmlns="urn:infinispan:server:12.1"
           socket-binding="default"
           security-realm="default"
           require-ssl-client-auth="true">
   <hotrod-connector>
     <!-- Configures the Hot Rod endpoint for client certificate authentication. -->
     <authentication>
       <sasl mechanisms="EXTERNAL"
             server-name="infinispan"
             qop="auth"/>
     </authentication>
   </hotrod-connector>
   <rest-connector>
      <!-- Configures the REST endpoint for client certificate authentication. -->
      <authentication mechanisms="CLIENT_CERT"/>
   </rest-connector>
</endpoints>
Copy to Clipboard Toggle word wrap

后续步骤

  • 如果使用安全角色和权限控制访问权限,请在 Data Grid Server configuration 中使用客户端证书设置授权。
  • 配置客户端,以与 Data Grid Server 协商 SSL/TLS 连接。

5.3. 使用客户端证书配置授权

启用客户端证书身份验证意味着您不需要在客户端配置中指定 Data Grid 用户凭证,这意味着您必须将角色与客户端证书中的 Common Name (CN)字段关联。

前提条件

  • 为客户端提供 Java 密钥存储,其中包含其公共证书或证书链的一部分,通常是公共 CA 证书。
  • 配置 Data Grid Server 来执行客户端证书身份验证。

流程

  1. 在安全授权配置中启用 common-name-role-mapper
  2. 从客户端证书中为通用名称(CN)分配具有适当权限的角色。

    <cache-container name="certificate-authentication" statistics="true">
       <security>
         <authorization>
           <!-- Declare a role mapper that associates the common name (CN) field
                in client certificate trust stores with authorization roles. -->
           <common-name-role-mapper/>
           <!-- In this example, if a client certificate contains `CN=Client1` then
                clients with matching certificates get ALL permissions. -->
           <role name="Client1" permissions="ALL"/>
         </authorization>
       </security>
    </cache-container>
    Copy to Clipboard Toggle word wrap

第 6 章 为 Data Grid 服务器配置 Kerberos 标识

为 Data Grid Server 端点提供 Kerberos 身份,以保证与客户端的连接。

6.1. 设置 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
    Copy to Clipboard Toggle word wrap
    Microsoft Windows
    $ ktpass -princ HTTP/datagrid@INFINISPAN.ORG -pass * -mapuser INFINISPAN\USER_NAME
    $ ktab -k http.keytab -a HTTP/datagrid@INFINISPAN.ORG
    Copy to Clipboard Toggle word wrap
  2. 将 keytab 文件复制到 $ISPN_HOME/server/conf 目录中。
  3. 向 Data Grid 服务器安全域添加服务器身份 定义。
  4. 指定为 Hot Rod 和 REST 连接器提供服务主体的 keytab 文件的位置。
  5. 将 Kerberos 服务主体命名为。

6.2. Kerberos 身份配置

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

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <!-- Specifies a keytab file that provides a Kerberos identity for the Hot Rod connector. -->
            <!-- Names the Kerberos service principal for the Hot Rod connector. -->
            <!-- The required="true" attribute specifies that the keytab file must be present when the server starts. -->
            <kerberos keytab-path="hotrod.keytab"
                      principal="hotrod/datagrid@INFINISPAN.ORG"
                      required="true"/>
            <!-- Specifies a keytab file that provides a Kerberos identity for the REST connector. -->
            <!-- Names the Kerberos service principal for the REST connector. -->
            <kerberos keytab-path="http.keytab"
                      principal="HTTP/localhost@INFINISPAN.ORG"
                      required="true"/>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
Copy to Clipboard Toggle word wrap

外部服务需要凭证才能与 Data Grid 服务器进行身份验证。要保护敏感文本字符串,如密码,请将它们添加到凭据密钥存储中,而不是直接在 Data Grid Server 配置文件中添加它们。

然后,您可以配置 Data Grid Server 来解密与数据库或 LDAP 目录等服务建立连接的密码。

重要

$RHDG_HOME/server/conf 中的纯文本密码是未加密的。任何对主机文件系统具有读取访问权限的用户帐户都可以查看纯文本密码。

虽然凭据密钥存储是密码保护的加密密码,但对主机文件系统具有写入访问权限的任何用户帐户都可与密钥存储本身篡改。

要完全保护数据网格服务器凭证,您应该只向可配置和运行 Data Grid Server 的用户帐户授予读写访问权限。

7.1. 设置凭证密钥存储

创建密钥存储来为 Data Grid 服务器访问加密凭据。

凭据密钥存储至少包含一个与加密密码关联的别名。创建密钥存储后,您可以在连接配置中指定别名,如数据库连接池。然后,在服务尝试身份验证时,从密钥存储解密该别名的密码。

您可以根据需要创建任意数量的凭据密钥存储。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 使用 credentials 命令创建密钥存储并向其添加凭据。

    提示

    默认情况下,密钥存储的类型是 PKCS12。运行 帮助凭据,以获取有关更改密钥存储默认值的详细信息。

    以下示例演示了如何创建密钥存储,其中包含密码"changeme"的别名"dbpassword"。在创建密钥存储时,您也使用 -p 参数指定密钥存储的密码。

    Linux
    $ bin/cli.sh credentials add dbpassword -c changeme -p "secret1234!"
    Copy to Clipboard Toggle word wrap
    Microsoft Windows
    $ bin\cli.bat credentials add dbpassword -c changeme -p "secret1234!"
    Copy to Clipboard Toggle word wrap
  3. 检查别名是否已添加到密钥存储中。

    $ bin/cli.sh credentials ls -p "secret1234!"
    dbpassword
    Copy to Clipboard Toggle word wrap
  4. 配置 Data Grid 以使用凭据密钥存储。

    1. credential-stores 配置中指定凭据密钥存储的名称和位置。
    2. 在 credentials -reference 配置中提供凭据 密钥存储和别名。

      提示

      credential-reference 配置中的属性是可选的。

      • 只有在您有多个密钥存储时,才需要 存储
      • 只有在密钥存储包含多个别名时才需要别名。

7.2. 凭证密钥存储配置

检查 Data Grid Server 配置中凭据密钥存储的示例配置。

凭证密钥存储

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <!-- Uses a keystore to manage server credentials. -->
   <credential-stores>
      <!-- Specifies the name and filesystem location of a keystore. -->
      <credential-store name="credentials" path="credentials.pfx">
         <!-- Specifies the password for the credential keystore. -->
         <clear-text-credential clear-text="secret1234!"/>
      </credential-store>
   </credential-stores>
</security>
Copy to Clipboard Toggle word wrap

数据源连接

<data-sources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
              xmlns="urn:infinispan:server:12.1">
   <data-source name="postgres" jndi-name="jdbc/postgres">
      <!-- Specifies the database username in the connection factory. -->
      <connection-factory driver="org.postgresql.Driver"
                          username="dbuser"
                          url="${org.infinispan.server.test.postgres.jdbcUrl}">
         <!-- Specifies the credential keystore that contains an encrypted password and the alias for it. -->
         <credential-reference store="credentials" alias="dbpassword"/>
      </connection-factory>
      <connection-pool max-size="10" min-size="1" background-validation="1000" idle-removal="1" initial-size="1" leak-detection="10000"/>
   </data-source>
</data-sources>
Copy to Clipboard Toggle word wrap

LDAP 连接

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:12.1 https://infinispan.org/schemas/infinispan-server-12.1.xsd"
          xmlns="urn:infinispan:server:12.1">
   <credential-stores>
      <credential-store name="credentials" path="credentials.pfx">
         <clear-text-credential clear-text="secret1234!"/>
      </credential-store>
   </credential-stores>
   <security-realms>
      <security-realm name="default">
         <!-- Specifies the LDAP principal in the connection factory. -->
         <ldap-realm name="ldap" url="ldap://my-ldap-server:10389"
                     principal="uid=admin,ou=People,dc=infinispan,dc=org"
                     connection-timeout="3000"
                     read-timeout="30000"
                     connection-pooling="true"
                     referral-mode="ignore"
                     page-size="30">
            <!-- Specifies the credential keystore that contains an encrypted password and the alias for it. -->
            <credential-reference store="credentials" alias="ldappassword"/>
         </ldap-realm>
      </security-realm>
   </security-realms>
</security>
Copy to Clipboard Toggle word wrap

第 8 章 端点 IP 过滤

在端点上配置 IP 过滤规则,以根据客户端地址接受或拒绝连接。

8.1. Data Grid Server IP Filter Configuration

Data Grid 端点和连接器可以指定一个或多个 IP 过滤规则。这些规则指定在与提供的 CIDR 块连接匹配的客户端时要执行的操作类型。IP 过滤规则按顺序应用,直到第一个匹配为止。

CIDR 块是 IP 地址及其关联的网络掩码的紧凑表示。CIDR 表示法指定 IP 地址、斜杠('/')字符和十进制数字。十进制数是网络掩码中前 1 位的计数。也可以将这个数字视为网络前缀的宽度(以位为单位)。CIDR 表示法中的 IP 地址始终根据 IPv4 或 IPv6 的标准表示。

地址可以表示特定的接口地址,包括主机标识符,如 10.0.0.1/8,也可以是整个网络接口范围的开头地址,可以是主机标识符 0,如 10.0.0.0/810/8

例如:

  • 192.168.100.14/24 代表 IPv4 地址 192.168.100.14 及其关联的网络前缀 192.168.100.0,或者相当于它的子网掩码 255.255.255.0,其子网掩码为 24 个前 1 位。
  • IPv4 块 192.168.100.0/22 代表 192.168.100.0192.168.103.255 的 1024 IPv4 地址。
  • IPv6 block 2001:db8::/48 代表从 2001:db8:0:0:0:0:0:02001:db8:0:ffff:ffff:ffff:ffff:ffff:ffff:ffff 的块。
  • ::1/128 代表 IPv6 环回地址。其前缀长度是 128,这是地址中的位数。
<endpoints socket-binding="default" security-realm="default">
  <ip-filter>
    <accept from="192.168.0.0/16"/>
    <accept from="10.0.0.0/8"/>
    <reject from="/0"/>
  </ip-filter>
  <hotrod-connector name="hotrod"/>
  <rest-connector name="rest"/>
</endpoints>
Copy to Clipboard Toggle word wrap

由于上述配置,Data Grid 服务器只接受来自 192.168.0.0/1610.0.0.0/8 CIDR 块中的地址的连接。Data Grid 服务器拒绝所有其他连接。

8.2. 检查和修改 Data Grid Server IP Filter 规则

可以通过 CLI 来处理服务器 IP 过滤规则。

流程

  1. $RHDG_HOME 中打开一个终端。
  2. 根据需要检查并修改 IP 过滤规则 服务器连接器 ipfilter 命令。

    1. 列出集群中连接器上活跃的所有 IP 过滤规则:

      [//containers/default]> server connector ipfilter ls endpoint-default
      Copy to Clipboard Toggle word wrap
    2. 在集群中设置 IP 过滤规则。

      注意

      此命令替换任何现有规则。

      [//containers/default]> server connector ipfilter set endpoint-default --rules=ACCEPT/192.168.0.0/16,REJECT/10.0.0.0/8`
      Copy to Clipboard Toggle word wrap
    3. 删除集群中连接器上的所有 IP 过滤规则。

      [//containers/default]> server connector ipfilter clear endpoint-default
      Copy to Clipboard Toggle word wrap

第 9 章 配置用户授权

授权是一种安全功能,要求用户在访问缓存或与 Data Grid 资源交互之前具有某些权限。您可以将角色分配给提供不同级别权限的用户,从只读访问权限到完整的超级用户权限。

9.1. 在缓存配置中启用授权

使用缓存配置中的授权来限制用户访问。在他们可以读取或写入缓存条目或创建和删除缓存之前,用户必须具有足够级别权限的角色。

流程

  1. 打开 infinispan.xml 配置以进行编辑。
  2. 如果尚未声明,请在 cache-container 的安全 元素中添加 < authorization /> 标签。

    这为 Cache Manager 启用授权,并提供一组缓存可以继承的全局角色和权限。

  3. 将 & lt;authorization /> 标签添加到 Data Grid 根据用户角色限制访问的每个缓存中。

以下配置示例演示了如何将隐式授权配置与默认角色和权限搭配使用:

<infinispan>
  <cache-container default-cache="rbac-cache" name="restricted">
    <security>
      <!-- Enable authorization with the default roles and permissions. -->
      <authorization />
    </security>
    <local-cache name="rbac-cache">
      <security>
        <!-- Inherit authorization settings from the cache-container. -->
        <authorization/>
      </security>
    </local-cache>
  </cache-container>
</infinispan>
Copy to Clipboard Toggle word wrap

9.2. 用户角色和权限

Data Grid 包括一组默认的角色,为用户授予访问数据的权限并与 Data Grid 资源交互。

ClusterRoleMapper 是 Data Grid 用来将安全主体与授权角色关联的默认机制。

重要

ClusterRoleMapper 将主体名称与角色名称匹配。名为 admin 的用户会自动获得 admin 权限,名为 deployer 的用户会收到 部署器 权限,以此类推。

Expand
角色权限描述

admin

ALL

具有所有权限的超级用户,包括控制缓存管理器生命周期。

deployer

ALL_READ、ALL_WRITE、LISTEN、EXEC、MONITOR、CREATE

除了 应用程序 权限外,还可创建和删除 Data Grid 资源。

application

ALL_READ, ALL_WRITE, LISTEN, EXEC, MONITOR

观察者 权限外,还具有对 Data Grid 资源的读写访问权限。也可以侦听事件并执行服务器任务和脚本。

Observer

ALL_READ, MONITOR

除了监控权限外,还具有对 Data Grid 资源 的读取访问权限。

monitor

MONITOR

可以通过 JMX 和 指标端点 查看统计信息。

9.3. 安全授权如何工作

Data Grid 授权通过限制用户访问来保护您的安装。

用户应用程序或客户端必须属于分配了足够权限的角色,然后才能对缓存管理器或缓存执行操作。

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

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

身份

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

角色的身份

Data Grid 使用角色映射器,以便安全主体对应于您分配一个或多个权限的角色。

下图演示了安全主体与角色对应:

9.3.1. 权限

授权角色有不同的权限,它们具有不同的对数据网格的访问级别。权限可让您限制用户访问缓存管理器和缓存。

9.3.1.1. 缓存管理器权限
Expand
权限功能描述

配置

defineConfiguration

定义新的缓存配置。

LISTEN

addListener

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

生命周期

stop

停止缓存管理器。

创建

createCache, removeCache

创建和删除容器资源,如缓存、计数器、模式和脚本。

MONITOR

getStats

允许访问 JMX 统计信息和 指标端点

ALL

-

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

9.3.1.2. 缓存权限
Expand
权限功能描述

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

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

MONITOR

getStats

允许访问 JMX 统计信息和 指标端点

ALL

-

包括所有缓存权限。

ALL_READ

-

组合了 READ 和 BULK_READ 权限。

ALL_WRITE

-

组合 WRITE 和 BULK_WRITE 权限。

9.3.2. 角色映射程序

Data Grid 包含一个 PrincipalRoleMapper API,它将 Subject 中的安全主体映射到您可以分配给用户的授权角色。

9.3.2.1. 集群角色映射器

ClusterRoleMapper 使用持久复制缓存来动态存储默认角色和权限的 principal-to-role 映射。

默认情况下,使用 Principal 名称作为角色名称,并实施 org.infinispan.security.MutableRoleMapper,它公开方法在运行时更改角色映射。

  • Java 类: org.infinispan.security.mappers.ClusterRoleMapper
  • 声明性配置:&lt ;cluster-role-mapper />
9.3.2.2. 身份角色映射器

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

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

如果主体名称是可辨识名称(DN),则 CommonNameRoleMapper 使用 Common Name (CN)作为角色名称。

例如,此 DN、cn=managers、ou=people、dc=example、dc=com 映射到 managers 角色。

  • Java class: org.infinispan.security.mappers.CommonRoleMapper
  • 声明性配置: &lt ;common-name-role-mapper />
9.3.2.4. 自定义角色映射器

自定义角色映射程序是 org.infinispan.security.PrincipalRoleMapper 的实现。

  • 声明性配置: & lt;custom-role-mapper class="my.custom.RoleMapper" />

9.4. 访问控制列表(ACL)缓存

Data Grid 会缓存您在内部授予用户的角色,以获得最佳性能。每当您为用户授予或拒绝角色时,Data Grid 会清除 ACL 缓存,以确保正确应用用户权限。

如有必要,您可以禁用 ACL 缓存或使用 cache-sizecache-timeout 属性进行配置。

<security cache-size="1000" cache-timeout="300000">
  <authorization />
</security>
Copy to Clipboard Toggle word wrap

9.5. 自定义角色和权限

您可以自定义 Data Grid 配置中的授权设置,以使用具有不同角色和权限组合的角色映射器。

流程

  1. 打开 infinispan.xml 配置以进行编辑。
  2. 通过声明角色映射器和一组角色和权限,为 cache-container 配置授权。
  3. 配置缓存授权,以根据用户角色限制访问权限。

以下配置示例演示了如何使用角色和权限配置安全授权:

<infinispan>
  <cache-container default-cache="restricted" name="custom-authorization">
    <security>
      <authorization>
        <!-- Declare a role mapper that associates a security principal
             to each role. -->
        <identity-role-mapper />
        <!-- Specify user roles and corresponding permissions. -->
        <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="implicit-authorization">
      <security>
        <!-- Inherit roles and permissions from the cache-container. -->
        <authorization/>
      </security>
    </local-cache>
    <local-cache name="restricted">
      <security>
        <!-- Explicitly define which roles can access the cache. -->
        <authorization roles="admin supervisor"/>
      </security>
    </local-cache>
  </cache-container>
</infinispan>
Copy to Clipboard Toggle word wrap

9.6. 禁用安全授权

在本地开发环境中,您可以禁用授权,以便用户不需要角色和权限。禁用安全授权意味着任何用户都可以访问数据并与 Data Grid 资源交互。

流程

  1. 打开 infinispan.xml 配置以进行编辑。
  2. cache-container 的安全配置和每个缓存配置中删除任何 授权 元素。

9.7. 使用客户端证书配置授权

启用客户端证书身份验证意味着您不需要在客户端配置中指定 Data Grid 用户凭证,这意味着您必须将角色与客户端证书中的 Common Name (CN)字段关联。

前提条件

  • 为客户端提供 Java 密钥存储,其中包含其公共证书或证书链的一部分,通常是公共 CA 证书。
  • 配置 Data Grid Server 来执行客户端证书身份验证。

流程

  1. 在安全授权配置中启用 common-name-role-mapper
  2. 从客户端证书中为通用名称(CN)分配具有适当权限的角色。

    <cache-container name="certificate-authentication" statistics="true">
       <security>
         <authorization>
           <!-- Declare a role mapper that associates the common name (CN) field
                in client certificate trust stores with authorization roles. -->
           <common-name-role-mapper/>
           <!-- In this example, if a client certificate contains `CN=Client1` then
                clients with matching certificates get ALL permissions. -->
           <role name="Client1" permissions="ALL"/>
         </authorization>
       </security>
    </cache-container>
    Copy to Clipboard Toggle word wrap

第 10 章 设置 Data Grid 集群

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

10.1. 默认 JGroups Stacks

Data Grid 在 infinispan-core-12.1.11.Final -redhat-00001.jar 文件的 default-configs 目录中提供默认的 JGroups 堆栈文件 default-jgroups114.xml

您可以在 $RHDG_HOME/lib 目录中找到此 JAR 文件。

Expand
文件名堆栈名称描述

default-jgroups-udp.xml

udp

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

default-jgroups-tcp.xml

tcp

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

default-jgroups-kubernetes.xml

kubernetes

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

default-jgroups-ec2.xml

ec2

使用 TCP 进行传输,使用 NATIVE_S3_PING 进行发现。适用于 UDP 多播不可用的 Amazon EC2 节点。需要额外的依赖项。

default-jgroups-google.xml

google

使用 TCP 进行传输,GOOGLE_PING2 进行发现。适用于没有 UDP 多播的 Google Cloud Platform 节点。需要额外的依赖项。

default-jgroups-azure.xml

azure

使用 TCP 进行传输,AZURE_PING 进行发现。适用于没有 UDP 多播的 Microsoft Azure 节点。需要额外的依赖项。

10.2. 集群发现协议

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

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

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

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

10.2.1. PING

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

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

PING 配置示例

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

10.2.2. TCPPING

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

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

TCPPING 配置示例

<TCP bind_port="7800" />
<TCPPING timeout="3000"
         initial_hosts="${jgroups.tcpping.initial_hosts:hostname1[port1],hostname2[port2]}"
          port_range="0"
          num_initial_members="3"/>
Copy to Clipboard Toggle word wrap

10.2.3. MPING

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

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

MPING 配置示例

<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}"/>
Copy to Clipboard Toggle word wrap

10.2.4. TCPGOSSIP

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

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

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

gossip 路由器配置示例

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

10.2.5. JDBC_PING

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

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

JDBC_PING 配置示例

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

重要

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

10.2.6. DNS_PING

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

DNS_PING 配置示例

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

10.2.7. 云发现协议

Data Grid 包括默认的 JGroups 堆栈,它使用特定于云提供商的发现协议实现。

Expand
发现协议默认堆栈文件工件版本

NATIVE_S3_PING

default-jgroups-ec2.xml

org.jgroups.aws.s3:native-s3-ping

1.0.0.Final

GOOGLE_PING2

default-jgroups-google.xml

org.jgroups.google:jgroups-google

1.0.0.Final

AZURE_PING

default-jgroups-azure.xml

org.jgroups.azure:jgroups-azure

1.3.0.Final

为云发现协议提供依赖项

要使用 NATIVE_S3_PINGGOOGLE_PING2AZURE_PING 云发现协议,您需要向 Data Grid 提供依赖的库。

流程

  1. 下载工件 JAR 文件和所有依赖项。
  2. 将工件 JAR 文件和所有依赖项添加到 Data Grid Server 安装的 $RHDG_HOME/server/lib 目录中。

    如需了解更多详细信息,请参阅为 Data Grid Server 下载 JGroups 云发现协议的工件 (红帽知识库文章)

然后,您可以将云发现协议配置为 JGroups 堆栈文件或系统属性的一部分。

10.3. 使用默认 JGroups 堆栈

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

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

流程

执行以下操作之一使用默认 JGroups 堆栈之一:

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

    <infinispan>
      <cache-container default-cache="replicatedCache">
        <!-- Use the default UDP stack for cluster transport. -->
        <transport cluster="${infinispan.cluster.name}"
                   stack="udp"
                   node-name="${infinispan.node.name:}"/>
      </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap
  • 在 Data Grid Server 启动时,使用 cluster-stack 参数设置 JGroups 堆栈文件:

    $ bin/server.sh --cluster-stack=udp
    Copy to Clipboard Toggle word wrap

验证

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

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

10.4. 自定义 JGroups 堆栈

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

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

流程

  1. infinispan.xml 文件中创建一个新的 JGroups 堆栈声明。
  2. 添加 extends 属性,并指定 JGroups 堆栈来继承属性。
  3. 使用 stack.combine 属性修改继承堆栈中配置的协议的属性。
  4. 使用 stack.position 属性定义自定义堆栈的位置。
  5. 指定堆栈名称,作为 传输 配置中 stack 属性的值。

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

    <infinispan>
      <jgroups>
        <!-- Creates a custom JGroups stack named "my-stack". -->
        <!-- Inherits properties from the default TCP stack. -->
        <stack name="my-stack" extends="tcp">
          <!-- Uses TCPGOSSIP as the discovery mechanism instead of MPING -->
          <TCPGOSSIP initial_hosts="${jgroups.tunnel.gossip_router_hosts:localhost[12001]}"
                 stack.combine="REPLACE"
                 stack.position="MPING" />
          <!-- Removes the FD_SOCK protocol from the stack. -->
          <FD_SOCK stack.combine="REMOVE"/>
          <!-- Modifies the timeout value for the VERIFY_SUSPECT protocol. -->
          <VERIFY_SUSPECT timeout="2000"/>
          <!-- Adds SYM_ENCRYPT to the stack after VERIFY_SUSPECT. -->
          <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" />
        </stack>
        <cache-container name="default" statistics="true">
          <!-- Uses "my-stack" for cluster transport. -->
          <transport cluster="${infinispan.cluster.name}"
                     stack="my-stack"
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
      </jgroups>
    </infinispan>
    Copy to Clipboard Toggle word wrap
  6. 检查 Data Grid 日志,以确保它使用堆栈。

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

参考

10.4.1. 继承属性

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

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

    Expand
    描述

    组合

    覆盖协议属性。

    REPLACE

    替换协议。

    INSERT_AFTER

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

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

    INSERT_BEFORE

    在另一个协议前,将协议插入到堆栈中。影响您指定为插入点的协议。

    删除

    从堆栈中删除协议。

10.5. 使用 JGroups 系统属性

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

流程

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

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

$ bin/server.sh -Djgroups.bind.port=1234 -Djgroups.bind.address=192.0.2.0
Copy to Clipboard Toggle word wrap

10.5.1. 集群传输属性

使用以下属性自定义 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

选填

10.5.2. 云发现协议的系统属性

使用以下属性为托管平台配置 JGroups 发现协议:

10.5.2.1. Amazon EC2

用于配置 NATIVE_S3_PING 的系统属性。

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

jgroups.s3.region_name

Amazon S3 区域的名称。

没有默认值。

选填

jgroups.s3.bucket_name

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

没有默认值。

选填

10.5.2.2. Google Cloud Platform

用于配置 GOOGLE_PING2 的系统属性。

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

jgroups.google.bucket_name

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

没有默认值。

必需

10.5.2.3. Azure

AZURE_PING 的系统属性。

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

jboss.jgroups.azure_ping.storage_account_name

Azure 存储帐户的名称。名称必须存在,并且必须是唯一的。

没有默认值。

必需

jboss.jgroups.azure_ping.storage_access_key

Azure 存储访问密钥的名称。

没有默认值。

必需

jboss.jgroups.azure_ping.container

存储 ping 信息的容器的有效 DNS 名称。

没有默认值。

必需

10.5.2.4. OpenShift

DNS_PING 的系统属性。

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

jgroups.dns.query

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

没有默认值。

必需

10.6. 使用 Inline JGroups Stacks

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

流程

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

    <infinispan>
      <!-- Contains one or more JGroups stack definitions. -->
      <jgroups>
        <!-- Defines a custom JGroups stack named "prod". -->
        <stack name="prod">
          <TCP bind_port="7800" port_range="30" recv_buf_size="20000000" send_buf_size="640000"/>
          <MPING 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">
        <!-- Uses "prod" for cluster transport. -->
        <transport cluster="${infinispan.cluster.name}"
               stack="prod"
               node-name="${infinispan.node.name:}"/>
      </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap

10.7. 使用外部 JGroups 堆栈

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

流程

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

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

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

    <infinispan>
      <jgroups>
         <!-- Creates a "prod-tcp" stack that references an external file. -->
         <stack-file name="prod-tcp" path="prod-jgroups-tcp.xml"/>
      </jgroups>
      <cache-container default-cache="replicatedCache">
        <!-- Use the "prod-tcp" stack for cluster transport. -->
        <transport stack="prod-tcp" />
        <replicated-cache name="replicatedCache"/>
      </cache-container>
      <!-- Cache configuration goes here. -->
    </infinispan>
    Copy to Clipboard Toggle word wrap

10.8. 加密集群传输

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

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

10.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>
        <!-- Creates a secure JGroups stack named "encrypt-tcp" that extends the default TCP stack. -->
        <stack name="encrypt-tcp" extends="tcp">
          <!-- Adds a keystore that nodes use to perform certificate authentication. -->
          <!-- Uses the stack.combine and stack.position attributes to insert SSL_KEY_EXCHANGE into the default TCP stack after VERIFY_SUSPECT. -->
          <SSL_KEY_EXCHANGE keystore_name="mykeystore.jks"
                            keystore_password="changeit"
                            stack.combine="INSERT_AFTER"
                            stack.position="VERIFY_SUSPECT"/>
          <!-- Configures ASYM_ENCRYPT -->
          <!-- Uses the stack.combine and stack.position attributes to insert ASYM_ENCRYPT into the default TCP stack before pbcast.NAKACK2. -->
          <!-- The use_external_key_exchange = "true" attribute configures nodes to use the `SSL_KEY_EXCHANGE` protocol for certificate authentication. -->
          <ASYM_ENCRYPT asym_keylength="2048"
                        asym_algorithm="RSA"
                        change_key_on_coord_leave = "false"
                        change_key_on_leave = "false"
                        use_external_key_exchange = "true"
                        stack.combine="INSERT_BEFORE"
                        stack.position="pbcast.NAKACK2"/>
        </stack>
      </jgroups>
      <cache-container name="default" statistics="true">
        <!-- Configures the cluster to use the JGroups stack. -->
        <transport cluster="${infinispan.cluster.name}"
                   stack="encrypt-tcp"
                   node-name="${infinispan.node.name:}"/>
      </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap

验证

当您启动 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 文档。

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

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

流程

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

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

  3. SYM_ENCRYPT 协议添加到 Data Grid 配置中的 JGroups 堆栈。
<infinispan>
  <jgroups>
    <!-- Creates a secure JGroups stack named "encrypt-tcp" that extends the default TCP stack. -->
    <stack name="encrypt-tcp" extends="tcp">
      <!-- Adds a keystore from which nodes obtain secret keys. -->
      <!-- Uses the stack.combine and stack.position attributes to insert SYM_ENCRYPT into the default TCP stack after VERIFY_SUSPECT. -->
      <SYM_ENCRYPT keystore_name="myKeystore.p12"
                   keystore_type="PKCS12"
                   store_password="changeit"
                   key_password="changeit"
                   alias="myKey"
                   stack.combine="INSERT_AFTER"
                   stack.position="VERIFY_SUSPECT"/>
    </stack>
  </jgroups>
  <cache-container name="default" statistics="true">
    <!-- Configures the cluster to use the JGroups stack. -->
    <transport cluster="${infinispan.cluster.name}"
               stack="encrypt-tcp"
               node-name="${infinispan.node.name:}"/>
  </cache-container>
</infinispan>
Copy to Clipboard Toggle word wrap

验证

当您启动 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 文档。

10.9. 集群流量的 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 间的流量,用于集群之间的流量。

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

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

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

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

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

重要

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

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

11.2. 默认缓存管理器

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

默认缓存管理器

<!-- Creates a Cache Manager named "default" and exports metrics. -->
<cache-container name="default"
                 statistics="true">
  <!-- Adds cluster transport that uses the default JGroups TCP stack. -->
  <transport cluster="${infinispan.cluster.name:cluster}"
             stack="${infinispan.cluster.stack:tcp}"
             node-name="${infinispan.node.name:}"/>
</cache-container>
Copy to Clipboard Toggle word wrap

检查缓存管理器

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

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

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

11.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 缓存。

使用 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
      Copy to Clipboard Toggle word wrap
    • 使用 --template 选项从模板创建缓存定义。

      [//containers/default]> create cache --template=org.infinispan.DIST_SYNC mycache
      Copy to Clipboard Toggle word wrap
      提示

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

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

    [//containers/default]> ls caches
    mycache
    Copy to Clipboard Toggle word wrap
  4. 使用 describe 命令检索缓存配置。

    [//containers/default]> describe caches/mycache
    Copy to Clipboard Toggle word wrap

11.5. 使用 Hot Rod 客户端创建远程缓存

当 Hot Rod Java 客户端试图访问不存在的缓存时,它们会返回 remoteCacheManager.getCache ("myCache") 调用的 null。为避免这种情况,您可以将 Hot Rod 客户端配置为使用缓存配置在首次访问时创建缓存。

流程

  • 使用 ConfigurationBuilder 中的 remoteCache () 方法,或者使用 hotrod-client.properties 中的 configurationconfiguration_uri 属性。

ConfigurationBuilder

File file = new File("path/to/infinispan.xml")
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.remoteCache("another-cache")
       .configuration("<distributed-cache name=\"another-cache\"/>");
builder.remoteCache("my.other.cache")
       .configurationURI(file.toURI());
Copy to Clipboard Toggle word wrap

hotrod-client.properties

infinispan.client.hotrod.cache.another-cache.configuration=<distributed-cache name=\"another-cache\"/>
infinispan.client.hotrod.cache.[my.other.cache].configuration_uri=file:///path/to/infinispan.xml
Copy to Clipboard Toggle word wrap

重要

hotrod-client.properties 与包含 . 字符的缓存名称一起使用时,您必须将缓存名称放在方括号中,如上例中所示。

您还可以以其他方式通过 RemoteCacheManager API 创建远程缓存,例如以下示例使用 XMLStringConfiguration () 方法添加缓存配置,然后调用 getOrCreateCache () 方法。

但是,Data Grid 不推荐使用这个方法,因为它可能更难以确保 XML 的有效性,通常更难以创建缓存。如果您要创建复杂的缓存配置,您应该将它们保存到项目中的单独文件中,并在 Hot Rod 客户端配置中引用它们。

String cacheName = "CacheWithXMLConfiguration";
String xml = String.format("<distributed-cache name=\"%s\" mode=\"SYNC\">" +
                              "<encoding media-type=\"application/x-protostream\"/>" +
                              "<locking isolation=\"READ_COMMITTED\"/>" +
                              "<transaction mode=\"NON_XA\"/>" +
                              "<expiration lifespan=\"60000\" interval=\"20000\"/>" +
                           "</distributed-cache>" , cacheName);
remoteCacheManager.administration().getOrCreateCache(cacheName, new XMLStringConfiguration(xml));
Copy to Clipboard Toggle word wrap

热 Rod 代码示例

尝试一些数据网格代码教程,其中向您展示如何使用 Hot Rod Java 客户端以不同的方式创建远程缓存。

访问 Data Grid 代码示例

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

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

前提条件

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

流程

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

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

POST /rest/v2/caches/mycache
Copy to Clipboard Toggle word wrap

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

POST /rest/v2/caches/mycache?template=org.infinispan.DIST_SYNC
Copy to Clipboard Toggle word wrap

11.7. 缓存配置

您可以使用 XML 或 JSON 格式提供缓存配置。

XML

<distributed-cache name="myCache" mode="SYNC">
  <encoding media-type="application/x-protostream"/>
  <memory max-count="1000000" when-full="REMOVE"/>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

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

JSON 格式

JSON 格式的缓存配置必须遵循 XML 配置的结构。* XML 元素成为 JSON 对象。* XML 属性成为 JSON 字段。

第 12 章 配置 Data Grid Server Datasources

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

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

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

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

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

  • 定义如何连接到数据库的 连接工厂
  • 定义如何池和重复利用连接的连接池。
<data-sources>
   <!-- Defines a unique name for the datasource, JNDI name, and enables statistics. -->
   <data-source name="ds" jndi-name="jdbc/datasource" statistics="true">
      <!-- Specifies the JDBC driver that creates connections. -->
      <connection-factory driver="org.database.Driver"
                          username="db_user"
                          password="secret"
                          url="jdbc:db://database-host:10000/dbname"
                          new-connection-sql="SELECT 1"
                          transaction-isolation="READ_COMMITTED">
         <!-- Sets optional JDBC driver-specific connection properties. -->
         <connection-property name="name">value</connection-property>
      </connection-factory>
      <!-- Defines connection pool properties. -->
      <connection-pool initial-size="1"
                       max-size="10"
                       min-size="3"
                       background-validation="1000"
                       idle-removal="1"
                       blocking-timeout="1000"
                       leak-detection="10000"/>
   </data-source>
</data-sources>
Copy to Clipboard Toggle word wrap

使用以下参数可以调整连接池:

  • initial-size: 池应拥有的初始连接数。
  • max-size :池中连接的最大数量。
  • min-size :池应保留的最小连接数。
  • blocking-timeout: 在抛出异常前等待连接时,以毫秒为单位阻止的最长时间。如果创建新连接需要很长时间,则不会抛出异常。默认为 0 表示调用将无限期等待。
  • background-validation :后台验证运行之间的时间(毫秒)。持续时间为 0 表示此功能被禁用。
  • validate-on-acquisition :在获取前,按毫秒指定的连接闲置的时间(以毫秒为单位)会被验证(用于验证)。持续时间为 0 表示此功能被禁用。
  • idle-removal: 在删除连接前必须闲置时间。
  • leak-detection :在泄漏警告前必须保持连接的时间(以毫秒为单位)。

12.2. 在 JDBC Cache Stores 中使用 Datasources

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

前提条件

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

流程

  • 在缓存配置的 JDBC 缓存存储配置中引用数据源的 JNDI 名称,如下例所示:
<distributed-cache-configuration name="persistent-cache" xmlns:jdbc="urn:infinispan:config:store:jdbc:12.1">
    <persistence>
        <jdbc:string-keyed-jdbc-store>
            <!-- Specifies the JNDI name that you provided for the datasource connection in the server configuration. -->
            <jdbc:data-source jndi-url="jdbc/postgres"/>
            <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>
Copy to Clipboard Toggle word wrap

12.3. 测试数据源

使用 CLI 验证与数据源的连接是否正常工作。

流程

  1. 启动 CLI。

    $ bin/cli.sh
    [disconnected]>
    Copy to Clipboard Toggle word wrap
  2. 列出所有数据源:

    [//containers/default]> server datasource ls
    Copy to Clipboard Toggle word wrap
  3. 测试数据源连接。

    [//containers/default]> server datasource test my-datasource
    Copy to Clipboard Toggle word wrap

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

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

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

13.1. 创建服务器任务

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

13.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";
   }

}
Copy to Clipboard Toggle word wrap

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

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

前提条件

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

流程

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

    example.HelloTask
    Copy to Clipboard Toggle word wrap
  2. 将服务器任务实施打包在 JAR 文件中。
  3. 将 JAR 文件复制到 Data Grid 服务器的 $RHDG_HOME/server/lib 目录中。
  4. 将您的类添加到 Data Grid 配置中的 deserialization allow 列表中。或者,也可使用系统属性设置允许列表。

13.2. 创建服务器脚本

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

13.2.1. 服务器脚本

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

hello World 脚本示例

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

// mode=local,language=javascript,parameters=[greetee]
"Hello " + greetee
Copy to Clipboard Toggle word wrap

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

13.2.1.1. 脚本元数据

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

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

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

模式

定义执行模式并具有以下值:

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

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

语言

指定执行脚本的 ScriptEngine。

extension

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

role

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

parameters

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

datatype

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

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

13.2.1.2. 脚本绑定

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

Expand
绑定描述

缓存

指定运行脚本的缓存。

marshaller

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

cacheManager

指定缓存的 cacheManager

scriptingManager

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

13.2.1.3. 脚本参数

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

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

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

// mode=local,language=javascript
multiplicand * multiplier
Copy to Clipboard Toggle word wrap

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

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

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

前提条件

Data Grid 服务器将脚本存储在 ___script_cache 缓存中。如果启用缓存授权,用户必须有 CREATE 权限才能添加到 ___script_cache 中。

如果使用默认授权设置,请至少为用户分配 deployer 角色。

流程

  1. 根据需要定义脚本。

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

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

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

    [//containers/default]> ls tasks
    multiplication
    Copy to Clipboard Toggle word wrap

13.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");
Copy to Clipboard Toggle word wrap

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

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

13.3.1. 运行任务和脚本

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

流程

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

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

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

      //containers/default]> task exec @@cache@names
      ["___protobuf_metadata","mycache","___script_cache"]
      Copy to Clipboard Toggle word wrap

13.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);
Copy to Clipboard Toggle word wrap

13.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);
Copy to Clipboard Toggle word wrap

第 14 章 启用和自定义日志记录

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

14.1. 服务器日志

Data Grid 将服务器日志写入 $RHDG_HOME/server/log 目录中的以下文件中:

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

14.1.1. 配置服务器日志

Data Grid 使用 Apache Log4j 技术来编写服务器日志消息。您可以在 log4j2.xml 文件中配置服务器日志。

流程

  1. 使用任何文本编辑器打开 $RHDG_HOME/server/conf/log4j2.xml
  2. 根据需要更改服务器日志记录。
  3. 保存并关闭 log4j2.xml

14.1.2. 日志级别

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

Expand
日志级别描述

TRACE

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

DEBUG

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

INFO

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

WARN

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

ERROR

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

FATAL

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

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

14.1.3. 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
特定于跨站点复制操作的消息。

14.1.4. 日志应用程序

日志附加程序定义 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 类。

14.1.5. 日志模式

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 文档 完全描述了模式。

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

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

前提条件

  • 如果 Data Grid Server 正在运行,则停止它。
    您无法动态启用日志处理程序。

流程

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

    <!--<AppenderRef ref="FILE"/>-->
    <AppenderRef ref="JSON-FILE"/>
    Copy to Clipboard Toggle word wrap
  3. (可选)根据需要配置 JSON 附加器和 JSON 布局。
  4. 保存并关闭 log4j2.xml

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

14.2. 访问日志

访问日志,将 Hot Rod 和 REST 端点的所有入站客户端请求记录到 $RHDG_HOME/server/log 目录中的文件。

org.infinispan.HOTROD_ACCESS_LOG
将 Hot Rod 访问消息写入 hotrod-access.log 文件的日志记录类别。
org.infinispan.REST_ACCESS_LOG
将 REST 访问消息写入 rest-access.log 文件的日志记录类别。

14.2.1. 启用访问日志

要记录 Hot Rod 和 REST 端点访问消息,您需要在 log4j2.xml 中启用日志类别。

流程

  1. 使用任何文本编辑器打开 $RHDG_HOME/server/conf/log4j2.xml
  2. org.infinispan.HOTROD_ACCESS_LOGorg.infinispan.REST_ACCESS_LOG 日志类别的级别更改为 TRACE
  3. 保存并关闭 log4j2.xml
<Logger name="org.infinispan.HOTROD_ACCESS_LOG" additivity="false" level="TRACE">
   <AppenderRef ref="HR-ACCESS-FILE"/>
</Logger>
Copy to Clipboard Toggle word wrap

14.2.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
Copy to Clipboard Toggle word wrap

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

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} 表示法,并允许您修改访问日志的格式。以下是默认的日志记录属性:

Expand
属性描述

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}

14.3. 审计日志

审计日志可让您跟踪对数据网格环境的更改,以便您了解何时发生变化以及哪些用户进行更改。启用并配置审计日志记录,以记录服务器配置事件和管理操作。

org.infinispan.AUDIT
将安全审计消息写入 $RHDG_HOME/server/log 目录中的 audit.log 文件的日志记录类别。

14.3.1. 启用审计日志记录

要记录安全审计消息,您需要在 log4j2.xml 中启用日志记录类别。

流程

  1. 使用任何文本编辑器打开 $RHDG_HOME/server/conf/log4j2.xml
  2. org.infinispan.AUDIT 日志类别的级别更改为 INFO
  3. 保存并关闭 log4j2.xml
<!-- Set to INFO to enable audit logging -->
<Logger name="org.infinispan.AUDIT" additivity="false" level="INFO">
   <AppenderRef ref="AUDIT-FILE"/>
</Logger>
Copy to Clipboard Toggle word wrap

14.3.2. 配置审计日志记录应用程序

Apache Log4j 提供了不同的附加程序,您可以使用它们将审计消息发送到默认日志文件以外的目的地。例如,如果要将审计日志发送到 syslog 守护进程、JDBC 数据库或 Apache Kafka 服务器,您可以在 log4j2.xml 中配置附加程序。

流程

  1. 使用任何文本编辑器打开 $RHDG_HOME/server/conf/log4j2.xml
  2. 注释或删除默认的 AUDIT-FILE 滚动文件附加程序。

    <!--RollingFile name="AUDIT-FILE"
      ...
    </RollingFile-->
    Copy to Clipboard Toggle word wrap
  3. 为审计消息添加所需的日志记录附加程序。

    例如,您可以为 Kafka 服务器添加日志附加程序,如下所示:

    <Kafka name="AUDIT-KAFKA" topic="audit">
      <PatternLayout pattern="%date %message"/>
      <Property name="bootstrap.servers">localhost:9092</Property>
    </Kafka>
    Copy to Clipboard Toggle word wrap
  4. 保存并关闭 log4j2.xml

14.3.3. 使用自定义审计日志记录实施

如果配置 Log4j appenders 不满足您的需要,您可以创建 org.infinispan.security.AuditLogger API 的自定义实现。

前提条件

  • 根据需要实施 org.infinispan.security.AuditLogger,并将它打包在 JAR 文件中。

流程

  1. 将您的 JAR 添加到 Data Grid Server 安装的 server/lib 目录中。
  2. 指定自定义审计日志记录器的完全限定类名称,作为缓存容器安全配置中 authorization 元素的 audit-logger 属性的值。

    例如,以下配置将 my.package.CustomAuditLogger 定义为日志记录审计消息的类:

    <infinispan>
       <cache-container>
          <security>
             <authorization audit-logger="my.package.CustomAuditLogger"/>
          </security>
       </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap

第 15 章 配置 Data Grid Server Statistics

启用数据网格导出到 指标端点 或通过 JMX MBeans 导出的统计信息。注册 JMX MBeans 也公开了您可以远程执行的管理操作。

15.1. 启用 Data Grid Statistics

配置 Data Grid 以导出缓存管理器和缓存的统计信息。

默认情况下,Data Grid Server 启用缓存管理器统计信息。您必须明确启用缓存的统计信息。

流程

修改您的配置,以以下方法之一启用 Data Grid 统计:

  • declarative: 添加 statistics="true" 属性。
  • programmatic :调用 .statistics () 方法。

声明

<!-- Enables statistics for the Cache Manager. -->
<cache-container statistics="true">
  <!-- Enables statistics for the named cache. -->
  <local-cache name="mycache" statistics="true"/>
</cache-container>
Copy to Clipboard Toggle word wrap

programmatic

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  //Enables statistics for the Cache Manager.
  .cacheContainer().statistics(true)
  .build();

Configuration config = new ConfigurationBuilder()
  //Enables statistics for the named cache.
  .statistics().enable()
  .build();
Copy to Clipboard Toggle word wrap

15.2. 配置数据网格指标

配置 Data Grid,以通过 指标端点 导出量表和直方图。

流程

  • 根据需要 在指标 配置中打开或关闭量表和直方图。

声明

<!-- Computes and collects statistics for the Cache Manager. -->
<cache-container statistics="true">
  <!-- Exports collected statistics as gauge and histogram metrics. -->
  <metrics gauges="true" histograms="true" />
</cache-container>
Copy to Clipboard Toggle word wrap

programmatic

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  //Computes and collects statistics for the Cache Manager.
  .statistics().enable()
  //Exports collected statistics as gauge and histogram metrics.
  .metrics().gauges(true).histograms(true)
  .build();
Copy to Clipboard Toggle word wrap

15.3. 收集数据网格指标

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

前提条件

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

流程

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

    $ curl -v http://localhost:11222/metrics
    Copy to Clipboard Toggle word wrap
  • 以 MicroProfile JSON 格式获取指标:

    $ curl --header "Accept: application/json" http://localhost:11222/metrics
    Copy to Clipboard Toggle word wrap

后续步骤

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

static_configs:
    - targets: ['localhost:11222']
Copy to Clipboard Toggle word wrap

参考

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

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

流程

修改缓存容器配置以以下方法之一启用 JMX:

  • 声明:在缓存容器中添加 < jmx enabled="true" /> 元素。
  • programmatic: 调用 .jmx ().enable () 方法。

声明

<cache-container>
  <jmx enabled="true" />
</cache-container>
Copy to Clipboard Toggle word wrap

programmatic

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  .jmx().enable()
  .build();
Copy to Clipboard Toggle word wrap

15.4.1. Data Grid MBeans

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

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

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

第 16 章 检索健康统计

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

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

16.1. 通过 JMX 访问 Health API

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

流程

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

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

16.2. 通过 REST 访问 Health API

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

流程

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

    GET /rest/v2/cache-managers/{cacheManagerName}/health
    Copy to Clipboard Toggle word wrap

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"
        }
    ]

}
Copy to Clipboard Toggle word wrap
提示

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

GET /rest/v2/cache-managers/{cacheManagerName}/health/status
Copy to Clipboard Toggle word wrap

参考

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

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

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

17.1. 设置目标集群

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

前提条件

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

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

流程

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

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

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

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

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

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

<!-- Remote cache stores for rolling upgrades must disable passivation. -->
<persistence passivation="false">
   <!-- The value of the cache attribute matches the name of a cache in the source cluster. Target clusters load data from this cache using the remote cache store. -->
   <!-- The "protocol-version" attribute matches the Hot Rod protocol version of the source cluster. 2.5 is the minimum version and is suitable for any upgrade path. -->
   <!-- You should enable segmentation for remote cache stores only if the number of segments in the target cluster matches the number of segments for the cache in the source cluster. -->
   <remote-store xmlns="urn:infinispan:config:store:remote:12.1"
                 cache="myDistCache"
                 protocol-version="2.5"
                 hotrod-wrapping="true"
                 raw-values="true"
                 segmented="false">
      <!-- Configures authentication and encryption according to the security realm of the source cluster. -->
      <security>
        <authentication server-name="infinispan">
          <digest username="admin"
                  password="changeme"
                  realm="default"/>
        </authentication>
      </security>
      <!-- Points to the location of the source cluster. -->
      <remote-server host="127.0.0.1" port="11222"/>
   </remote-store>
</persistence>
Copy to Clipboard Toggle word wrap

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

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

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

流程

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

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

    POST /v2/caches/myCache?action=sync-data
    Copy to Clipboard Toggle word wrap

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

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

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

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

    POST /v2/caches/myCache?action=disconnect-source
    Copy to Clipboard Toggle word wrap

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

后续步骤

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

第 18 章 Data Grid Servers 故障排除

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

18.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'
    Copy to Clipboard Toggle word wrap
  3. tar.gz 文件移动到您文件系统中合适的位置。
  4. 使用任何归档工具提取 tar.gz 文件。

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

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

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

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

流程

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

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

前面的命令返回:

{
  "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"
  }
}
Copy to Clipboard Toggle word wrap
  • 列出服务器上定义的所有日志记录器配置:
[//containers/default]> logging list-loggers
Copy to Clipboard Toggle word wrap

前面的命令返回:

[ {
  "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" ]
} ]
Copy to Clipboard Toggle word wrap
  • 使用 set 子命令添加和修改日志记录器配置

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

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

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

[//containers/default]> logging remove org.infinispan
Copy to Clipboard Toggle word wrap

18.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
}
Copy to Clipboard Toggle word wrap
[//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
}
Copy to Clipboard Toggle word wrap

第 19 章 参考

19.1. Data Grid Server 8.2.3 Readme

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

19.1.1. 要求

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

19.1.2. 启动服务器

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

Unix / Linux

$RHDG_HOME/bin/server.sh
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\server.bat
Copy to Clipboard Toggle word wrap

提示

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

19.1.3. 停止服务器

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

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

19.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
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\server.bat -c infinispan-local.xml
Copy to Clipboard Toggle word wrap

19.1.5. 绑定地址

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

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

Unix / Linux

$RHDG_HOME/bin/server.sh -b 0.0.0.0
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\server.bat -b 0.0.0.0
Copy to Clipboard Toggle word wrap

19.1.6. 绑定端口

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

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

Unix / Linux

$RHDG_HOME/bin/server.sh -p 30000
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\server.bat -p 30000
Copy to Clipboard Toggle word wrap

19.1.7. 集群地址

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

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

Unix / Linux

$RHDG_HOME/bin/server.sh -k 192.168.1.100
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\server.bat -k 192.168.1.100
Copy to Clipboard Toggle word wrap

19.1.8. 集群堆栈

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

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

Unix / Linux

$RHDG_HOME/bin/server.sh -j udp
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\server.bat -j udp
Copy to Clipboard Toggle word wrap

19.1.9. 身份验证

Data Grid Server 需要身份验证。

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

Unix / Linux

$RHDG_HOME/bin/cli.sh user create username -p "qwer1234!"
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\cli.bat user create username -p "qwer1234!"
Copy to Clipboard Toggle word wrap

19.1.10. 服务器主目录

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

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

├── bin
├── boot
├── docs
├── lib
├── server
└── static
Copy to Clipboard Toggle word wrap
Expand
目录描述

/bin

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

/boot

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

/docs

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

/lib

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

/server

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

/static

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

19.1.11. 服务器根目录

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

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

Unix / Linux

$RHDG_HOME/bin/server.sh -s server2
Copy to Clipboard Toggle word wrap

Windows

$RHDG_HOME\bin\server.bat -s server2
Copy to Clipboard Toggle word wrap

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

├── server
│   ├── conf
│   ├── data
│   ├── lib
│   └── log
Copy to Clipboard Toggle word wrap
Expand
目录描述系统属性覆盖

/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

19.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
Copy to Clipboard Toggle word wrap

提示

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

Windows

$RHDG_HOME\bin\server.bat --logging-config=path\to\log4j2.xml
Copy to Clipboard Toggle word wrap

法律通告

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