apache+JK+tomcat集群配置
blog迁移至:http://www.micmiu.com
本文主要讲解如何在负载均衡的配置完成的基础上简单实现apache+JK+tomcat的集群配置
有关apache+JK+tomcat负载均衡的安装及配置详见:
http://sjsky.iteye.com/blog/918768
概述集群方式和之前blog中的负载均衡基本配置相同, Tomcat 中的集群原理是通过组播的方式进行节点的查找并使用 TCP 连接进行会话的复制。集群不同于负载平衡的是,由于集群服务需要在处理请求之间不断地进行会话复制,复制后的会话将会慢慢变得庞大,因此它的资源占用率是非常高的,如果在并发量大的应用中,复制的会话会变得相当大,而使用的总内存更是会迅速升高。但集群的会话复制,增加了系统的高可用性。由于在每台服务器都保存有用户的 Session 信息,如果服务器集群中某一台宕机,应用可以自动切换到其它服务器上继续运行,而用户的信息不会丢失,这提高了应用的冗错性。 具体采用负载平衡还是集群,这要取决于实际应用的具体需求了。
下面讲述实现集群配置的修改:
tomcat官方参考文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
[一]实现集群的基本条件
如果要实现session复制,需要满足以下七点:
所有的session里的变量要实现序列化,继承java.io.Serializable去掉tomcat的conf/server.xml中Cluster的注释确认server.xml中定义好ReplicationValve如果tomcat实例运行同一台主机上,确保tcpListenPort的值唯一,一般情况下端口值的范围4000-4100确认web应用配置文件web.xml中有标签<distributable/> 如果使用了mod_jk,那么<Engine name="Catalina" jvmRoute="node01" >中jvmRoute属性值要和worker.properties中的定义一致确保集群中的所有节点的时间同步。确保负载均衡软件设置为session sticky模式
[二]具体配置修改
基本配置参见我的另一关于负载均衡配置的blog,里面讲得很详细
1、web.xml的根节点<webapp>下增加标签<distributable/>
2、server.xml中Cluster属性片段
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"channelSendOptions="8"><Manager className="org.apache.catalina.ha.session.DeltaManager"expireSessionsOnShutdown="false" notifyListenersOnReplication="true" /><ChannelclassName="org.apache.catalina.tribes.group.GroupChannel"><MembershipclassName="org.apache.catalina.tribes.membership.McastService"address="228.0.0.4" port="45564" frequency="500" dropTime="3000" /><!-- 如果运行在同一台主机上port='4000'的值保证唯一,不能冲突 --><ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"address="auto" port="4000" autoBind="100" selectorTimeout="5000"maxThreads="6" /><SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter"><TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender" /></Sender><InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" /><InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" /></Channel><Valve className="org.apache.catalina.ha.tcp.ReplicationValve"filter="" /><ValveclassName="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" /><ClusterListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" /><ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener" /></Cluster>