配置Tomcat的集群系统

来源:互联网 发布:擎洲软件 编辑:程序博客网 时间:2024/05/22 15:32

一、配置集群系统的负载平衡器


背景:Windows中,把Apache服务器和两个Tomcat服务器集成,Tomcat1的AJP端口为8009,Tomcat2的AJP端口为8109。(如果两个Tomcat服务器运行在不同的机器上,它们可以使用相同的AJP端口)

以下是Apache和两个Tomcat服务器集成,以及配置负载平衡器的步骤:
1、安装Apache HTTP

2、JK插件mod_jk.so放进<APACHE_HOME>/modules目录


3、<APACHE_HOME>/conf目录下创建workers.properties

#指定Tomcat服务器名单worker.list = worker1, worker2, loadbalancer#Tomcat服务器使用的AJP端口worker.worker1.port = 8009#Tomcat服务器的ipworker.worker1.host = localhost#Tomcat服务器与Apache HTTP服务器之间的通信协议worker.worker1.type = ajp13#负载平衡因数(Load Balance Factor)。只有使用了负载平衡器(LoadBalancer)的情况下,才有意义worker.worker1.lbfactor = 100worker.worker2.port = 8109worker.worker2.host = localhostworker.worker2.type = ajp13worker.worker2.lbfactor = 100#负载平衡器worker.loadbalancer.type = lb#可被负载平衡器分配工作的Tomat服务器worker.loadbalancer.balanced_workers = worker1, worker2#是否一个会话始终访问某一个Tomcat。true是,且不会复制会话;false不是,可复制会话worker.loadbalancer.sticky_session = false#把请求转发给集群系统中其他的Tomcat服务器。true不转发,false转发worker.loadbalancer.sticky_session_force = false

4、修改<APACHE_HOME>/conf/httpd.conf,使用负载平衡器进行转发,在尾部加入:

#使用mod_jk.so重定向动态调用Tomcat服务器#加载指定的JK插件LoadModule jk_module modules/mod_jk.so#指定JK的工作文件JkWorkersFile conf/workers.properties#指定JK的日志文件,可以通过这个文件跟踪JK插件的运行过程JkLogFile logs/mod_jk.log#指定JK插件的日志级别JkLogLevel debug#指定JK插件处理的URL映射信息JkMount /postgresql-1128/* loadbalancer

5、分别修改两个Tomcat服务器的conf/server.xml文件,使AJP连接器的端口分别为:8009和8019,确保与worker.properties文件中的配置对应;另外,<Engine>元素的jvmRoute属性与worker的名字一致,分别为:worker1和worker2。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/><Engine defaultHost="localhost" name="Catalina" jvmRoute="worker1">...</Engine>

注:为了能同时启动多个Tomcat服务器,至少修改3个"port"使Tomcat之间端口不重复:
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" ... />
<Connector port="8009" protocol="AJP/1.3" ... />


6、分别启动两个Tomcat服务器和Apache HTTP服务器。访问http://localhost:8088/postgresql-1128/hello/id查看当前session id


二、配置集群管理器

前提:通过访问上面的地址,可以看见session id每次都不一样,因为每次请都由不同的Tomcat服务器响应,而这两个Tomcat服务器之间没有进行会话同步。


为了解决上面的问题,需要配置集群管理器,使得会话同步,步骤如下:
1、分别修改Tomcat1和Tomcat2的conf/server.xml文件,在<Engine>元素内加入<Cluster>子元素,使Tomcat能够启用集群管理器。
对于大多数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"bind="127.0.0.1"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> 

2、分别修改Tomcat1和Tomcat2中Web应用的web.xml文件,加入<distributable />元素:
<distributable />

3、分别启动两个Tomcat服务器和Apache HTTP服务器。


详细内容参考《Tomcat与Java Web开发技术详解(第2版)》的<Tomcat与其他HTTP服务器继承>

注意事项:

(1)存放在会话范围中的所有属性都实现了java.io.Serializable接口。
(2)集群系统中的Tomcat服务器之间通过组播的形式来通信。如果机器有多个网卡或配置了虚拟网卡,可能会组播失败,导致无法正常复制会话。需要设置bind属性:
<Membership className="org.apache.catalina.tribes.membership.McastService"
bind="127.0.0.1" ... />
(3)如果集群系统规模较小, 可以采用DeltaManager会话管理器;如果规模很大,可以使用BackupManager。
(4)<Membership>元素的address属性设置组播地址,本次实验设置为228.0.0.4。仅在计算机连在Internet上才能组播,否则无法访问该组播地址。
(5)workers.properties文件中sticky_session和sticky_session_force属性:
sticky_session:默认值为true,为true表示一个会话始终访问集群系统中的某一个Tomcat服务器,集群系统不会进行会话复制。若希望一个浏览器能与多个Tomcat服务器展开同一个会话,则需要设置为false。
sticky_session_force:sticky_session为false时,sticky_session_force对集群系统没什么影响。通常设置值与sticky_session一致。


0 0