4

我有一个 jboss 集群,有 2 个节点(a 和 b)+ 1 个 apache 作为 mod_cluster(apache 在单独的服务器中)

如果其中一个 nodeA 出现故障,mod cluster 将无法连接到另一个 nodeA。

因此,如果 nodeA 崩溃,我无法通过http://apache_server/myapp访问 jboss 应用程序,但我可以通过http://nodeb/myapp访问 jboss 应用程序,反之亦然

我在谷歌上挖掘几乎所有我发现的都说与会话有关,但我无法找到我的配置有什么问题。(使用此工具配置的 Mod_cluster负载均衡器配置工具

节点A日志

15/05/2016 07:45:22,741 ERROR [org.jgroups.protocols.TCP] (http-/nodeA:8080-90) failed sending message to jbossnodeb:jbossnodeb/web (4148 bytes): java.net.SocketException: Socket closed, cause: null
15/05/2016 07:45:22,790 ERROR [org.jgroups.protocols.TCP] (OOB-6464,shared=tcp) failed sending message to jbossnodeb:jbossnodeb/web (4141 bytes): java.net.SocketException: Broken pipe, cause: null

节点B日志

15/05/2016 07:45:23,126 ERROR [org.jgroups.protocols.TCP] (OOB-4949,shared=tcp) failed sending message to jbossnodea:jbossnodea/web (79 bytes): java.net.SocketException: Broken pipe, cause: null
15/05/2016 07:45:53,457 WARN  [org.jgroups.protocols.TCP] (Timer-1,shared=tcp) null: no physical address for jbossnodea:jbossnodea/web, dropping message

Apache mod_cluster 服务器日志

[Sun May 15 07:45:04 2016] [error] (70007)The timeout specified has expired: proxy: read response failed from (null) (nodeA_IP)
[Sun May 15 07:45:34 2016] [error] (70007)The timeout specified has expired: ajp_cping_cpong: apr_socket_recv failed
[Sun May 15 07:45:38 2016] [error] ajp_handle_cping_cpong: ajp_ilink_receive failed
[Sun May 15 07:45:38 2016] [error] (70007)The timeout specified has expired: proxy: AJP: cping/cpong failed to (null) (nodeA_IP)
[Sun May 15 07:45:44 2016] [error] (70007)The timeout specified has expired: ajp_cping_cpong: apr_socket_recv failed
[Sun May 15 07:45:44 2016] [error] (70007)The timeout specified has expired: proxy: dialog to nodeA_IP:8009 (nodeA_IP) failed
[Sun May 15 07:45:44 2016] [error] ajp_read_header: ajp_ilink_receive failed
[Sun May 15 07:45:44 2016] [error] (70007)The timeout specified has expired: proxy: dialog to nodeA_IP:8009 (nodeA_IP) failed
[Sun May 15 07:45:44 2016] [error] (70007)The timeout specified has expired: proxy: dialog to nodeA_IP:8009 (nodeA_IP) failed
[Sun May 15 07:45:45 2016] [error] ajp_read_header: ajp_ilink_receive failed
[Sun May 15 07:45:45 2016] [error] (70007)The timeout specified has expired: proxy: dialog to (null) (nodeA_IP) failed
[Sun May 15 07:45:45 2016] [error] ajp_read_header: ajp_ilink_receive failed
[Sun May 15 07:45:45 2016] [error] (70007)The timeout specified has expired: proxy: dialog to (null) (nodeA_IP) failed
[Sun May 15 07:45:45 2016] [error] ajp_read_header: ajp_ilink_receive failed
[Sun May 15 07:45:45 2016] [error] proxy: CLUSTER: (balancer://clusterjboss). All workers are in error state

配置 apache mod_cluster

AdvertiseGroup 225.0.1.107:23364
KeepAliveTimeout 60
ManagerBalancerName clusterjboss
ServerAdvertise On
AdvertiseFrequency 5
EnableMCPMReceive
CreateBalancers 0
AllowDisplay On

ProxyPass / balancer://clusterjboss/ stickysession=JSESSIONID|jsessionid nofailover=On
4

2 回答 2

1

domain.xml 中可能需要做的更改:
1. 在 <domain-controller> 下,添加 <remote host="<ip-address-of-master-node>" port="<port>" security-realm= "ManagementRealm"/>
2.在<servers>下,添加<server name="slave-node" group="server-group" auto-start="true">
3.在mod-cluster子系统下,添加<mod-cluster -config advertise-socket="modcluster" proxy-list="<ip-address>:<port-in-mod-cluster-config" connector="ajp">

在 mod-cluster 配置中:
1. 全部允许
2. ManagerBalancerName 服务器组(确切名称如上)

另外,您是否使用任何虚拟化/容器?要在这种情况下处理会话复制问题,您可能需要尝试“粘性会话”。

于 2016-05-26T19:12:50.750 回答
1

能见度

  • JBoss 工作实例必须能够联系您的 ```EnableMCPMReceive`` VirtualHost
  • 您的 JBoss 工作程序实例向 Apache HTTP 服务器报告它们的 IP 地址和 AJP 端口
  • 您的 Apache HTTP 服务器必须能够通过这些报告的地址与他们联系

JGroups,Infinispan,域,聚类

mod_cluster,即 modcluster 子系统与上述任何内容无关。子系统完全没有注意到已经形成了一些集群或者您在域中拥有实例的事实——这也与首先将您的实例放在集群中无关。在调查 mod_cluster 配置时不要打扰 JGroups 消息。

虽然,如果你的 JGroups 集群坏了......

Infinispan - 在这种情况下,即您的 Web 会话数据的分布式或复制缓存,依赖于 JGroups 来形成集群并在该集群中交换消息。如果您的实例无法用于集群或无法交换消息,您可能会在故障转移时遇到会话数据丢失的情况。

例如:Apache HTTP Server mod_cluster balacner 决定向 worker-2 发送带有 JSESSIONID yadayadaXXX.worker-1 的请求,因为 worker-1 已关闭。由于网络配置错误,worker-1 和worker-2 从未正确组成集群,因此worker-2 没有worker-1 的会话数据。结果是创建了一个新会话的 Web 应用程序,即您的客户丢失了他的上下文,例如购物车(流行展示)。

代理通行证

除非您有特定的想法,否则不要使用它。mod_cluster 的全部意义在于它在内存中创建所有代理指令,当您的工作节点及其 Web 应用程序来来去去时动态地动态创建。如果你想,你开始摆弄额外的 ProxyPass 指令:

  • 对来自特殊 Web 应用程序的特殊错误代码做出反应,例如将应该表示错误的 HTTP 代码视为有效,反之亦然
  • 直接从 Apache HTTP 服务器而不是从工作节点提供静态内容 - 例如图片...
  • 将某些上下文负载平衡到可识别 mod_cluster 的 JBoss 工作节点,并将某些上下文负载平衡到非 mod_cluster 服务器,例如在 PHP 中运行 Drupal 的另一个 Apache HTTP 服务器...

经理平衡器名称

我不清楚你为什么需要改变它。如果您更改默认值,您还必须更改balancer="new_value"您的 Jboss modcluster 子系统配置。实际上它告诉 Apache HTTP 服务器中的 mod_cluster 在内部创建更多独立的命名 ProxyPass Balacners。然后可以使用 ProxyPass 指令单独调整它们。你需要调整它们吗?根据您的其余配置,我相信事实并非如此。例如,会话粘性在 mod_cluster 子系统的 JBoss 节点中配置 - worker ndoes 将此报告给 Apache HTTP Server 平衡器。

HTH, -K-

于 2016-05-31T10:40:37.413 回答