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

 


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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要实现nginxtomcat一起部署springboot项目并实现tomcat集群,需要进行以下步骤: 1. 部署springboot项目到tomcat上,并启动多个tomcat实例,这些实例需要在不同的端口上运行。 2. 配置nginx作为反向代理服务器,将所有请求转发到tomcat集群中的一个实例上。可以使用upstream模块来配置tomcat集群,如下所示: ```nginx http { upstream tomcat_cluster { server tomcat1_ip:tomcat1_port; server tomcat2_ip:tomcat2_port; server tomcat3_ip:tomcat3_port; } server { listen 80; server_name example.com; location / { proxy_pass http://tomcat_cluster; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` 在上面的配置中,tomcat_cluster是一个upstream实例,包含了所有tomcat实例的IP地址和端口号。nginx会将请求转发到tomcat_cluster中的一个实例上。 3. 配置session共享,以便在tomcat集群中的不同实例之间共享用户会话信息。可以使用memcached或redis等分布式缓存来实现session共享。 4. 配置负载均衡器,以便nginx可以根据不同的负载均衡算法来分配请求到不同的tomcat实例上。可以使用nginx自带的负载均衡模块或第三方模块,如nginx-upsync-module等。 5. 测试集群的可伸缩性和容错性,以确保tomcat集群可以在高负载和节点故障的情况下正常运行。 总结来说,要实现nginxtomcat一起部署springboot项目并实现tomcat集群,需要进行反向代理、session共享、负载均衡器等多方面的配置和测试。这样可以保证项目的高可用性和可伸缩性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值