tomcat 集群 二 集群搭建 负载均衡
二、tomcat 集群
2.1简介
如果网站的访问量特别大,为了提高访问速度,可以将多个tomcat服务器与apache 集成,让他们共同分担servlet/jsp组件任务,从而构成一个tomcat 集群,有点:高可靠性,一个服务器故障,其他的不受影响,高性能计算,负载平衡。
本文以同一台机器两个tomcat的集成为例。
2.2 原理
1.客户端访问apache,jk 插件的loadbalancer 负责调度tomcat。
2.Tomcat上的集群管理器simpletcpcluster 负责tomcat 之间的通信
2.3 准备
下载apache httpd-2.0.65-win32-x86-no_ssl.msi
Tomcat apache-tomcat-6.0.39.zip 两份
JK 插件 tomcat-connectors-1.2.40-windows-i386-httpd-2.0.x.zip
2.4 配置
1.安装apache
2.解压两份tomcat,一个是tomcat1 另外一个是tomcat2
3.修改tomcat2 的conf/server.xml 文件3处。(如果不是同一台机器不用修改)
<Server port="8105" shutdown="SHUTDOWN">
<Connector port="8180" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
4.Copy mod_jk.so 到 apache 的modules目录
2.5 配置集群的负载平衡器
在apache conf 目录下创建workers.properties 文件,内容如下
worker.list=worker1,worker2,loadbalancer
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=100
worker.worker2.port=8109
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=100
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=worker1,worker2
worker.loadbalancer.sticky_session=false
worker.loadbalancer.sticky_session_force=false
其中
worker.loadbalancer.sticky_session=false
worker.loadbalancer.sticky_session_force=false
表示同一个客户端是否一直访问同一个tomcat,false 表示不同时访问同一个tomcat
2.6 修改tomcat 的 httpd.conf 文件
设定jk 相关的参数
末尾添加
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /*.jsp loadbalancer
所有的jsp 都走loadbalancer,然后调度具体访问哪一个tomcat服务器。
2.7 指定tomcat 的jvmRoute属性值
Jk workers属性文件 的 loadbalancer 指定某个请求具体走哪一个worker,所以woker 也要与tomcat 进行映射,修改tomcat server.xml 的engine 元素
Tomcat 1 :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
Tomcat 2:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">
2.8 测试
修改tomcat 目录webapps 下的root 目录下的index.jsp 文件
在body 标签下面添加
Tomcat 1:
<h1>tomcat1</h1>
Sessionid : <%=session.getId() %>
去掉 <%@ page session="false" %>
Tomcat 2:
<h2>tomcat1</h2>
Sessionid : <%=session.getId() %>
去掉 <%@ page session="false" %>
重启两个tomcat 和 apache ,同一个浏览器访问http://localhost/index.jsp
会在访问页面轮流显示tomcat1 和 tomcat 2 的字样
2.9 问题
同一个浏览器下访问tomcat 返回的sessionid 的值是不相同的,如何修改成相同的。使用集群管理器进行同步复制
2.10 启用集群管理器 simpleTcpCluster
修改tomcat1 和 tomcat 2 的server.xml 文件,在Engine 元素下面添加Cluster 元素。
<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>
2.11 修改web.xml
在 <web-app> 标签下添加 <distributable /> 告知tomcat 服务器在启动的时候创建cluster 的 manager 子元素
2.12 测试
重启tomcat 和 apache,访问http://localhost/index.jsp 两次返回的session id 就是一致的了。
2.13 其他功能
2.13.1 关闭tomcat 的http 请求链接
Tomcat 与 其他的 http 服务器集成时,tomcat 主要负责处理http 服务器转发过来的客户请求,通常不直接接受http 请求,为了提高tomcat 的性能,可以关闭http 连接器,注释
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2.13.2 回话内的所有属性都要实现 java.io.Serializable 接口
2.13.3 设置组播绑定地址
启动tomcat 1 正常,启动tomcat 2 报 skipping state transfer. No members active in cluster group 说名tomcat 2 没有识别到tomcat 1 ,需要修改membership 节点添加 bind 属性,127.0.0.1
2.13.4 组播地址
membership address 属性表示组播地址,设置为228.0.0.4 必修要保证tomcat 所在的机器能连网
2.13.5 大规模集群设置
修改DeltaManager 管理器为 BackupManager 管理器
- 点赞
- 收藏
- 关注作者
评论(0)