“服务暂时不可用” mod_proxy_balancer 和粘性会话

“服务暂时不可用” mod_proxy_balancer 和粘性会话

我已经使用 stickysession cookie 配置了 Apache mod_proxy_balancer。

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED


<Proxy balancer://http-dedalo/>
    BalancerMember http://172.31.20.111:8080 retry=0 ping=10 route=1
    BalancerMember http://172.31.19.124:8080 retry=0 ping=10 route=2
    BalancerMember http://172.31.22.92:8080 retry=0 ping=10 route=3
    # Round Robin style load balancer
    ProxySet lbmethod=byrequests
    ProxySet stickysession=ROUTEID
</Proxy>

<Proxy balancer://ws-dedalo/>
    BalancerMember ws://172.31.20.111:8080 retry=0 route=1
    BalancerMember ws://172.31.19.124:8080 retry=0 route=2
    BalancerMember ws://172.31.22.92:8080 retry=0 route=3
    # Round Robin style load balancer
    ProxySet lbmethod=byrequests
    ProxySet stickysession=ROUTEID
 </Proxy>

浏览器已收到与路由 1 相关的 stickysession cookie,如果我关闭 172.31.20.111,则会收到“服务暂时不可用”的信息

我不明白为什么当这样的工作人员离线时,故障转移不起作用。

有两个平衡器,一个用于 http,另一个用于 websockets,我使用了 retry=0 来确保浏览器在两个平衡器中始终使用相同的路由 ID。Webapp 在 tomcat 集群上运行并基于 VAADIN 框架,websocket 连接用于会话心跳。

我已经使用指令来处理来自 tomcat 集群成员的 500 错误浏览器重定向到删除路由 ID cookie 的页面,然后它返回到平衡器以获取新的路由 ID

答案1

将重试设置为大于零,否则 Apache 将始终重试具有现有路由的请求连接。

本质上,如果您将重试次数设置为零,您将永远不会将一个工作进程的请求故障转移到另一个工作进程。当您发出请求并且工作进程被标记为“关闭”时,通常是因为底层服务以 5xx 返回代码响应,您必须在retry几秒内使用相同路由发出另一个请求。

相关内容