Apache Tomcat负载均衡及Session绑定的实现分析.docx
- 文档编号:10514917
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:18
- 大小:22.42KB
Apache Tomcat负载均衡及Session绑定的实现分析.docx
《Apache Tomcat负载均衡及Session绑定的实现分析.docx》由会员分享,可在线阅读,更多相关《Apache Tomcat负载均衡及Session绑定的实现分析.docx(18页珍藏版)》请在冰点文库上搜索。
ApacheTomcat负载均衡及Session绑定的实现分析
Apache+Tomcat负载均衡及Session绑定的实现
集群背景介绍
1.1术语定义
服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。
服务硬体指提供计算服务的硬件、比如pc机、pc服务器。
服务实体通指服务软体和服务硬体。
客户端指接受服务实体服务的软件或硬件。
1.2两大关键特性
集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。
在客户端看来,一个集群就象是一个服务实体,但事实上集群由一组服务实体组成。
与单一服务实体相比较,集群提供了以下两个关键特性:
∙可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能。
∙高可用性--集群通过服务实体冗余使客户端免于轻易遇到outofservice的警告。
在集群中,同样的服务可以由多个服务实体提供。
如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。
集群提供的从一个出错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。
1.3两大能力
为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:
∙负载均衡--负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。
∙错误恢复--由于某种原因,执行某个任务的资源出现故障,另一服务实体中执行同一任务的资源接着完成任务。
这种由于一个实体中的资源不能工作,另一个实体中的资源透明的继续完成任务的过程叫错误恢复。
负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的。
1.4两大技术
实现集群务必要有以下两大技术:
∙集群地址--集群由多个服务实体组成,集群客户端通过访问集群的集群地址获取集群内部各服务实体的功能。
具有单一集群地址(也叫单一影像)是集群的一个基本特征。
维护集群地址的设置被称为负载均衡器。
负载均衡器内部负责管理各个服务实体的加入和退出,外部负责集群地址向内部服务实体地址的转换。
有的负载均衡器实现真正的负载均衡算法,有的只支持任务的转换。
只实现任务转换的负载均衡器适用于支持ACTIVE-STANDBY的集群环境,在那里,集群中只有一个服务实体工作,当正在工作的服务实体发生故障时,负载均衡器把后来的任务转向另外一个服务实体。
∙内部通信--为了能协同工作、实现负载均衡和错误恢复,集群各实体间必须时常通信,比如负载均衡器对服务实体心跳测试信息、服务实体间任务执行上下文信息的通信。
具有同一个集群地址使得客户端能访问集群提供的计算服务,一个集群地址下隐藏了各个服务实体的内部地址,使得客户要求的计算服务能在各个服务实体之间分布。
内部通信是集群能正常运转的基础,它使得集群具有均衡负载和错误恢复的能力。
集群配置
从上图可知,由服务实体1、服务实体2和负载均衡器组成了一个集群。
服务实体1和服务实体2参与对客户端的服务支持工作,均衡负载器为客户端维护集群的单一影像。
集群实体间通过内部的通信网交流信息,这种交流机制一般采用组播协议。
负载均衡器通过内部通信网探测各服务实体的心跳信息,服务实体间通过内部通信网完成任务资源的传播。
可以看出,配置集群主要由配置服务实体和配置负载均衡器两部分组成。
本文使用tomcat5.5.20、apache2.2.11配置集群环境。
2.1准备软件
∙tomcat是开源服务器,下载地点http:
//tomcat.apache.org/download-55.cgi;(本文使用的apache-tomcat-5.5.20.zip)
∙apache是开源的www服务器,下载地点http:
//httpd.apache.org/download.cgi;(本文使用的apache_2.2.11-win32-x86-no_ssl.msi)
∙jk2模块,jk是mod_jserv的替代者,它是Tomcat-Apache插件,处理Tomcat和Apache之间的通信,在集群配置中充当负载均衡器的作用。
JK2是符合apache2.x系列的新品,下载地址http:
//apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.28/。
(本文使用的mod_jk-1.2.28-httpd-2.2.3.so)
2.2配置负载均衡器在apache下配置负载均衡器分为三步,注意每次修改httpd.conf和workers.properties时不要忘了重新启动apache。
∙第一步,安装和调试apache
负载均衡器jk2模块是apachewww服务的插件,所以配置负载均衡器就得先安装apache。
本文下载的是windows版本2.2.11,执行msi并回答一些简单问题就可完成apache的任务。
值得注意的是,安装并启动apache后如果apache对http:
//localhost/地址没反应,你得修改apache安装路径下htdocs目录下的index.html.xx文件,比如把index.html.en改成index.html。
∙第二步,安装jk2
把下载的mod_jk-1.2.28-httpd-2.2.3.so改名为mod_jk2.so放到apache的modules目录下,修改apache的conf目录下的httpd.conf,在文件最后加入一行includeconf\mod_jk2.conf,在conf目录下创建mod_jk2.conf文件,内容如下:
Conf代码
1#Loadmod_jk2module
1LoadModulejk_modulemodules/mod_jk2.so
1
1
1#Wheretofindworkers.properties
1JkWorkersFileconf/workers.properties
1
1
1#Wheretoputjklogs
1JkLogFilelogs/mod_jk2.log
1
1
1#Setthejkloglevel[debug/error/info]
1JkLogLevelinfo
1
1
1#Selectthelogformat
1JkLogStampFormat"[%a%b%d%H:
%M:
%S%Y]"
1
1
1#JkOptionsindicatetosendSSLKEYSIZE,
1JkOptions+ForwardKeySize+ForwardURICompat-ForwardDirectories
1
1
1#JkRequestLogFormatsettherequestformat
1JkRequestLogFormat"%w%V%T"
1
1#SendJSPsforcontext/toworkernamedloadBalancer
1JkMount/*.jsploadBalancer
#Loadmod_jk2module
LoadModulejk_modulemodules/mod_jk2.so
#Wheretofindworkers.properties
JkWorkersFileconf/workers.properties
#Wheretoputjklogs
JkLogFilelogs/mod_jk2.log
#Setthejkloglevel[debug/error/info]
JkLogLevelinfo
#Selectthelogformat
JkLogStampFormat"[%a%b%d%H:
%M:
%S%Y]"
#JkOptionsindicatetosendSSLKEYSIZE,
JkOptions+ForwardKeySize+ForwardURICompat-ForwardDirectories
#JkRequestLogFormatsettherequestformat
JkRequestLogFormat"%w%V%T"
#SendJSPsforcontext/toworkernamedloadBalancer
JkMount/*.jsploadBalancer
∙第三步,配置jk2
jk2的配置全在一个配置文件中,文件名为workers.properties,和apache的httpd.conf放在同一个目录下。
以下是这个文件的内容:
Properties代码
1#
1#workers.properties
1#
1
1#listtheworkersbyname
1
1worker.list=tomcat1,tomcat2,loadBalancer
1
1#------------------------
1#Firsttomcatserver
1#------------------------
1worker.tomcat1.port=8009
1worker.tomcat1.host=192.168.0.107
1worker.tomcat1.type=ajp13
1
1#Specifythesizeoftheopenconnectioncache.
1#worker.tomcat1.cachesize
1
1#
1#Specifiestheloadbalancefactorwhenusedwith
1#aloadbalancingworker.
1#Note:
1#---->lbfactormustbe>0
1#---->Lowlbfactormeanslessworkdonebytheworker.
1worker.tomcat1.lbfactor=100
1
1
1#------------------------
1#Secondtomcatserver
1#------------------------
1worker.tomcat2.port=8009
1worker.tomcat2.host=192.168.0.163
1worker.tomcat2.type=ajp13
1
1#Specifythesizeoftheopenconnectioncache.
1#worker.tomcat2.cachesize
1
1#
1#Specifiestheloadbalancefactorwhenusedwith
1#aloadbalancingworker.
1#Note:
1#---->lbfactormustbe>0
1#---->Lowlbfactormeanslessworkdonebytheworker.
1worker.tomcat2.lbfactor=100
1
1
1#------------------------
1#LoadBalancerworker
1#------------------------
1
1#
1#Theloadbalancer(typelb)workerperformsweightedround-robin
1#loadbalancingwithstickysessions.
1#Note:
1#---->Ifaworkerdies,theloadbalancerwillcheckitsstate
1#onceinawhile.Untilthenallworkisredirectedtopeer
1#worker.
1worker.loadBalancer.type=lb
1worker.loadBalancer.balanced_workers=tomcat1,tomcat2
1
1#
1#ENDworkers.properties
1#
#
#workers.properties
#
#listtheworkersbyname
worker.list=tomcat1,tomcat2,loadBalancer
#------------------------
#Firsttomcatserver
#------------------------
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.0.107
worker.tomcat1.type=ajp13
#Specifythesizeoftheopenconnectioncache.
#worker.tomcat1.cachesize
#
#Specifiestheloadbalancefactorwhenusedwith
#aloadbalancingworker.
#Note:
#---->lbfactormustbe>0
#---->Lowlbfactormeanslessworkdonebytheworker.
worker.tomcat1.lbfactor=100
#------------------------
#Secondtomcatserver
#------------------------
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.0.163
worker.tomcat2.type=ajp13
#Specifythesizeoftheopenconnectioncache.
#worker.tomcat2.cachesize
#
#Specifiestheloadbalancefactorwhenusedwith
#aloadbalancingworker.
#Note:
#---->lbfactormustbe>0
#---->Lowlbfactormeanslessworkdonebytheworker.
worker.tomcat2.lbfactor=100
#------------------------
#LoadBalancerworker
#------------------------
#
#Theloadbalancer(typelb)workerperformsweightedround-robin
#loadbalancingwithstickysessions.
#Note:
#---->Ifaworkerdies,theloadbalancerwillcheckitsstate
#onceinawhile.Untilthenallworkisredirectedtopeer
#worker.
worker.loadBalancer.type=lb
worker.loadBalancer.balanced_workers=tomcat1,tomcat2
#
#ENDworkers.properties
#
∙
对于jk2模块的负载均衡配置可参见相关站点,值得提的是jk2的负载均衡还支持权重分配等优秀功能。
测试:
在跑tomcat1实例的机器的webapps/testGroup测试项目目录生成如下内容的index.jsp文件:
(设置session)
Jsp代码
2<%
3System.out.println("===========================");
4System.out.println(session.getAttribute("test"));
5session.setAttribute("test","Session");
6%>
7
8
9
10
11
Tomcat1
12
13