Jboss Mod_cluster
Jboss Mod_cluster
我有一个 jboss 集群,其中有 2 个节点(a 和 b)+ 1 个作为 mod_cluster 工作的 apache(apache 在单独的服务器中)
如果其中一个节点 A 出现故障,mod 集群将无法连接到另一个节点。
因此,如果 nodeA 崩溃,我无法通过 http://apache_server/myapp, but I can by http://nodeb/myapp 访问 jboss 应用程序,反之亦然
我深入研究 google 几乎所有我发现的都说这与会话有关,但我找不到我的配置有什么问题。 (Mod_cluster 使用此工具配置 Load Balancer Configuration Tool
NodeA 日志
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
NodeB 日志
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
需要在 domain.xml 中完成的可能更改:
1. 在 下,添加
2. 在下,添加
3. 在 mod-cluster 子系统下,添加 < mod-cluster-config advertise-socket="modcluster" proxy-list="< ip-address>:< port-in-mod-集群配置”连接器="ajp">
在 mod 集群配置中:
1. 全部允许
2.ManagerBalancerName server-group(具体名称同上)
此外,您使用 virtualization/containers 吗?要处理此类情况下的会话复制问题,您可能需要尝试 "sticky session"。
能见度
- JBoss worker 实例必须能够联系您的 ```EnableMCPMReceive`` VirtualHost
- 您的 JBoss 工作者实例向 Apache HTTP 服务器报告它们的 IP 地址和 AJP 端口
- 您的 Apache HTTP 服务器必须能够通过报告的地址与他们联系
代理通行证
JGroups、Infinispan、域、集群
mod_cluster,即 modcluster 子系统 与前面提到的 无关。子系统完全没有注意到已形成某个集群或您在域中拥有您的实例这一事实——这也与您的实例首先位于集群中无关。在调查 mod_cluster 配置时不要理会 JGroups 消息。
不过,如果您的 JGroups 集群坏了...
Infinispan - 即在这种情况下您的网络会话数据的分布式或复制缓存,依赖于 JGroups 来形成集群并在该集群中交换消息。如果您的实例不能用于集群或无法交换消息,您可能会在故障转移时丢失会话数据。
例如:Apache HTTP Server mod_cluster balacner 决定将带有 JSESSIONID yadayadaXXX.worker-1 的请求发送给 worker-2,因为 worker-1 已关闭。由于网络配置错误,worker-1和worker-2一直没有正确组成集群,所以worker-2没有worker-1的session数据。结果是创建了一个新会话的 Web 应用程序,即您的客户丢失了他的上下文,例如购物车(热门展示柜)。
代理通行证
除非您有特别的想法,否则不要使用它。 mod_cluster 的全部要点是它在内存中创建所有代理指令,随着您的工作节点及其 Web 应用程序的来来去去动态动态地运行。如果你想:
- 对来自特殊网络应用程序的特殊错误代码做出反应,例如将应该意味着错误的 HTTP 代码视为有效,反之亦然
- 直接从 Apache HTTP 服务器而不是工作节点提供静态内容 - 例如图片...
- 将某些上下文负载平衡到 mod_cluster 感知的 JBoss 工作节点,并将某些上下文负载平衡到非 mod_cluster 服务器,例如PHP...
中的另一个 Apache HTTP 服务器 运行 Drupal
ManagerBalancerName
我不清楚您为什么需要更改它。如果更改默认值,则还必须在 Jboss modcluster 子系统配置中更改 balancer="new_value"
。实际上,它告诉 Apache HTTP 服务器中的 mod_cluster 在内部创建更多单独的命名 ProxyPass Balacners。然后可以使用 ProxyPass 指令分别调整它们。你需要调整它们吗?根据您的其余配置,我相信情况并非如此。例如,会话粘性在 mod_cluster 子系统的 JBoss 节点中配置 - worker ndoes report 到 Apache HTTP Server 平衡器。
HTH,-K-
我有一个 jboss 集群,其中有 2 个节点(a 和 b)+ 1 个作为 mod_cluster 工作的 apache(apache 在单独的服务器中)
如果其中一个节点 A 出现故障,mod 集群将无法连接到另一个节点。
因此,如果 nodeA 崩溃,我无法通过 http://apache_server/myapp, but I can by http://nodeb/myapp 访问 jboss 应用程序,反之亦然
我深入研究 google 几乎所有我发现的都说这与会话有关,但我找不到我的配置有什么问题。 (Mod_cluster 使用此工具配置 Load Balancer Configuration Tool
NodeA 日志
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
NodeB 日志
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
需要在 domain.xml 中完成的可能更改:
1. 在
2. 在
3. 在 mod-cluster 子系统下,添加 < mod-cluster-config advertise-socket="modcluster" proxy-list="< ip-address>:< port-in-mod-集群配置”连接器="ajp">
在 mod 集群配置中:
1. 全部允许
2.ManagerBalancerName server-group(具体名称同上)
此外,您使用 virtualization/containers 吗?要处理此类情况下的会话复制问题,您可能需要尝试 "sticky session"。
能见度
- JBoss worker 实例必须能够联系您的 ```EnableMCPMReceive`` VirtualHost
- 您的 JBoss 工作者实例向 Apache HTTP 服务器报告它们的 IP 地址和 AJP 端口
- 您的 Apache HTTP 服务器必须能够通过报告的地址与他们联系 代理通行证
JGroups、Infinispan、域、集群
mod_cluster,即 modcluster 子系统 与前面提到的 无关。子系统完全没有注意到已形成某个集群或您在域中拥有您的实例这一事实——这也与您的实例首先位于集群中无关。在调查 mod_cluster 配置时不要理会 JGroups 消息。
不过,如果您的 JGroups 集群坏了...
Infinispan - 即在这种情况下您的网络会话数据的分布式或复制缓存,依赖于 JGroups 来形成集群并在该集群中交换消息。如果您的实例不能用于集群或无法交换消息,您可能会在故障转移时丢失会话数据。
例如:Apache HTTP Server mod_cluster balacner 决定将带有 JSESSIONID yadayadaXXX.worker-1 的请求发送给 worker-2,因为 worker-1 已关闭。由于网络配置错误,worker-1和worker-2一直没有正确组成集群,所以worker-2没有worker-1的session数据。结果是创建了一个新会话的 Web 应用程序,即您的客户丢失了他的上下文,例如购物车(热门展示柜)。
代理通行证
除非您有特别的想法,否则不要使用它。 mod_cluster 的全部要点是它在内存中创建所有代理指令,随着您的工作节点及其 Web 应用程序的来来去去动态动态地运行。如果你想:
- 对来自特殊网络应用程序的特殊错误代码做出反应,例如将应该意味着错误的 HTTP 代码视为有效,反之亦然
- 直接从 Apache HTTP 服务器而不是工作节点提供静态内容 - 例如图片...
- 将某些上下文负载平衡到 mod_cluster 感知的 JBoss 工作节点,并将某些上下文负载平衡到非 mod_cluster 服务器,例如PHP... 中的另一个 Apache HTTP 服务器 运行 Drupal
ManagerBalancerName
我不清楚您为什么需要更改它。如果更改默认值,则还必须在 Jboss modcluster 子系统配置中更改 balancer="new_value"
。实际上,它告诉 Apache HTTP 服务器中的 mod_cluster 在内部创建更多单独的命名 ProxyPass Balacners。然后可以使用 ProxyPass 指令分别调整它们。你需要调整它们吗?根据您的其余配置,我相信情况并非如此。例如,会话粘性在 mod_cluster 子系统的 JBoss 节点中配置 - worker ndoes report 到 Apache HTTP Server 平衡器。
HTH,-K-