网上这部分的文篇很多,并且我也是看网上的文篇试出来的,不过还是试了好多遍。其实,集群并不难,难的是负载均衡。
首先,我的环境为:
apache_2.2.9-win32-x86-no_ssl-r2.msi,
mod_jk-1.2.26-httpd-2.2.4.so,
jdk1.5.0_07,
apache-tomcat-5.5.26.zip,
jakarta-jmeter-2.3.2.zip
Apache2.2 + Tomcat5.5 集群和负载均衡
网上这部分的文篇很多,并且我也是看网上的文篇试出来的,不过还是试了好多遍。其实,集群并不难,难的是负载均衡。现在还有一些问题,不知道是怎么回事,后面慢慢解决。
首先,我的环境为:
apache_2.2.9-win32-x86-no_ssl-r2.msi,
mod_jk-1.2.26-httpd-2.2.4.so,
jdk1.5.0_07,
apache-tomcat-5.5.26.zip,
jakarta-jmeter-2.3.2.zip
先配置Tomcat的集群:(这部分其实很简单,我在一台机器上做的)
1. 解压Tomcat,再复制1份。 分别叫:tomcat5-clustor1,tomcat5-clustor2
2. 修改tomcat5-clustor2的端口,(因为是在同一台机器上)
修改:
<Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker2″>
修改:(把注示去掉)
<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>
修改tomcat5-clustor1的端口,(因为是在同一台机器上)
打开server.xml文件:
修改:
<Server port=”8006″ shutdown=”SHUTDOWN”>
修改:
<!– Define a non-SSL HTTP/1.1 Connector on port 8080 –>
<Connector port=”8081″ maxHttpHeaderSize=”8192″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptcount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />
修改:
<!– Define an AJP 1.3 Connector on port 8009 –>
<Connector port=”8010″
enableLookups=”false” redirectPort=”8444″ protocol=”AJP/1.3″ />
修改:
<Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker1″>
修改:(把注示去掉)
<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=”4002″
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>
修改比较
tomcat5-clustor1 tomcat5-clustor2
<Server port> 8006
8005
<Connector port>(Http) 8081
8080
<Connector port>(AJP) 8010
8009
<Engine jvmRoute> worker1
worker2
<Receiver tcpListenPort> 4002
4001
3. 完成集群: 重起两个Tomcat,如果不报错,可以正常运行。
4. 写一个JSP小程,测试一下集群。
JSP文件如下:
<%@ page language=”java” %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>Clustor</title>
</head>
<body>
<%
out.println(session.getId());
String name = (String)request.getParameter(“name”);
String tmp = (String)session.getAttribute(“name”);
session.setAttribute(“name”,tmp+” , “+name);
if(name!=null && !name.equalsIgnoreCase(“”)){
out.println(session.getAttribute(“name”));
}
String path = request.getContextPath();
String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
out.println(“<hr/>”+basePath);
%>
<h1>Clustor1</h1>
<form action=”index.jsp” method=”get”>
<input type=”text” name=”name” value=”conan”>
<input type=”submit” value=”Submit”>
</form>
</body>
</html>
创建web.xml文件:
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app version=”2.5″
xsi_schemaLocation=”http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”>
<display-name>clustor</display-name>
<distributable />
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
5. 打包,部署war工程
6. 在浏览器进行测试,同一个浏览打开下面的网页,可以看到,两个不同的tomcat,sessionId是一样,实现集群的功能。
http://localhost:8081/Clustor/index.jsp?name=conan1
http://localhost:8080/Clustor/index.jsp?name=conan2
7. Tomcat自带的负载平衡(转发功能,非标准的负载平衡)
Tomcat的发行包,自带了一个balancer工程,在tomcat5-clustor1webappsbalancer目录下面。
我们可以在balancer工程的balancerWEB-INFconfigrules.xml中,配置转发功能。
<?xml version=”1.0″ encoding=”UTF-8″?>
<rules>
<!– If the URL contains News (case-sensitive), go to CNN.com –>
<rule className=”org.apache.webapp.balancer.rules.URLStringMatchrule”
targetString=”News”
redirectUrl=”http://www.cnn.com” />
<!– If the request contains a parameter named paramName whose value
is paramValue, go to Yahoo.com. –>
<rule className=”org.apache.webapp.balancer.rules.RequestParameterRule”
paramName=”paramName”
paramValue=”paramValue”
redirectUrl=”http://www.yahoo.com” />
<!– Redirect all requests to jakarta.apache.org. –>
<rule className=”org.apache.webapp.balancer.rules.AcceptEverythingRule”
redirectUrl=”http://jakarta.apache.org” />
</rules>
修改上面的文件为:
<?xml version=”1.0″ encoding=”UTF-8″?>
<rules>
<!– If the URL contains News (case-sensitive), go to CNN.com –>
<rule className=”org.apache.webapp.balancer.rules.URLStringMatchrule”
targetString=”clustor1″
redirectUrl=”http://localhost:8080/Clustor/index.jsp” />
<!– If the request contains a parameter named paramName whose value
is paramValue, go to Yahoo.com. –>
<rule className=”org.apache.webapp.balancer.rules.RequestParameterRule”
paramName=”clustor”
paramValue=”2″
redirectUrl=”http://localhost:8081/Clustor/index.jsp” />
<!– Redirect all requests to jakarta.apache.org. –>
<rule className=”org.apache.webapp.balancer.rules.AcceptEverythingRule”
redirectUrl=”http://localhost:8081/Clustor/index.jsp />
</rules>
8. 测试一下:
浏览器输入:
http://localhost:8080/balancer/clustor1 转向到 http://localhost:8080/Clustor/index.jsp
浏览器输入:
http://localhost:8080/balancer/abc?clustor=2 转向到 http://localhost:8081/Clustor/index.jsp
9. Tomcat的balancer工程测试完成。
10. 通过apache 的 mod_jk 进行对Tomcat的负载均衡。
11. 安装好Apache服务器,复制mod_jk到Apache2.2manual的目录下面。
12. 修改httpd.conf文件,在Apache2.2conf的目录下面。
打开httpd.conf文件,# Example:下面,增加下面内容
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule jk_module modules/mod_jk.so
# Put this in the main section of your configuration (or desired virtual host, if using Apache virtual hosts)
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /* router
13. 保存文件。
14. 新增workers.properties文件,在Apache2.2conf的目录下面。
worker.list=router
# Define a “local_worker” worker using ajp13
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker1.local_worker=1
# Define another “local_worker” worker using ajp13
worker.worker2.port=8010
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=0
worker.worker2.local_worker=2
# Define the LB worker
worker.router.type=lb
worker.router.balanced_workers=worker1,worker2
# worker.router.local_worker_only=1
14. 保存文件
15. 重起Apache服务器,没有报错,说明一切正常。
16. 访问http://localhost/Clustor/index.jsp的地址, apache服务器,会显示刚才的JSP文件的内容。这是因为,Apache和Tomcat做了转发。
17. 修改刚才的JSP文件,测试一下。
在index.jsp中,增加 System.out.println(new Date().toLocaleString()+” : “+basePath);的输出语句,就会把日志打到Tomcat的命令行。
我们访问http://localhost/Clustor/index.jsp的地址,会看到,输出在两个服务器之间转换。
这样子,我们就完成了,一个简单的Apache+Tomcat的集群,和负载平衡的实例。
18. 为了让效果明显一些,我用了JMeter,进行压力测试,让他不停的访问http://localhost/Clustor/index.jsp地址10000次,你会看到两个Tomcat的输出。
配置好以后,“启动”。 查看两个tomcat的命令日志,你会发现你的集群和负载平衡配置成功。
原文出处:http://gocom.primeton.com/blog10777_14478.htm
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国