我正在尝试将 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 返回的值?