Tomcat --集群原理

参考以下两篇文章
http://zyycaesar.iteye.com/blog/296606
http://blog.csdn.net/liu251890347/article/details/38237911css

tomcat集群原理
对于web集群而言,最大的难点就是集群中多个节点之间数据保持一致,(Session)就是这些数据中比较重要的。目前实现各个节点之间数据一致有两种方式:
1.将全部的session数据放到一台服务器或数据库中,集群中全部的节点经过访问这台session服务器来获取数据。
2.集群中全部的节点之间进行session数据的同步复制,任何一个节点都保存了全部的session数据。
两种方式优缺点
方式一:简单、易于实现,可是存放session的服务器发生故障的话会致使整个系统不能正常工做。
方式二:可靠性比较高,任何一个节点的故障都不会对整个系统形成影响,所以,技术上实现起来更加复杂。前端

以下介绍tomcat集群配置
1.在tomcat的server.xml中配置web

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

这是简易的默认配置,完整的配置信息以下数据库

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="8">
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
          <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
           <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
           <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.MessageDispatch15Interceptor"/>
          </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"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>
          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

若是采用简易配置,则许多配置细节都会被省略掉,功能同样实现了。
以下详细介绍下完整的配置信息,该部份内容是我参考别人理解,阅者请本身对照的官网查看理解。
1.<Cluster,tomcat集群中各个节点经过创建tcp连接来实现session复制,复制有同步与异步两种模式。
同步模式:客户端的响应必须在session拷贝到其它节点完成后进行。
异步模式:无需等待session拷贝完就能够响应。
很明显,异步模式效率比较高,同步模式可靠性高。模式是由<Cluster中的channelSendOptions参数决定的,默认是8(异步模式),4是同步模式。
2.<Manager,它是用来在节点中拷贝session,默认使用DeltaManager,DeltaManager采用的是all-to-all的工做方式,即集群中的当前节点会把session数据向其它全部的节点拷贝(不管其它节点是否部署了当前应用)。
3.<Channel负责对tomcat集群的io层进行配置。
4.<Membership用于发现集群中其它节点。这里的address用的是组播地址,使用同一个组播地址和端口的多个节点同属于一个子集群,所以经过自定义组播地址和端口就能够实现一个大的集群(该集群包含多个子集群)。
5.<Receiver,用于各个节点接收其它节点发送的数据。
6.<Sender,用于各个节点向其它节点发送数据,具体的是经过<Transport节点实现。PooledParallelSender是从tcp链接池中获取链接,能够并行发送,即集群中多个子节点能够同时向其它全部节点发送数据而互不影响。
7.<Interceptor,起到一个阀门的做用,在数据到达目的节点前进行检测或其它操做,例如:TcpFailureDetector用于检测数据在传输过程当中是否发生了tcp错误。
8.<Valve,用于在节点向客户端响应前进行检测或进行某些操做,ReplicationValve用于检测当前的响应是否涉及session数据的更新,若是是,则启动session拷贝操做,filter用于过滤请求,如对客户端的图片、css、js的请求就不会涉及到session。所以,这里不须要检测,默认状况下不进行过滤,检测全部的响应。JvmRouteBinderValve会在前端的apache mod_jk发生错误时,保证同一客户端的请求发送到集群的同一节点。
9.<Deployer,用于集群的farm功能,监控应用中文件的更新,以保证集群中全部全部节点应用的一致性,例如:若是某个用户上传文件到集群中某个节点的应用程序目录下,Deployer会检测到这一操做并将这个文件拷贝到集群中其它节点相同应用对应的目录下,并保持全部的应用一致。
10.<ClusterListener,用于监听集群中节点发出和收到的数据。

参考这篇文章 http://zhidao.baidu.com/link?url=nyTOhjMIBK1QhBpnHkTEKZlQvLimDd_HbEoufEMYnrH4uK6cjvEI3_sIoMRi8pLrjIDxClu-cHS9wToS1lRyfB_ZEUp5PlGJIDvRDT2Dfqapache

mod_jk插件的负载均衡器根据在worker.properties中配置lbfactor(负载均衡因素),负责为集群系统中的tomcat服务器分配工做负荷,以实现负载均衡,每一个tomcat之间用集群管理器(SimpleTcpCluster)进行通讯,以实现session同步。tomcat

相关文章
相关标签/搜索