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是否变化,没变化则是生效。

 


欢迎各位提出问题,互相探讨,共同进步。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值