Apache httpd、Tomcat:两个 tomcat 之间似乎可以进行负载平衡,但其中一个 tomcat 停止运行,导致服务终止

Apache httpd、Tomcat:两个 tomcat 之间似乎可以进行负载平衡,但其中一个 tomcat 停止运行,导致服务终止

我正在执行一项任务,其中我必须对两个 tomcat 实例进行负载平衡,以便它们之间共享一个公共会话,并且当一个实例出现故障时,另一个实例可以处理该任务。

第一个任务似乎有效,因为当两个 Tomcat 版本都在线时,似乎没有问题。

我不知道如何检测哪个用户来自哪个 tomcat,所以我可以查看来自其他 tomcat 的用户是否正在聊天,然后 session-id 是否正确共享。

我面临的第二个问题是,如果一个 tomcat 宕机,另一个 tomcat 实例应该继续运行并处理发出的请求,但事实并非如此。只要任何一个 Apache tomcat 实例宕机,我就会收到 503,服务不可用。请告诉我如何修复此问题并测试哪个用户来自哪个 tomcat 实例。所做的更改:sites-enabled/000-default:

<Proxy balancer://mycluster>
    BalancerMember ajp://localhost:8010 route=jvmroute-first connectiontimeout=10
    BalancerMember ajp://localhost:8011 route=jvmroute-second connectiontimeout=10

   ProxySet stickysession=JSESSIONID

   Order Deny,Allow
   Deny from none
   Allow from all

</Proxy>

<VirtualHost *:80>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>

第一个tomcat的server.xml:

<Connector port="8080" proxyPort="80" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"
               redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>


<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="200" compression="force"
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
                keystoreFile="keystore" keystorePass="password" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>

 <Connector port="8010" protocol="AJP/1.3" redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvmroute-first">
// No modifications within Engine
</Engine>

第二个 tomcat 实例:

<Connector port="8081" proxyPort="80" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"
               redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>


<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="200" compression="force"
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
                keystoreFile="keystore.jks" keystorePass="password" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>
<Connector port="8011" protocol="AJP/1.3" redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>

为什么会发生这种情况。有任何想法或线索吗?非常感谢。:-)

编辑

负载均衡器似乎出了问题,因为过了一段时间我得到了错误,检查一下截图

在此处输入图片描述

答案1

这可能是因为您没有在 Tomcat 端启用会话复制。由于在 Apache 上启用了粘性会话,因此请求始终根据 JSESSIONID 的检查进行路由。

在具有故障转移功能的 Tomcat 实例中实现集群,以便在发生故障时任何失败的请求都将被重新路由到第二个 tomcat 服务器。

相关内容