我们都知道,为了应对大量的请求,单台的Tomcat不能满足的时候,需要采取一系列的措施,例如分流、集群等。
进行Tomcat集群的时候,最需要关注和实现的,是多个Tomcat实例间的Session数据的共享,这样在节点crash的时候,才能使用其他节点响应。
关于集群,Tomcat的commiter和主要维护人Mark Thmoas在ApacheCon上做
Cluster的分享时这样描述:
什么时候需要使用Cluster呢?
理论上,永远不要。
为什么呢,Thomas是这样说的
Adds configuration complexity
Requires additional processing
Debugging is lot harder
而你可能真正需要的是
Load-balancing plus sticky sessions
If a node fails, sessions will be lost
集群应该是最后一个选择。
我们前面的文章写过通过Redis/Memcached来存储Session实现多实例间的Session数据共享的原理及步骤。(详解集群内Session高可用的实现原理 )
其实Tomcat官方提供了内置的Cluster功能,无须第三方的插件支持。
Tomcat官方的集群(Cluster)配置说明
整个集群的配置可以分为以下几步:
配置每个Tomcat实例的Engine,增加jvmRoute值
配置集群部署的应用,修改其web.xml,增加<distributable/>配置。
使用Apache进行负载均衡,同时配置Session sticky和接受请求转发的Map path 。关于Apache的配置,可以参考前面的文章
修改各个Tomcat实例的Cluster配置,最简配置为打开默认注释的内容:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>这个最简易的SimpleTcpCluster会使用内存进行Session数据的存储,并且集群间各个Tomcat实例会互相进行数据备份。 各个实例间会通过multicast的方式进行心跳检测。
以下为实例1的log

下图为实例2的log

session数据的数据的传输是通过Tcp Connection进行的。
下图为断开一个实例连接时,其它实例收到的检查信息

当然,我们也可能对Cluster进行各项属性的定义,例如Session的Manager,multicast和数据传递的实现等,担心Session放在内存中的话,可以使用其它的Manager实现。
Tomcat提供了三种方式的Session共享策略:
Session数据持久化,将数据保存到共享文件系统
Sesion持久化,数据保存到共享的数据库中,数据通过JDBCStore进行存储
使用内存进行共享,使用Tribes
5. 继续使用examples中的session进行功能检查,此时,你会发现多个实例间数据可以正常共享,而且不需要其它第三方的插件支持,绝对官方的实现。

以上,即为配置Tomcat官方提供的Cluster的步骤。
相关阅读
猜你喜欢

Tomcat那些事儿
本公众号由曾从事应用服务器核心研发的工程师维护。文章深入Tomcat源码,分析应用服务器的实现细节,工作原理及与之相关的技术,使用技巧,工作实战等。起于Tomcat但不止于此。同时会分享并发、JVM等,内容多为原创,欢迎关注。
扫描或长按下方二维码,即可关注!

当单台Tomcat无法应对大量请求时,可以采用集群和Session共享来提高服务可用性。Tomcat官方提供内置Cluster功能,通过配置每个实例的Engine、应用的web.xml以及Cluster设置,实现Session数据在多个Tomcat实例间的共享。集群配置涉及jvmRoute、distributable标签、负载均衡和心跳检测。Tomcat的Session管理策略包括内存共享、文件系统或数据库持久化。本文还讨论了Session过期、禁用Cookie后的处理以及源码分析。
7117

被折叠的 条评论
为什么被折叠?



