转载:Apache+Tomcat集群配置负载均衡器

主题:Apache+Tomcat集群配置负载均衡器

tomcat是开源servlet\jsp服务器,下载地点http://jakarta.apache.org/;

apache2.0.43是开源的www服务器,下载地点http://www.apache.org/dist/httpd/binaries/;

JavaGroups是一个实现集群服务实体间通信的通信协议,下载地址:http://www.javagroups.com/;

Tomcat会话复制库,基于JavaGroups通信协议,完成集群服务实体间任务执行上下文的复制,下载地址:http://www.filip.net/tomcat/tomcat-javagroups.jar

jk2模块,jk是mod_jserv的替代者,它是Tomcat-Apache插件,处理Tomcat和Apache之间的通信,在集群配置中充当负载均衡器的作用。JK2是符合apache2.x系列的新品,下载地址:http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk2/release/v2.0.2/bin/。

2.2配置负载均衡器

在apache下配置负载均衡器分为三步,注意每次修改httpd.conf和workers2.properties时不要忘了重新启动apache。

第一步,安装和调试apache

负载均衡器jk2模块是apachewww服务的插件,所以配置负载均衡器就得先安装apache。本文下载的是windows版本2.0.43,执行setup.exe并回答一些简单问题就可完成apache的任务。值得注意的是,安装并启动apache后如果apache对http://localhost/地址没反应,你得修改apache安装路径下htdocs目录下的index.html.xx文件,比如把index.html.en改成index.html。

第二步,安装jk2

把下载到的mod_jk2-2.0.43.dll改成mod_jk2.dll放到apache的modules目录下,修改apache的httpd.conf,即在LoadModulefoo_modulemodules/mod_foo.so行下插入mod_jk2模块的装载信息:

#Example:

#LoadModulefoo_modulemodules/mod_foo.so

#

LoadModulejk2_modulemodules/mod_jk2.dll

第三步,配置jk2

jk2的配置全在一个配置文件中,文件名为workers2.properties,和apache的httpd.conf放在同一个目录下。以下是这个文件的内容:

#++++++++++++++++++++++++++++++++++++

#onlyatbeginnin.Inproductionuncommentitout

[logger.apache2]

level=DEBUG

#shm必须配

[shm]

file=D:\ProgramFiles\ApacheGroup\Apache2\logs\shm.file

size=1048576

#第一个tomcat的地址

#Examplesocketchannel,overrideportandhost.

[channel.socket:tomcat1]

port=11009

host=127.0.0.1

#定义第一个工作者指向第一个tomcat

#definetheworker

[ajp13:tomcat1]

channel=channel.socket:tomcat1

#第二个tomcat得地址

#Examplesocketchannel,overrideportandhost.

[channel.socket:tomcat2]

port=12009

host=10.1.36.123

#定义第二个工作者指向第二个tomcat

#definetheworker

[ajp13:tomcat2]

channel=channel.socket:tomcat2

#定义负载均衡器,使其包含两个工作者

[lb:lb1]

worker=ajp13:tomcat2

worker=ajp13:tomcat1

#指定负载均衡器完成单一地址映射,使得apache服务所在的uri全部指向两个tomcat上的root

#Urimapping

[uri:/*]

group=lb:lb1

#++++++++++++++++++++++++++++++++++++++++++

对于jk2模块的负载均衡配置可参见相关站点,值得提及的是jk2的负载均衡还支持权重分配等优秀功能。

2.3配置tomcat

同属于一个集群下的两个服务实体,要求功能的同一性,所以我们可先安装和配置第一个tomcat,接着拷贝形成第二个tomcat,最后配置第二个tomcat。

2.3.1安装第一个tomcat

安装tomcat非常简单,本文就不再描述。我们假设第一个tomcat的安装路径为d:\tomcat1。

拷贝tomcat-javagroups.jar和javagroups.jar到d:\tomcat1\server\lib路径下。

2.3.2配置第一个tomcat

2.3.2.1配置jk2

tomcat中的jk2connector缺省端口为8009,为了在一台机器上运行两个tomcat,修改D:\Tomcat1\conf\jk2.properties,设置jk2connector的端口为11009,整个文件内容如下:

#++++++++++++++

channelSocket.port=11009

#++++++++++++++

2.3.2.2修改server.conf

首先为了让一台机器上运行两个tomcat,修改server.conf的tomcat停止指令监听端口:

<Serverport="8005"shutdown="SHUTDOWN"debug="0">改为

<Serverport="11005"shutdown="SHUTDOWN"debug="0">

然后打开JK2AJPconnector,关闭其它connector,下面是JK2AJP1.3的样子,这里已把它的端口改为11009:

<!--DefineaCoyote/JK2AJP1.3Connectoronport8009-->

<Connectorclassname="org.apache.coyote.tomcat4.CoyoteConnector"

port="11009"minProcessors="5"maxProcessors="75"

enableLookups="true"redirectPort="8443"

acceptCount="10"debug="0"connectionTimeout="20000"

useURIValidationHack="false"

protocolHandlerClassname="org.apache.jk.server.JkCoyoteHandler"/>

接着配置需要集群支持的webapp(比如examples)的context,添加如下manager:

<Manager

classname="org.apache.catalina.session.InMemoryReplicationManager"

protocolStack="UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):PING(timeout=3000;

num_initial_members=6):FD(timeout=5000):VERIFY_SUSPECT(timeout=1500):

pbcast.STABLE(desired_avg_gossip=10000):pbcast.NAKACK(gc_lag=10;

retransmit_timeout=3000):UNICAST(timeout=5000;min_wait_time=2000):

MERGE2:FRAG:pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;

shun=false;print_local_addr=false)">

</Manager>

注意protocolStack的值必须在一行内写完。

2.3.3配置第二个tomcat

我们先把已经配好的第一个tomcat复制一份,形成第二个tomcat,假设路径为d:\tomcat2。

2.3.3.1配置jk2

修改D:\Tomcat2\conf\jk2.properties,设置jk2connector的端口12009,整个文件内容如下:

#++++++++++++++

channelSocket.port=12009

#++++++++++++++

2.3.3.2修改server.conf

有了第一个tomcat的配置我们只需修改server.conf的tomcat停止指令监听端口:

<Serverport="11005"shutdown="SHUTDOWN"debug="0">改为

<Serverport="12005"shutdown="SHUTDOWN"debug="0">

然后设置JK2AJPconnector端口为12009。

2.4运行测试

启动apache,tomcat1和tomcat2。

2.4.1测试负载均衡

我们先准备两个文件,第一个文件为test.jsp,拷贝到第一个tomcat的根web应用的目录即d:\tomcat1\webapps\ROOT下:

<html>

<bodybgcolor="red">

<center>

<%=request.getSession().getId()%>

<h1>Tomcat1</h1>

</body>

</html>

第二个文件也为test.jsp,拷贝到第二个tomcat的根web应用的目录即d:\tomcat2\webapps\ROOT下:

<html>

<bodybgcolor="blue">

<center>

<%=request.getSession().getId()%>

<h1>Tomcat2</h1>

</body>

</html>

从不同的浏览器中多次输入地址http://localhost/test.jsp会看到不同的颜色,这表明apache中的jk2模块起到了负载均衡的作用。

2.4.2测试错误恢复

访问url:http://localhost/examples/servlet/SessionExample可以得到一个关于session的例子,我们用它来测试集群的错误恢复能力。

测试步骤如下:

1.关闭tomcat1和tomcat2;

2.启动tomcat1

3.

4.在浏览器中输入属性名tomcat1和属性值tomcat1再提交,返回的页面显示session中有刚刚输入的tomcat1属性;

5.启动tomcat2;

6.过一会后(等待tomcat2和tomcat1通信并复制信息)关闭tomcat1;

7.在浏览器中输入属性名tomcat2和属性值tomcat2再提交,返回的页面显示session中有刚刚输入的tomcat2属性,还有先前输入的tomcat1属性;

8.启动tomcat1;

9.过一会后(等待tomcat2和tomcat1通信并复制信息)关闭tomcat2;

10.在浏览器中输入属性名tomcat11和属性值tomcat11再提交,返回的页面显示session中有刚刚输入的tomcat11属性,还有先前输入的tomcat1和tomcat2属性;

……

2.4.3测试多目传输的方法

如果运行测试失败,可以使用下面的JAVAGROUP方法测试机器的多目传输性:

启动多目接收器:

javaorg.javagroups.tests.McastReceiverTest-mcast_addr224.10.10.10-port5555

启动多目传输器:

javaorg.javagroups.tests.McastSenderTest-mcast_addr224.10.10.10-port5555

这样你在McastSenderTest窗口中输入内容,应该在McastReceiverWindow中可以看到结果。如果看不到结果,在McastSenderTest运行参数中加入-ttl32,如果还不行,可以修改多目地址再试试(注意避开系统保留用的多目地址);如果还不行,就去问问网管吧!

2.4.4对tomcat-javagroups的修改

tomcat-javagroups.jar中的org.apache.catalina.session.ReplicatedSession类的removeAttribute方法会导致stackoverflow错误,请按下面的代码对其进行修改:

publicvoidremoveAttribute(Stringname,booleannotify,booleanjgnotify){

super.removeAttribute(name);

if(jgnotify)

{

SessionMessagemsg=

newSessionMessage(notify?SessionMessage.

EVT_ATTRIBUTE_REMOVED_WNOTIFY:SessionMessage.

EVT_ATTRIBUTE_REMOVED_WONOTIFY,

null,

getId(),

name,

null,

null);

sendMessage(msg);

}

}

publicvoidremoveAttribute(Stringname,booleannotify){

removeAttribute(name,notify,true);

}

相关推荐