配置Tomcat的集群系统

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


背景: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服务器的ip
worker.worker1.host = localhost
#Tomcat服务器与Apache HTTP服务器之间的通信协议
worker.worker1.type = ajp13
#负载平衡因数(Load Balance Factor)。只有使用了负载平衡器(LoadBalancer)的情况下,才有意义
worker.worker1.lbfactor = 100

worker.worker2.port = 8109
worker.worker2.host = localhost
worker.worker2.type = ajp13
worker.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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值