我们有一个带有负载平衡器 (haproxy) 的 tomcat 集群。作为升级脚本的一部分,我们希望使 3 个集群中的一个 tomcat 处于饥饿状态,等待直到该特定 tomcat 处理完所有请求。然后我们才会关闭它并升级在该 tomcat 上运行的 Web 应用程序。
我们的问题是:
我们的脚本如何指示 tomcat 是否已完全饥饿(所有请求都已得到处理)?
tomcat 本身是否公开了 API?或者我们可以查询 haproxy 来获取该信息?
谢谢!
编辑:这是我的 haproxy 配置文件:
global
debug
stats socket /etc/haproxy/haproxysock level admin
defaults
mode http
timeout connect 5s
timeout queue 300s
timeout client 300s
timeout server 300s
frontend http-in
bind *:8080
default_backend NG
backend NG
cookie JSESSIONID prefix
server 10.0.110.44 10.0.110.44:8080 cookie JSESSIONID_SERVER_1 check maxconn 500
server 10.0.110.45 10.0.110.45:8080 cookie JSESSIONID_SERVER_2 check maxconn 500
#server 10.0.110.41 10.0.110.41:8080 cookie JSESSIONID_SERVER_3 check maxconn 500
option httpclose
option forwardfor
balance roundrobin
option redispatch
retries 15
listen admin
bind *:8081
stats enable
stats refresh 1s
答案1
从负载均衡器的角度来看,很难断言完全饥饿。实际上,无法确定是否还有客户端拥有以您的服务器JSESSIONID
为前缀的 cookie 。NOLB
我认为至少有两种方法可以推进这一进程
- 根据会话生命周期估计总饥饿时间
- 当然,这并不完美,因为 TTL 正在更新期间饥饿阶段
- 定义一个边界(例如每分钟 1 个请求)来将服务器视为饥饿状态
如果 Tomcat 确实有办法枚举有效会话,那么这将允许一种更安全的方法(通过 servelet 或类似方法)。
请注意,如果你限制自己只停止完全饥饿的应用服务器,那么顽强的客户端可以阻止你曾经啟動。