nginx tomcat cluster session 同步
前言
公司系统要做高可用,则需要用多台服务器做成主从或主备集群,这样当一台服务器宕机后,集群还能对外提供服务。 我们拟使用2台服务器做成主从集群,那就必须解决2台服务器中tomcat session同步问题。
tomcat cluster
首先采用的同步方案是tomcat自带的解决方案,即便此方案有一定的缺点,由于我们仅作2台服务器的集群,且 此方案对代码无侵入,不需要修改程序代码,所以是我们的首选解决方案。
对于集群的配置方式详见tomcat 的文档,文档中对session 复制的缺陷、集群配置的方式说的很明了了。 但其中有2个坑,导致我觉得写这篇博人,以免重复踩坑。
https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
1. 组播地址
组播地址文档中要求配置成228.0.0.4 , 这个地址是保留地址,用户无需修改为自己服务器的ip地址。
2. 单机可以实现session复制,多台服务器时无法实现session复制 的问题
问题描述:在单机上部署2个tomcat, 并配置好session复制。 通过ip1:port1 ip1:port2 查看到的session id 是一致的(如何查看session id请自行google )。 但将此方式部署在2台服务器上时, 通过ip1:port ip2:port 查看到的session id 是不一致的。
针对此问题,有些博文还指出 tomcat cluster 不支持多机。 当然 tomcat 不可能这么弱鸡了,这是不可能的。
问题原因: tomcat session 实现原理是依据cookie, 通过浏览器访问ip1:port ip2:port,浏览器2个窗口用的是不同的cookie, 从而导致看到的session id不一致。
解决方案:相信各位朋友看到问题原因,就知道解决方案了, 其实 再加一层nginx 做负载均衡,只有一个浏览器窗口,则保证了cookie一致, cookie 一致则session id 一致。