集群背景介绍
1.1 术语定义
服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。
服务硬体指提供计算服务的硬件、比如pc机、pc服务器。
服务实体通指服务软体和服务硬体。
客户端指接受服务实体服务的软件或硬件。
1.2 两大关键特性
集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是一个服务实体,但事实上集群由一组服务实体组成。与单一服务实体相比较,集群提供了以下两个关键特性:
1.3 两大能力
为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:
负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的。
1.4 两大技术
实现集群务必要有以下两大技术:
具有同一个集群地址使得客户端能访问集群提供的计算服务,一个集群地址下隐藏了各个服务实体的内部地址,使得客户要求的计算服务能在各个服务实体之间分布。内部通信是集群能正常运转的基础,它使得集群具有均衡负载和错误恢复的能力。
集群配置
从上图可知,由服务实体1、服务实体2和负载均衡器组成了一个集群。服务实体1和服务实体2参与对客户端的服务支持工作,均衡负载器为客户端维护集群的单一影像。集群实体间通过内部的通信网交流信息,这种交流机制一般采用组播协议。负载均衡器通过内部通信网探测各服务实体的心跳信息,服务实体间通过内部通信网完成任务资源的传播。可以看出,配置集群主要由配置服务实体和配置负载均衡器两部分组成。本文使用tomcat 5.5.20、apache 2.2.11配置集群环境。
2.1 准备软件
2.2 配置负载均衡器
在apache下配置负载均衡器分为三步,注意每次修改httpd.conf和workers.properties时不要忘了重新启动apache。
# Load mod_jk2 module LoadModule jk_module modules/mod_jk2.so # Where to find workers.properties JkWorkersFile conf/workers.properties # Where to put jk logs JkLogFile logs/mod_jk2.log # Set the jk log level [debug/error/info] JkLogLevel info # Select the log format JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " # JkOptions indicate to send SSL KEY SIZE, JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories # JkRequestLogFormat set the request format JkRequestLogFormat "%w %V %T" # Send JSPs for context / to worker named loadBalancer JkMount /*.jsp loadBalancer
# # workers.properties # # list the workers by name worker.list=tomcat1, tomcat2, loadBalancer # ------------------------ # First tomcat server # ------------------------ worker.tomcat1.port=8009 worker.tomcat1.host=192.168.0.107 worker.tomcat1.type=ajp13 # Specify the size of the open connection cache. #worker.tomcat1.cachesize # # Specifies the load balance factor when used with # a load balancing worker. # Note: # ----> lbfactor must be > 0 # ----> Low lbfactor means less work done by the worker. worker.tomcat1.lbfactor=100 # ------------------------ # Second tomcat server # ------------------------ worker.tomcat2.port=8009 worker.tomcat2.host=192.168.0.163 worker.tomcat2.type=ajp13 # Specify the size of the open connection cache. #worker.tomcat2.cachesize # # Specifies the load balance factor when used with # a load balancing worker. # Note: # ----> lbfactor must be > 0 # ----> Low lbfactor means less work done by the worker. worker.tomcat2.lbfactor=100 # ------------------------ # Load Balancer worker # ------------------------ # # The loadbalancer (type lb) worker performs weighted round-robin # load balancing with sticky sessions. # Note: # ----> If a worker dies, the load balancer will check its state # once in a while. Until then all work is redirected to peer # worker. worker.loadBalancer.type=lb worker.loadBalancer.balanced_workers=tomcat1, tomcat2 # # END workers.properties #
测试:
在跑tomcat1实例的机器的 webapps/testGroup 测试项目目录生成如下内容的index.jsp文件:(设置session)
<% System.out.println("==========================="); System.out.println(session.getAttribute("test")); session.setAttribute("test","Session"); %> <html> <body bgcolor="red"> <center> <h1>Tomcat 1</h1> </body> </html>
同理,在跑tomcat2实例的机器的 webapps/testGroup 测试项目目录生成如下内容的index.jsp文件:
<% System.out.println("==========================="); System.out.println(session.getAttribute("test")); %> <html> <body bgcolor="blue"> <center> <h1>Tomcat 2</h1> </body> </html>
启动Tomcat1, Tomcat2 和Apache服务
Apache服务器ip:192.168.0.105
Tomcat1服务器ip:192.168.0.107
Tomcat2服务器ip:192.168.0.163
首先验证Apache服务器的静态页面是否正常,访问:http://192.168.0.105/(若局域网内不能访问请检查防火墙设置)
验证tomcat和apache配置提供负载均衡,用不同的终端访问:http://192.168.0.105/testGroup/index.jsp
如果你看到红色的页面,表示为tomcat1 服务器返回的,
如果你看到兰色的页面,表示为tomcat2 服务器返回的。
2.3 配置tomcat(绑定session)
同属于一个集群下的两个服务实体,要求功能的同一性,所以我们可先安装和配置第一个tomcat,接着拷贝形成第二个tomcat,最后配置第二个tomcat。
2.3.1修改tomcat1, tomcat2的server.xml
2.3.1.1 修改 <Engine /> 标签
在跑第一个tomcat实例的机器上,在大约第120行(去掉注释), 将
<Engine name="Standalone" defaultHost="localhost" debug="0">
替换为:
<Engine jvmRoute="tomcat1" name="Standalone" defaultHost="192.168.0.105" debug="0" />
对跑第二个tomcat实例的机器上,替换为 jvmRoute="tomcat2".
<!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine jvmRoute="tomcat2" name="Standalone" defaultHost="192.168.0.105" debug="0" />
有的文档写得是在配置中加入一行<Engine jvmRoute="tomcat1" name="Standalone" defaultHost="localhost" debug="0"></Engine>,其实是不对的,这样负载均衡是没有问题的,但是不能做session绑定,也就是说同一用户会在两台服务器上跳来跳去。这是由于jvmRoute不正确引起的,因为如果只是加入一行的话,是没有什么作用的,Engine仍然是原来的 Engine,而原来的Engine中jvmRoute是不正确的,所以一定要替换。而且这个jvmRoute一定要跟 workers.properties 中的名称完全匹配,否则也不能实现session绑定.
2.3.1.2 修改 <Cluster /> 标签
将<Cluster />标签注释去掉,代码如下:
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" managerClassName="org.apache.catalina.cluster.session.DeltaManager" expireSessionsOnShutdown="false" useDirtyFlag="true" notifyListenersOnReplication="true"> <Membership className="org.apache.catalina.cluster.mcast.McastService" mcastAddr="228.0.0.4" mcastPort="45564" mcastFrequency="500" mcastDropTime="3000"/> <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="auto" tcpListenPort="4001" tcpSelectorTimeout="100" tcpThreadCount="6"/> <Sender className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" replicationMode="pooled" ackTimeout="15000" waitForAck="true"/> <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/> </Cluster>
2.3.2修改testGroup测试项目中的web.xml
在web.xml加入 <distributable/> 即可
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>TomcatDemo</display-name> <distributable/> </web-app>
重启apache,tomcat1,tomcat2
用不同的终端访问:http://192.168.0.105/testGroup/index.jsp
可以看到Tomcat终端不再打印null,一方设置session双方都打印出session,实现session共享
注:本文使用本机+2台虚拟机共3台电脑完成集群配置,若只需一台电脑完成集群配置,则只需要更改多个Tomcat中相冲突的端口号即可完成。
End...