nginx+tomcat集群(六):Tomcat集群之间的session共享
前面我们实现了利用Nginx+Tomcat完成负载均衡的基本配置,但是这里有个问题,无法解决两台服务器之间的session共享问题。
如何解决这个问题,网上有很多资料可以参考:
- 利用Nginx自带的ip_hash,根据用户ip自动分配到对应的服务器,保证会话不丢失。
优点:最简单,不用任何变动,只要改变下nginx.conf 的配置即可实现。
缺点:在重启服务后,等于将后台变成单例,那部分用户的会话还是会丢失,不能实现高可用;
如果用户ip比较集中,访问也会集中到一台服务器,那么负载均衡就失去意义。
- 利用Redis、memcached等缓存数据库实现会话的缓存
优点:性能高,可以实现高并发,大数据的系统支持;
水平扩展较容易,性能也不会降低。
缺点:引入第三方模块,增加架构复杂性,甚至需要修改源代码。
- 利用Tomcat集群自带的session共享模块。
优点:配置简单,不需要引入第三方模块,不用调整现有架构和代码。
缺点:不适合大规模集群架构,水平扩展存在性能瓶颈。
考虑到当前业务特点,业务量较小,我决定还是使用第三种方案(建议各位做好最后的压测)。
接下来就是配置,这里主要修改tomcat的server.xml和项目的web.xml文件。
一、修改tomcat1的server.xml
编辑文件找到 <Engine name="Catalina" defaultHost="localhost">这个位置,在下面加入这段话,分别复制到tomcat1和tomcat2的server.xml里:这里要针对不同tomcat版本选择不同的配置文件。官网地址
<!-- 集群缓存配置 -->
<Cluster channelSendOptions="8" className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership address="228.0.0.4" className="org.apache.catalina.tribes.membership.McastService" dropTime="3000" frequency="500" port="45564"/>
<!-- 这里的port 4001是两台服务器之间唯一不同的地方 -->
<Receiver address="auto" autoBind="100" className="org.apache.catalina.tribes.transport.nio.NioReceiver" maxThreads="6" port="4001" selectorTimeout="5000"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" deployDir="/opt/tmp/tomcat/war-deploy/" tempDir="/opt/tmp/tomcat/war-temp/" watchDir="/opt/tmp/tomcat/war-listen/" watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
二、接下来我们再配置web.xml
直接在我们的项目文件中的web.xml里添加<distributable/>这个标签,这是因为tomcat集群必须要要带上这个标签,否则不会生效。
上面这个web.xml是tomcat自带的ROOT项目里的web.xml配置。然后我们可以访问地址验证下了:
验证方式:先在index.jsp加入下述代码
<%= request.getSession().getId() %>
<h1>8081</h1>
然后我们访问地址验证sessionId是否变化,没变化则是生效。
欢迎各位提出问题,互相探讨,共同进步。