这是我的问题:我有 3 个 Tomcat 7.0.x 服务器和 2 个 Apache 2.2.x HTTPd 服务器,请参见图片。(所有服务器都运行 Linux Redhat 6.2。)
因此,我在 Tomcat 1/2 之间设置了负载平衡,并在 Tomcat 3 上安置了一些小型微服务,但没有进行负载平衡。在 Apache 上,我使用带有粘性会话的循环机制,并使用 mod_proxy_ajp 来处理 Tomcat 节点。
<Virtual *:80>
Header Add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://t-ha-cluster>
ProxySet lbmethod=byrequest
BalancerMember ajp://tomcat1:8109 route=jvm-tc-1 connectiontimeout=400ms retry=60 ping=5
BalancerMember ajp://tomcat2:8109 route=jvm-tc-2 connectiontimeout=400ms retry=60 ping=5
ProxySet stickysession=ROUTEID
</Proxy>
<Proxy balancer://t-micro-cluster>
ProxySet lbmethod=byrequest
BalancerMember ajp://tomcat3:8109 route=jvm-tc-3 connectiontimeout=400ms retry=60 ping=5
ProxySet stickysession=ROUTEID
</Proxy>
<Location /app1>
ProxyPass balancer://t-ha-cluster/myapp stickysession=ROUTEID
ProxyPassReverse stickysession=ROUTEID
</Location>
<Location /app2>
ProxyPass balancer://t-ha-cluster/myapp stickysession=ROUTEID
ProxyPassReverse stickysession=ROUTEID
</Location>
<Location /search>
ProxyPass balancer://t-micro-cluster/myapp stickysession=ROUTEID
ProxyPassReverse stickysession=ROUTEID
</Location>
</Virtual>
现在,当我转到 /app1 时,会创建一个 ROUTEID=.jvm-tc-2,并在 Tomcat 2 服务器上创建会话。在页面加载时,它会从 Tomcat 3 上的 /search 获取小型搜索小部件,这会更改我的 ROUTEID=.jvm-tc-3。然后下一个请求从 /app 获取资源,我得到 ROUTEID=.jvm-tc-1。因此,现在在 Tomcat 1 节点上创建了一个新会话。 有没有更好的方法来编写我的 Apache 配置,以便用户始终使用 Tomcat 2?当我们扩展应用程序堆栈时,有没有办法让它可重用于其他应用程序?
我宁愿不保留每个 /appx 上下文的 ROUTEID,因为这将成为维护的噩梦。