22.2. 与 JGroups 的集群通信
22.2.1. 关于 JGroups 复制链接链接已复制到粘贴板!
JGroups 是可靠消息传递的工具包,可用于创建节点可以互相发送消息的集群。
jgroups 子系统为 JBoss EAP 中高可用性服务提供组通信支持。它允许您配置命名的频道和协议堆栈,并查看频道的运行时统计信息。使用提供高可用性功能的配置(如受管域中的 ha 或 full-ha 配置文件)或 standalone-ha.xml 或单机服务器的 standalone-full-ha.xml 配置文件时,可以使用 jgroups 子系统。
JBoss EAP 预配置有两个 JGroups 堆栈:
- udp
- 集群中的节点使用用户数据报协议(UDP)多播相互通信。这是默认的堆栈。
- tcp
- 集群中的节点使用传输控制协议(TCP)相互通信。
TCP 的开销更多,并且通常被视为比 UDP 慢,因为它处理错误检查、数据包排序和拥塞控制本身。JGroups 处理 UDP 的这些功能,而 TCP 保证了它们本身。当在不可靠或高拥塞网络上使用 JGroups 时,或者多播不可用时,TCP 是不错的选择。
您可以使用预配置的堆栈,或者自行定义以满足您的系统特定要求。有关可用协议及其属性的更多信息,请参阅以下部分。
22.2.2. 将默认的 JGroups 通道切换为使用 TCP 复制链接链接已复制到粘贴板!
默认情况下,集群节点使用为 ee JGroups 频道配置的 udp 协议堆栈进行通信。
22.2.2.1. 使用多播配置 TCP 复制链接链接已复制到粘贴板!
有些网络只允许使用 TCP。
流程
使用以下管理 CLI 命令,将
ee频道切换为使用预配置的tcp堆栈:/subsystem=jgroups/channel=ee:write-attribute(name=stack,value=tcp)
/subsystem=jgroups/channel=ee:write-attribute(name=stack,value=tcp)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个默认
tcp堆栈使用MPING协议,它使用 IP 多播来发现初始集群成员资格。
22.2.2.2. 在没有多播的情况下配置 TCP 复制链接链接已复制到粘贴板!
当安全策略不首选或允许多播时,您可以将默认协议堆栈更改为不使用 TCP。
流程
要在没有多播的情况下配置基于 TCP 的集群,请执行以下步骤:
要将
ee频道切换为使用 JGroups 子系统中预先配置的tcp堆栈,请运行以下命令:<channel name="ee" stack="tcp" cluster="ejb"/>
<channel name="ee" stack="tcp" cluster="ejb"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置集群节点的名称:
在独立配置模式中执行以下步骤之一:
运行以下命令:
<server xmlns="urn:jboss:domain:8.0" name="node_1">
<server xmlns="urn:jboss:domain:8.0" name="node_1">Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
在启动实例时,为系统属性
jboss.node.name指定唯一名称。
在域模式中,集群服务器列在服务器标签的
host netobserv.xml文件中。默认配置指定以下服务器名称,如果需要,可以对其进行编辑。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
选择以下协议之一来发现其他群集成员:
22.2.3. 配置 TCPPING 复制链接链接已复制到粘贴板!
此流程创建新的 JGroups 堆栈,它使用 TCPPING 协议来定义静态集群成员资格列表。提供了一个基础脚本,它会创建一个 tcpping 堆栈,并设置默认的 ee 频道来使用此新堆栈。这个脚本中的管理 CLI 命令必须针对您的环境进行自定义,并将作为批处理进行处理。
流程
将以下脚本复制到文本编辑器,并将其保存到本地文件系统中。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,定义的协议顺序很重要。您还可以通过将
add-index值传递给add命令,在特定索引中插入协议。索引基于零,因此以下管理 CLI 命令会将UNICAST3协议添加为第七个协议。/subsystem=jgroups/stack=tcpping/protocol=UNICAST3:add(add-index=6)
/subsystem=jgroups/stack=tcpping/protocol=UNICAST3:add(add-index=6)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 修改您的环境的脚本。
-
如果您在受管域中运行,您必须在
/subsystem=jgroups命令前使用/profile=PROFILE_NAME指定要更新的配置集。 根据您的环境调整以下属性:
-
socket-bindings: 以逗号分隔的主机和端口组合列表,它们被视为众所周知,并可用于查找初始成员资格。有关定义套接字绑定 的更多信息,请参阅配置套接字绑定。 -
initial_hosts:主机和端口组合的逗号分隔列表,其语法是HOST[PORT],它们被视为已知,并可用于查找初始成员资格,如host1[1000],host2[2000]。 -
port_range:此属性用于根据指定的值扩展initial_hosts端口范围。例如,如果您将initial_hosts设置为host1[1000],host2[2000],并且port_range设为1,则initial_hosts设置将展开到host1[1000],host1[1001],host2[2000],host2[2001]。此属性只适用于initial_hosts属性。
-
-
如果您在受管域中运行,您必须在
通过将脚本文件 传递给管理 CLI,运行脚本。
EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME
$ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
TCPPING 堆栈现在可用,TCP 用于网络通信。
22.2.3.1. 在独立模式中配置 TCPPING 复制链接链接已复制到粘贴板!
此流程帮助您在独立模式中为集群应用程序配置 TCP 堆栈和节点。
流程
在 JGroups 子系统中将默认堆栈从
udp更改为tcp:<channel name="ee" stack="tcp" cluster="ejb"/>
<channel name="ee" stack="tcp" cluster="ejb"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 TCP 堆栈配置为使用 TCPPING 协议来代替默认的 MPING 协议。在以下代码中,
initial_hosts属性与集群中的所有节点列表相关联,7600表示默认的jgroups-tcp端口,具体取决于您的配置和环境。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意initial_hosts中设置的端口号7600必须与jgroups-tcpsocket-binding 定义中定义的端口号相同。如果将 port-offset 功能用于 socket-binding,则需要在initial_hosts中偏移后指定相同的值。设置 private 接口的 IP 地址,供 JGroups 组件使用。IP 地址应与
initial_hosts中指定的 IP 地址之一关联:<interface name="private"> <inet-address value="${jboss.bind.address.private:192.168.1.5}"/> </interface><interface name="private"> <inet-address value="${jboss.bind.address.private:192.168.1.5}"/> </interface>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 重复上述步骤,以配置集群中的其他节点。配置节点时,启动每个节点并部署一个集群应用。
验证
您可以检查日志以验证节点是否已启动并在运行:
INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel server: [node_1|1] (2) [node_1, node_2] INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel web: [node_1|1] (2) [node_1, node_2]
INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel server: [node_1|1] (2) [node_1, node_2] INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel web: [node_1|1] (2) [node_1, node_2]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
22.2.3.2. 在域模式中配置 TCPPING 复制链接链接已复制到粘贴板!
此流程帮助您在域模式中为集群应用程序配置 TCP 堆栈和节点。
流程
如果将同一配置集用于多个集群,请将系统属性值设置为
initial_hosts:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在主机控制器的 XML 配置中设置私有接口的 IP 地址。专用接口的 IP 地址应当与
initial_hosts中列出的 IP 地址之一关联。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
您可以检查日志以验证节点是否已启动并在运行:
INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel server: [node_1|1] (2) [node_1, node_2] INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel web: [node_1|1] (2) [node_1, node_2]
INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel server: [node_1|1] (2) [node_1, node_2] INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel web: [node_1|1] (2) [node_1, node_2]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
22.2.4. 配置 TCPGOSSIP 复制链接链接已复制到粘贴板!
此流程创建新的 JGroups 堆栈,它使用 TCPGOSSIP 协议使用外部 gosip 路由器来发现集群的成员。提供了一个基础脚本,它会创建一个 tcpgossip 堆栈,并设置默认的 ee 频道来使用此新堆栈。这个脚本中的管理 CLI 命令必须针对您的环境进行自定义,并将作为批处理进行处理。
流程
将以下脚本复制到文本编辑器,并将其保存到本地文件系统中。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,定义的协议顺序很重要。您还可以通过将
add-index值传递给add命令,在特定索引中插入协议。索引基于零,因此以下管理 CLI 命令会将UNICAST3协议添加为第七个协议。/subsystem=jgroups/stack=tcpgossip/protocol=UNICAST3:add(add-index=6)
/subsystem=jgroups/stack=tcpgossip/protocol=UNICAST3:add(add-index=6)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 修改您的环境的脚本。
-
如果您在受管域中运行,您必须在
/subsystem=jgroups命令前使用/profile=PROFILE_NAME指定要更新的配置集。 根据您的环境调整以下属性:
-
socket-bindings: 以逗号分隔的主机和端口组合列表,它们被视为众所周知,并可用于查找初始成员资格。有关定义套接字绑定 的更多信息,请参阅配置套接字绑定。 -
initial_hosts:主机和端口组合的逗号分隔列表,其语法是HOST[PORT],它们被视为已知,并可用于查找初始成员资格,如host1[1000],host2[2000]。 -
port_range:此属性用于根据指定的值扩展initial_hosts端口范围。例如,如果您将initial_hosts设置为host1[1000],host2[2000],并且port_range设为1,则initial_hosts设置将展开到host1[1000],host1[1001],host2[2000],host2[2001]。此属性只适用于initial_hosts属性。 -
reconnect_interval:断开连接的 stub 尝试重新连接到 gosip 路由器的时间间隔(以毫秒为单位)。 -
sock_conn_timeout:套接字创建的最大时间。默认值为1000毫秒。 -
sock_read_timeout:读取时阻止的最长时间,以毫秒为单位。值0将无限期阻止。
-
-
如果您在受管域中运行,您必须在
通过将脚本文件 传递给管理 CLI,运行脚本。
EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME
$ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
TCPGOSSIP 堆栈现在可用,TCP 用于网络通信。此堆栈配置为与 gossip 路由器搭配使用,以便 JGroups 集群成员能够找到其他群集成员。
22.2.5. 配置 JDBC_PING 复制链接链接已复制到粘贴板!
您可以使用 JDBC_PING 协议来管理和发现集群中的成员资格。
JDBC_PING 使用 data-source 中指定的数据库来列出集群的成员。
流程
- 创建数据源以连接到您要用来管理集群成员资格的数据库。
将以下脚本复制到文本编辑器,并将其保存到本地文件系统中。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意定义的协议的顺序非常重要。您还可以通过将
add-index值传递给add命令,在特定索引中插入协议。索引基于零,因此以下管理 CLI 命令会将UNICAST3协议添加为第七个协议。/subsystem=jgroups/stack=JDBC_PING/protocol=UNICAST3:add(add-index=6)
/subsystem=jgroups/stack=JDBC_PING/protocol=UNICAST3:add(add-index=6)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 修改您的环境的脚本。
-
如果您在受管域中运行,您必须在
/subsystem=jgroups命令前使用/profile=PROFILE_NAME指定要更新的配置集。 - 将 'ExampleDS' 替换为在第 1 步中定义的 data-source 的名称。
-
如果您在受管域中运行,您必须在
通过将脚本文件 传递给管理 CLI,运行脚本。
EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME
$ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
JDBC_PING 堆栈现在可用,TCP 用于网络通信。
22.2.6. 将 JGroups 绑定到网络接口 复制链接链接已复制到粘贴板!
默认情况下,JGroups 仅绑定到 私有 网络接口,该接口指向默认配置中的 localhost。为安全起见,JGroups 不会绑定到 JBoss EAP 启动期间指定的 -b 参数定义的网络接口,因为集群流量不应在公共网络接口上公开。
有关如何配置网络接口的详情,请参考本指南中的 网络和端口配置 章节。
为安全起见,JGroups 应该只绑定到一个非公共网络接口。出于性能考虑,我们还建议 JGroups 流量的网络接口应该是专用虚拟局域网(VLAN)的一部分。
22.2.7. 保护集群 复制链接链接已复制到粘贴板!
为了安全地运行集群,需要注意几个问题:
22.2.7.1. 配置身份验证 复制链接链接已复制到粘贴板!
JGroups 身份验证由 AUTH 协议执行。其目的是确保只有经过身份验证的节点才能加入集群。
在适用的服务器配置文件中,使用适当的属性设置添加 AUTH 协议。AUTH 协议应在 pbcast.GMS 协议之前立即配置。
以下示例演示了使用带有不同形式的授权令牌的 AUTH。
带有简单令牌的 AUTH
带有摘要算法令牌的 AUTH
这个格式可用于任何摘要算法,如 MD5 或 SHA-2。JBoss EAP 8.0 中的默认摘要算法是 SHA-256,JVM 需要强大的摘要算法。许多 JVM 将额外实施 SHA-512。
带有 X509 令牌的 AUTH
本例在 elytron 子系统中创建新的密钥存储,并在 JGroups AUTH 配置中引用它。
创建密钥存储:
keytool -genkeypair -alias jgroups_key -keypass my_password -storepass my_password -storetype jks -keystore jgroups.keystore -keyalg RSA
$ keytool -genkeypair -alias jgroups_key -keypass my_password -storepass my_password -storetype jks -keystore jgroups.keystore -keyalg RSACopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用管理 CLI 将密钥存储添加到
elytron子系统:/subsystem=elytron/key-store=jgroups-token-store:add(type=jks,path=/path/to/jgroups.keystore,credential-reference={clear-text=my_password}, required=true)/subsystem=elytron/key-store=jgroups-token-store:add(type=jks,path=/path/to/jgroups.keystore,credential-reference={clear-text=my_password}, required=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 JGroups 堆栈定义中,将
AUTH配置为使用密钥存储:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
22.2.7.2. 配置加密 复制链接链接已复制到粘贴板!
要加密消息,JGroups 使用由集群成员共享的 secret 密钥。发送者使用共享 secret 密钥加密消息,并且接收器使用相同的 secret 密钥解密消息。使用对称加密 (使用 SYM_ENCRYPT 协议配置),节点使用共享密钥存储来检索机密密钥。通过 非对称加密 (使用 ASYM_ENCRYPT 协议进行配置),节点会在使用 AUTH 进行身份验证后从集群的协调器检索机密密钥。
使用对称加密
要使用 SYM_ENCRYPT,您必须设置一个密钥存储,它将在每个节点的 JGroups 配置中引用该密钥存储。
创建密钥存储。
在以下命令中,将
VERSION替换为适当的 JGroups JAR 版本,将PASSWORD替换为密钥存储密码。java -cp EAP_HOME/modules/system/layers/base/org/jgroups/main/jgroups-VERSION.jar org.jgroups.demos.KeyStoreGenerator --alg AES --size 128 --storeName defaultStore.keystore --storepass PASSWORD --alias mykey
$ java -cp EAP_HOME/modules/system/layers/base/org/jgroups/main/jgroups-VERSION.jar org.jgroups.demos.KeyStoreGenerator --alg AES --size 128 --storeName defaultStore.keystore --storepass PASSWORD --alias mykeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这将生成一个
defaultStore.keystore文件,它将在 JGroups 配置中引用该文件。生成密钥存储后,会使用以下两种方法之一在
SYM_PROTOCOL中定义。- 在配置 中直接指定 密钥存储。
- 使用 Elytron 子系统 来引用密钥存储。
使用 SYM_ENCRYPT 时配置 AUTH 是可选的。
通过直接引用密钥存储来使用对称加密
在
jgroups子系统中配置SYM_ENCRYPT协议。在适用的服务器配置文件中,使用适当的属性设置添加
SYM_ENCRYPT协议。此协议将引用之前创建的密钥存储。SYM_ENCRYPT协议应在pbcast.NAKACK2协议之前立即配置。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 elytron 的对称加密
使用管理 CLI,在
elytron子系统中创建一个密钥存储,该密钥存储引用 使用对称加密 中创建的defaultStore.keystore。/subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)/subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用适当的属性设置,在
jgroups子系统中添加SYM_ENCRYPT协议。SYM_ENCRYPT协议应在pbcast.NAKACK2协议之前立即配置,如以下配置中所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意上例使用明文密码;但是,还可以定义凭据存储来定义配置文件外的密码。有关配置此存储的更多信息,请参阅如何配置服务器安全 指南中的 凭证存储 部分。
使用非对称加密
要使用 ASYM_ENCRYPT,必须定义 AUTH 协议。有关在 jgroups 子系统中配置 AUTH 协议的说明,请参阅 配置身份验证 部分。
ASYM_ENCRYPT 使用两种方法之一进行配置。
- 生成 secret 密钥,并在 配置中直接引用 它。
- 创建密钥存储,并使用 Elytron 子系统 来引用它。
通过生成 secret 密钥来使用非对称加密
在
jgroups子系统中配置ASYM_ENCRYPT协议。在适用的服务器配置文件中,使用适当的属性设置添加
ASYM_ENCRYPT协议。ASYM_ENCRYPT协议应在pbcast.NAKACK2协议之前立即配置,如以下配置中所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在 elytron 中使用非对称加密
创建密钥存储以包含密钥对。以下命令使用
mykey条目创建密钥存储:keytool -genkeypair -alias mykey -keyalg RSA -keysize 1024 -keystore defaultKeystore.keystore -dname "CN=localhost" -keypass secret -storepass secret
$ keytool -genkeypair -alias mykey -keyalg RSA -keysize 1024 -keystore defaultKeystore.keystore -dname "CN=localhost" -keypass secret -storepass secretCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用管理 CLI,在
elytron子系统中创建一个引用defaultStore.keystore的密钥存储。/subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)/subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用适当的属性设置,在
jgroups子系统中添加ASYM_ENCRYPT协议。ASYM_ENCRYPT协议应在pbcast.NAKACK2协议之前立即配置,如以下配置中所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意上例使用明文密码;但是,还可以定义凭据存储来定义配置文件外的密码。有关配置此存储的更多信息,请参阅如何配置服务器安全 指南中的 凭证存储 部分。
22.2.8. 配置 JGroups 线程池 复制链接链接已复制到粘贴板!
jgroups 子系统包含 默认的、内部、oob 和 timer 线程池。这些池可以针对任何 JGroups 堆栈配置,不会影响本地节点上配置的 bean 或其他池。JGroup 线程池用于支持集群通信。
下表列出了您可以为每个线程池配置的属性,以及每个线程池的默认值。
| 线程池名称 | 描述 | keepalive-time | max-threads | min-threads | queue-length |
|---|---|---|---|---|---|
| default | 此池用于处理未标记为带外的传入消息。 | 60000L | 300 | 20 | 100 |
| internal | 此池用于处理 EAP 维护所需的内部进程。 | 60000L | 4 | 2 | 100 |
| OOB | 此池用于处理带外信息。 | 60000L | 300 | 20 | 0 |
| timer | 此池用于处理时间密集型调度程序消息。 | 5000L | 4 | 2 | 500 |
通过以下语法,通过管理 CLI 配置 JGroups 线程池:
/subsystem=jgroups/stack=STACK_TYPE/transport=TRANSPORT_TYPE/thread-pool=THREAD_POOL_NAME:write-attribute(name=ATTRIBUTE_NAME, value=ATTRIBUTE_VALUE)
/subsystem=jgroups/stack=STACK_TYPE/transport=TRANSPORT_TYPE/thread-pool=THREAD_POOL_NAME:write-attribute(name=ATTRIBUTE_NAME, value=ATTRIBUTE_VALUE)
以下是管理 CLI 命令的一个示例,可在 udp 堆栈 的默认 线程池中将 max-threads 值设置为 500。
/subsystem=jgroups/stack=udp/transport=UDP/thread-pool=default:write-attribute(name="max-threads", value="500")
/subsystem=jgroups/stack=udp/transport=UDP/thread-pool=default:write-attribute(name="max-threads", value="500")
22.2.9. 配置 JGroups 发送和接收缓冲区 复制链接链接已复制到粘贴板!
解决缓冲区大小警告
默认情况下,JGroups 配置有某些发送和接收缓冲区值;但是,您的操作系统可能会限制可用的缓冲区大小,而 JBoss EAP 可能无法使用其配置缓冲区值。在这种情况下,您将在 JBoss EAP 日志中看到类似如下的警告:
要解决这个问题,请参考您的操作系统文档来了解如何增加缓冲区大小。对于 Red Hat Enterprise Linux 系统,以 root 用户身份编辑 /etc/sysctl.conf,为系统重启后的缓冲区大小配置最大值。例如:
Allow a 25MB UDP receive buffer for JGroups Allow a 1MB UDP send buffer for JGroups
# Allow a 25MB UDP receive buffer for JGroups
net.core.rmem_max = 26214400
# Allow a 1MB UDP send buffer for JGroups
net.core.wmem_max = 1048576
修改 /etc/sysctl.conf 后,运行 sysctl -p 以使更改生效。
配置 JGroups 缓冲区大小
您可以通过在 UDP 和 TCP JGroups 堆栈上设置以下传输属性来配置 JBoss EAP 使用的 JGroups 缓冲区大小。
- UDP 堆栈
-
ucast_recv_buf_size -
ucast_send_buf_size -
mcast_recv_buf_size -
mcast_send_buf_size
-
- TCP 堆栈
-
recv_buf_size -
send_buf_size
-
JGroups 缓冲区大小可以使用管理控制台或管理 CLI 来配置。
通过以下语法,通过管理 CLI 设置 JGroups 缓冲区 size 属性:
/subsystem=jgroups/stack=STACK_NAME/transport=TRANSPORT/property=PROPERTY_NAME:add(value=BUFFER_SIZE)
/subsystem=jgroups/stack=STACK_NAME/transport=TRANSPORT/property=PROPERTY_NAME:add(value=BUFFER_SIZE)
以下是将 tcp 堆栈上的 recv_buf_size 属性设置为 20000000 的管理 CLI 命令。
/subsystem=jgroups/stack=tcp/transport=TRANSPORT/property=recv_buf_size:add(value=20000000)
/subsystem=jgroups/stack=tcp/transport=TRANSPORT/property=recv_buf_size:add(value=20000000)
也可以使用管理控制台,从 Configuration 选项卡导航到 JGroups 子系统,单击 View,选择 Stack 选项卡,选择适当的堆栈,单击 Transport,再编辑 Properties 字段来配置 JGroups 缓冲区大小。
22.2.10. 调整 JGroups 子系统 复制链接链接已复制到粘贴板!
有关监控并优化 jgroups 子系统性能的提示,请参阅 JBoss EAP 性能调优的 JGroups 子系统调优 部分。
22.2.11. JGroups 故障排除 复制链接链接已复制到粘贴板!
22.2.11.1. 节点不组成集群 复制链接链接已复制到粘贴板!
确保为 IP 多播正确设置您的机器。JBoss EAP 附带两个测试程序,可用于测试 IP 多播: McastReceiverTest 和 McastSenderTest。
在终端中,启动 McastReceiverTest。
java -cp EAP_HOME/bin/client/jboss-client.jar org.jgroups.tests.McastReceiverTest -mcast_addr 230.11.11.11 -port 5555
$ java -cp EAP_HOME/bin/client/jboss-client.jar org.jgroups.tests.McastReceiverTest -mcast_addr 230.11.11.11 -port 5555
然后,在另一个终端窗口中,启动 McastSenderTest。
java -cp EAP_HOME/bin/client/jboss-client.jar org.jgroups.tests.McastSenderTest -mcast_addr 230.11.11.11 -port 5555
$ java -cp EAP_HOME/bin/client/jboss-client.jar org.jgroups.tests.McastSenderTest -mcast_addr 230.11.11.11 -port 5555
如果要绑定到特定网络接口卡(NIC),请使用 -bind_addr YOUR_BIND_ADDRESS,其中 YOUR_BIND_ADDRESS 是您要绑定到的 NIC 的 IP 地址。在发送者和接收器中使用此参数。
当您在 McastSenderTest 终端窗口中键入时,您应该在 McastReceiverTest 窗口中看到输出。如果没有,请尝试以下步骤。
-
通过在 sender 命令中添加
-ttl VALUE来增加多播数据包的时间。此测试程序使用的默认值是32,VALUE不得大于255。 - 如果机器有多个接口,请确定您使用正确的接口。
- 联系系统管理员,以确保多播可以在您选择的接口上正常工作。
一旦您知道,多播可以在集群中的每个机器上正常工作,您可以重复上述测试来测试网络,将发送者放在一台机器上,将发件人放在另一台机器上。
22.2.11.2. 在失败检测中缺少心跳的原因 复制链接链接已复制到粘贴板!
有时,故障检测(FD)会怀疑群集成员,因为在某些情况下未收到心跳确认,T 表示由 timeout 和 max_tries 定义。
例如,节点 A、B、C 和 D (其中 A ping B、B ping C、C pings D 和 D pings A)会因为以下任何原因怀疑 C:
-
B 或 C 在 100% CPU 上运行,超过
T秒。因此,即使 C 向 B 发送心跳确认,B 可能无法处理它,因为它是 100% CPU 用量。 - B 或 C 是垃圾回收,这会导致与以上相同的情况。
- 上述两个情况的组合。
- 网络会丢失数据包。当网络上有很多流量时,通常会发生这种情况,并且交换机开始丢弃数据包,通常是首先广播,然后是 IP 多播,最后会发生 TCP 数据包。
-
b 或 C 是处理回调。例如,如果 C 收到对其需要
T+ 1 秒进行处理的频道的远程方法调用,则 C 将无法处理任何其他消息,包括心跳(包括心跳)。因此,B 将不会收到心跳确认,并且会怀疑 C。