我正在尝试将Apache设置为具有会话亲缘性的2个Tomcat实例的负载均衡器 .
目标是让会话坚持到一个服务器但是有下一个会话(当它被后端服务器改变时)转到下一个可用的服务器(假设使用循环算法以便于实现) . 在Tomcat中使用“jvmRoute”和在Apache中使用等效的“路由”时,执行路由的实际值是路由名称,该名称不会更改,并且所有请求始终路由到单个客户端的同一后端服务器 .
到目前为止,我发现只使用JSESSIONID cookie时会出现鸡/蛋问题 . 我们来考虑以下设置:
2个Tomcat服务器侦听端口8009和8010(AJP13)1具有以下配置的Apache服务器
<Proxy balancer://hello-cluster>
BalancerMember ajp://127.0.0.1:8009/hello
BalancerMember ajp://127.0.0.1:8010/hello
</Proxy>
ProxyPass /hello balancer://hello-cluster stickysession=JSESSIONID
这是场景:
-
第一个请求没有cookie,因此Apache选择负载均衡器中的下一个可用服务器来处理请求 .
-
后端Tomcat服务器设置JSESSIONID但不记录返回的实际值 .
-
下一个请求进来,Apache注意到没有为给定的JSESSIONID注明后端服务器,因此它选择下一个可用的服务器,在这种情况下,另一个服务器作为第一个请求服务
-
Tomcat注意到JSESSIONID的值无效,因此它创建了一个新值 .
-
Apache没有注意到JSESSIONID已更改为将其固定到该后端服务器 .
-
回到pt . 3
有没有办法说服Apache注意Tomcat返回的值?
1 回答
也许如果您尝试使用tomcat会话复制 . 我找到了这篇有趣的帖子:
. 您也可以尝试使用redis:
请告诉我你的经历 .