2

我正在尝试将 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

这是场景:

  1. 第一个请求没有 cookie,因此 Apache 选择负载均衡器中的下一个可用服务器来处理请求。
  2. 后端 Tomcat 服务器设置 JSESSIONID 但不记录返回的实际值。
  3. 下一个请求进来,Apache 注意到没有为给定的 JSESSIONID 记录后端服务器,因此它选择下一个可用的,在这种情况下,另一个作为第一个请求的服务
  4. Tomcat 注意到 JSESSIONID 的值无效,因此它创建了一个新值。
  5. Apache 没有注意到 JSESSIONID 已更改以将其固定到该后端服务器。
  6. 回到pt。3

有没有办法说服 Apache 记下 Tomcat 返回的值?

4

1 回答 1

2

也许如果您尝试使用tomcat会话复制。我发现了这个有趣的帖子:

. 你也可以尝试使用 redis:

请告诉我你的经验。

于 2013-12-18T14:40:10.697 回答