apache tomcat负载均衡实验记录

转载自http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310498c374307d73d66d5d0157bc3933fc8220c0a1071e3cc767f4f19839b21321cac4a59edf7327123467df7cdc7db088eeac87f388957230016913161c46fa9dc302fd620e14d99de0e90cbe74293b9a5d3c85523dd23736df7f39c2a0703bd6e&p=9d39c54ad6c54af74babc02d02149e&newp=8b2a975f828410f908e294780607cd231610db2151ddd7146580d419c5&user=baidu&fm=sc&query=apache%B8%BA%D4%D8+%BC%EC%B2%E2%BD%E1%B5%E3&qid=99224df100019628&p1=1


原理:tomcat�0�2做个WEB服务器有它的局限性,处理能力低,效率低。承受并发小(1000左右)。但目前有不少网站或者页面是JSP的。并采用了tomcat做为WEB,因此只能在此基础上调优。
目前采取的办法是 Apache + Mod_JK + tomcat�0�2来解决一部分请求,用户访问的是 apache,但有jsp页面的时候才会去请求tomcat。如果量一大,那么tomcat无法承受,那么只能做tomat集群, Apache + Mod_JK�0�2就是 负载均衡器了。
Mod_JK2 负载均衡�0�2可以把不同的jsp请求转发到不同的tomcat服务器,还可以侦测服务器存活。如果有条件可以给Mod_JK2做一个HA因为做完集群后压力就在JK上了。
apache tomcat负载均衡实验记录_第1张图片

准备工作

Tomcat7�0�2http://tomcat.apache.org/download-70.cgi

apache httpd server 2.2:�0�2http://httpd.apache.org/download.cgi

apache tomcat connector:�0�2http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/

�0�2

相关文档:

web server how to:

http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

�0�2

安装路径:

httpd: �0�2 �0�2 �0�2 �0�2 �0�2 �0�2 D:\Server\Apache httpd2_2

tomcat D:\Server\tomcat7-1 tomcat7-2 tomcat7-3

JK �0�2D:\Server\Apache httpd2_2\modules\mod_jk-1.2.31-httpd-2.2.3.so

�0�2

step 1: 添加并配置JK

D:\Server\Apache httpd2_2\conf\httpd.conf文件最后加上,意思是把这个配置加载进来

�0�2

include conf\mod_jk.conf

�0�2

新建mod_jk.conf文件,内容如下:

�0�2

LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.soJkWorkersFile conf/workers.properties#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名JkMount /*.jsp controller
�0�2

�0�2

Step 2: 配置worker

新建并编辑workers.properties文件,内容如下

�0�2

#serverworker.list = controller#========tomcat1========worker.tomcat1.port=11009worker.tomcat1.host=localhostworker.tomcat1.type=ajp13worker.tomcat1.lbfactor = 1#========tomcat2========worker.tomcat2.port=12009worker.tomcat2.host=localhostworker.tomcat2.type=ajp13worker.tomcat2.lbfactor = 1#========tomcat3========worker.tomcat3.port=13009worker.tomcat3.host=192.168.0.80 //在我的虚拟机中的,可以算远程的吧worker.tomcat3.type=ajp13worker.tomcat3.lbfactor = 1 #========controller,负载均衡控制器========worker.controller.type=lbworker.controller.balanced_workers=tomcat1,tomcat2,tomcat3worker.controller.sticky_session=falseworker.controller.sticky_session_force=1#worker.controller.sticky_session=1

�0�2

如果三个tomcat不在同一台机器上,那么下面改端口的事情就可以省很多力气,不过因为要单机做负载均衡,所以要更改三个tomcat的8005,8080的端口,确保都不一样,不然tomcat是没办法同时启动三个的。

�0�2

测试的时候我三个tomcat都放在本地,因为要同时启动三个tomcat,所以需要更改三个tomcat中的Connector端口号,将三个tomcat的的protocol="HTTP/1.1" 的connector的port改为10080,11080,12080。(原来是8080)

�0�2

同时讲原来8005的端口分别改成10005,11005,12005(这个是关闭tomcat的端口号)

�0�2

tomcat7-1

�0�2

�0�2

    
�0�2

�0�2

tomcat7-2

�0�2

    
�0�2

�0�2

tomcat7-3

�0�2

    
�0�2

除了更改server.xml中 原来的8080的端口(protocol="HTTP/1.1" 的端口号)

还需要配置AJP13的端口号,同时打开默认注释掉的标签,对应的的jvmRoute改成workers.property里面对应的名字,配置如下(删除了注释)

tomcat7-1

�0�2

          
�0�2

tomcat7-2

�0�2

          
�0�2

�0�2

tomcat7-3

�0�2

          
�0�2

�0�2

OK,这时候可以成功启动三个tomcat7了,当tomcat7-2启动后,tomcat7-1会打印出replication的信息

类似于

�0�2

2011-9-20 14:12:18 org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded信息: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{172, 16, 10, 96}:4001,{172, 16, 10, 96},4001, alive=1000, securePort=-1, UDP Port=-1, id={109 112 -14 -8 -44 98 79 85 -89 -48 -33 -127 -47 -3026 -75 }, payload={}, command={}, domain={}, ]
�0�2

�0�2

�0�2

�0�2

Step3: 建立测试项目
在项目的web.xml中添加
testlb.jsp:
<%@ page contentType="text/html; charset=GBK"%><%@ page import="java.util.*"%>			Cluster App Test				Server Info:		<%		out.println(request.getLocalAddr() + " : " + request.getLocalPort() + "
"); %> <% out.println("
ID " + session.getId() + "
"); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.println("Session 列表
"); System.out.println("============================"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String) e.nextElement(); String value = session.getAttribute(name).toString(); out.println(name + " = " + value + "
"); System.out.println(name + " = " + value); } %>
名称:
值:
apache tomcat负载均衡实验记录_第2张图片

apache tomcat负载均衡实验记录_第3张图片

apache tomcat负载均衡实验记录_第4张图片

(以下为原文摘抄,我真的比较lazy)

�0�2

以上的测试说明,集群中的session已经共享,每个集群对于同一访问均有相同的session,而且session中存储的变量也复制了。

�0�2

节点插拔测试

插拔意思是应该保证当运行的集群中某节点中关闭或者启动时,集群正常工作并且节点能够正常工作。

下面描述测试过程了,贴图太占地方了。

关闭Tomcat2,刷新页面,则不断访问Tocmat1和Tomcat3,再关闭Tomcat1后,则只访问一个Tomcat3,说明节点关闭时运行正常。

如果重启Tomcat2,无论怎么刷新,始终访问Tomcat3,难道Apache不能将请求转发给中途启动的Tomcat2?。。。这时利用另外台机器访问页面,发现Tomcat2正常,然后在刷本地页面,又可以访问Tomcat2了。

从上面可以看出Apache负载均衡时的算法了,对于每个新来的session,Apache按照节点配置中的lbfactor比重选择访问节点,如果某节点node1不能访问,则寻找下一可访问节点,并且将此node1就在该访问session的访问黑名单中,以后该session的访问直接不考虑node1,即使node1又可以访问了。而新来的session是无黑名单的,如果新的session能够访问到node1了,则会将node1在其他所有session访问的黑名单删除,这样其他session就又能访问node1节点了。以上只是个人经过测试后的猜想。

经过以上测试,说明Tomcat集群和负载均衡已经实现了。

�0�2

关于集群我还有些疑问,所以又测试了下,直接把结论写出来:

1.集群下的相同的应用可以名称不同(好像没必要啊),只要配置server.xml中host下的context具有相同的path即可。

2.�0�2如果应用名称可以不同,那么应用下内容是否可以不同呢(这里考虑将不同应用通过集群看起来是一个应用,并且共享session),然后集群下不同应用映射为相同的访问path,具有相同的路径则负载,如果某路径只某个应用具有,则一直访问该应用。可现实很骨干啊,答案是否定的,至少我以上的配置不能实现。如果访问只有某应用具有的特别路径,那么只有负载到该应用才可以访问,否则直接路径未找到的错误页面了。

�0�2

�0�2

�0�2如果您看过网上其他Apache+Tomcat的集群配置,您可能有的疑问?

1.网上大部分的文章配置2个tocmat的集群,有的将workers.properties下的worker.controller.sticky_session=1,
然后tomcat1中的server.xml中的jvmRoute设置为tomcat2,将tomcat2中的jvmRoute设置为tocmat1,当然我这样设置
也成功了,但是如果3个或者更多tocmat呢,怎么设置每个tomcat的jvmRoute,我不会所以才考虑现在的配置

2.server.xml中的Cluster配置问题,网上大部分都是使用BackupManager方式,即Cluster下又粘贴了一堆配置。其实
只要将其中注释掉的去掉注释就完成session的集群
复制了。只是这俩种复制采用的方式不同而已。http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html,
这页面已经说的挺清楚了,集群的session复制默认是DeltaManager,是all to all的复制,意思是将集群下1个tomcat应用下的session
对所有的集群中的节点进行复制,即使那个节点没有发布应用。显然是不好的方式,但这在小规模的集群下并没神马问题。
而采用BackupManager,就是众多网上配置那样,对于需要复制的节点设置BackupManager自然也没问题,
但是它的性能并没有DeltaManager 好使“ Downside of the BackupManager: not quite as battle tested as the delta manager”。
因此,具体怎么设置就看大家了,通常说如果不是大规模集群,就默认就好了。反正我自己翻译的就是这个意思了,希望没有误导大家。

�0�2

最后一个比较全的关于session 同步使用jdbc方式的帖子

http://www.datadisk.co.uk/html_docs/java_app/tomcat6/tomcat6_clustering.htm



你可能感兴趣的:(负载均衡)