我正在执行一项任务,其中我必须对两个 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 服务器。