Tomcat集群Cluster实现原理剖析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文意在介绍对tomcat集群进行更深入详细的配置以满足特定需求。
对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块。要实现这一点,大体上有两种方式,一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据;另一种就是在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据。两种方式都各有优点,第一种方式简单、易于实现,但是存在着Session服务器发生故障会导致全系统不能正常工作的风险;第二种方式可靠性更高,任一节点的故障不会对整个系统对客户访问的响应产生影响,但是技术实现上更复杂一些。常见的平台或中间件如microsoft 和IBM WAS都会提供对两种共享方式的支持,tomcat也是这样,但是一般采用第二种方式。
当采用tomcat默认集群配置( className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>) 时,配置的细节实际上被省略了,对于大多数应用而言,使用默认配置已经足够,完整的默认配置应该是这样: className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdo wn="false" notifyListenersOnRepli cation="true"/> className="org.apache.catalina.tribes.group.GroupChannel"> className="org.apache.catalina.tribes.membership.McastServi ce" address="228 .0.0.4" port="45564" frequency="5 00" dropTime="30 00"/> className="org.apache.catalina.tribes.transport.nio.NioRece iver" address="auto" port="4000" autoBind="100" selectorTimeout= "5000" maxThreads="6"/> className="org.apache.catalina.tribes.transport.Replication Transmitter"> className="org.apache.catalina.tribes.transport.nio.PooledP arallelSender"/> className="org.apache.catalina.tribes.group.interceptors.Tc pFailureDetector"/> className="org.apache.catalina.tribes.group.interceptors.Me ssageDispatch15Interceptor"/> className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> className="org.apache.catalina.ha.session.JvmRouteBinderVal ve"/> className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-te mp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-l isten/" watchEnabled="false" /> className="org.apache.catalina.ha.session.JvmRouteSessionID BinderListener"/> className="org.apache.catalina.ha.session.ClusterSessionLis tener"/> 下面笔者对这里的配置项作详细解释,以下容均是笔者阅读了tomcat官方文档后自己的理解,有些可能不对,希望读者能带着批判的眼光阅读,并欢迎指正笔者错误。 tomcat集群各节点通过建立tcp来完成Session的拷贝,拷贝有同步和异步两种模式。在同步模式下,对客户端的响应必须在Session拷贝到其他节点完成后进行;异步模式无需等待Session 拷贝完成就可响应。异步模式更高效,但是同步模式可靠性更高。同 步异步模式由 channelSendOptions参数控制,默认值是8,为异步模式,4是同步模式。在异步模式下,可以通过加上拷贝确认(Acknowledge)来提高可靠性,此时channelSendOptions设为10。 Manager用来在节点间拷贝Session,默认使用DeltaManager,DeltaManager采用的一种all-to-all的工作方式,即集群中的节点会把Session数据向所有其他节点拷贝,而不管其他节点是否部署了当前应用。当集群中的节点数量很多并且部署着不同应用时,可以使用BackupManager,BackManager仅向部署了当前应用的节点拷贝Session。但是到目前为止BackupManager并未经过大规模测试,可靠性不及DeltaManager。 Channel负责对tomcat集群的IO层进行配置。Membership 用于发现集群中的其他节点,这里的address用的是组播地址(Multicast address,了解更多组播地址详情请参见 /wu_jietian/archive/2010/04/13/5480010.aspx),使用同一个组播地址和端口的多个节点同属一个子集群,因此通过自定义组播地址和端口就可将一个大的tomcat集群分成多个子集群。Receiver用于各个节点接收其他节点发送的数据,在默认配置下tomcat会从4000-4100间依次选取一个可用的端口进行接收,自定