由于在上线部署Java应用后需要重启tomcat等应用服务器,由于此时可能仍有用户登陆了需要重启的应用服务器,如果此时侯强制停止服务器,已经登陆用户的操作可能中断掉(例如正在做支付),用户体验并不好。为避免此类情况发生,服务器上线时候需要支持所谓的drain stop、soft stop或者Session Draining(nginx术语)。
所谓Session Draining指对已经登陆要上线服务器的用户,保持其session,直到其操作完成。但不允许新的request接入要上线的服务器。
借用nginx plus的图:
除了采用F5这样高大上的硬件方案外,可以选用的方案:
方案1、采用tomcat 7 支持的并行部署Parallel Deployment特征
http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Parallel_deployment
http://www.javacodegeeks.com/2011/06/zero-downtime-deployment-and-rollback.html
http://www.tomcatexpert.com/blog/2011/05/31/parallel-deployment-tomcat-7
要实现旧版本的session失效后,Tomcat自动卸载掉,使用undeployOldVersions参数。
<Host undeployOldVersions=”true” …>
…
</Host>
http://tomcat.apache.org/tomcat-8.0-doc/config/host.html#Standard_Implementation
如果应用服务器是tomcat,且技术栈皆为java,此种方案最为简单。
方案2:采用haproxy+nginx方案,haproxy作为负载均衡服务器,nginx作为反向代理服务器,利用haproxy对drain stop的支持
参考资料:https://github.com/haproxy/haproxy-1.5/blob/master/doc/architecture.txt 的4. Soft-stop for application maintenance部分内容.
haproxy 管理界面可以对各服务器的session进行监控。
命令行方式可以采用haproxyctl https://github.com/flores/haproxyctl
也可以采用haproxy原生命令 http://serverfault.com/questions/249316/how-can-i-remove-balanced-node-from-haproxy-via-command-line
此种方案也较为方便。
方案3、采用LVS
将需要部署的服务器权重设置为0或从池中移除,则LVS会对已有会话保持,但不允许新的请求分配到权重为0的服务。
对采用LVS集群的,可以考虑采用。
方案4、nginx
nginx plus(收费)支持所谓的Session Draining,原理上使用了ngx_http_upstream_conf_module的drain参数。
nginux plus关于session persistence的文章值得一看:https://www.nginx.com/products/session-persistence Session Draining部分内容。
对于开源的nginx,有两种方案:
1、proxy_next_upstream+proxy_pass
2、-quit 命令 kill -QUIT $( cat /usr/local/nginx/logs/nginx.pid )
以上两种方案都只能实现粗略功能,且无方便的管理界面(无法查看活跃session),没有haproxy方便,不采用。
参考资料:
http://www.ebaytechblog.com/2013/11/21/zero-downtime-instant-deployment-and-rollback/
https://www.nginx.com/products/session-persistence
以上两篇文章,很值得细看。
转载请注明:出家如初,成佛有余 » 服务器部署Session Draining支持方案