一:基本概念 http://webdev.csdn.net/page/9fa31cf2-4f5d-4b59-a51c-d135883d1dbb
http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=LoadBalancingTomcatApache
1.1 集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。
2. 负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机。如一个提供Web服务的集群,对外界来看是一个大Web服务器。不过集群的节点也可以单独提供服务。
二: 实际操作步骤
2.1 软件环境
jdk: 1.4.2_17 tomcat: 5.0.28 apache: 2.0.47 mod_jk: 1.2.27 windowXp
2.2 同时启动两个tomcat
2.2.1 按照默认设置安装两个tomcat1,tomcat2于两个不同目录 (推荐两个tomcat的folder名包括tomcat的访问端口,如5.0.8082)
2.2.2 修改三个设置端口的地方 (防止各个tomcat所占用的端口产生冲突)
2.2.2.1 <Server port="8005" shutdown="SHUTDOWN" debug="0"> ---------〉 <Server port="8007" shutdown="SHUTDOWN" debug="0">
2.2.2.2 <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" /> -------------------〉
<Connector port="8083" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
2.2.2.3 <Connector port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />
-------------〉 <Connector port="8011" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />
三: 配置apache加载mod_jk.so
3.1 在%apache%/conf/httpd.conf 的适当位置添加以下代码,使其启动时加载mod_jk的配置:
Include conf/mod_jk.conf
3.2 %apache%/conf/mod_jk.conf 的内容列举如下:
#加载模块mod_jk.so
LoadModule jk_module modules/mod_jk.so
#加载另一配置文件, 设置相关tomcat的配置信息及如何分配apache转出的请求
JkWorkersFile conf/workers.properties
# 设置哪些请求需要转发给ajp进而递给相关tomcat处理
JkMount /*.jsp controller
3.3 %apache%/conf/workers.properties 的内容列举:
#server 列表
worker.list = controller,tomcat1,tomcat2
#========tomcat1========
#ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.port=8011
#tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.tomcat1.lbfactor = 1
#========tomcat2========
#ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.port=8012
#tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.tomcat2.lbfactor = 2
#========controller,负载均衡控制器========
worker.controller.type=lb
#指定分担请求的tomcat
worker.controller.balanced_workers=tomcat1,tomcat2
worker.controller.sticky_session=1
四: 设置tomcat和apache的虚拟目录
4.1 在两个tomcat中添加相同的虚拟目录指向同一个project
在%tomcat1%/conf/Catalina/localhost 和 %tomcat2%/conf/Catalina/localhost 中创建同一个文件 AjaxStart.xml,内容如下
<Context path="/AjaxStart" reloadable="true" docBase="E:/projects/AjaxStart/build" ></Context>
4.2 在apache中设置虚拟目录指向刚才tomcat设置的虚拟目录指向的project
编辑%apache%/conf/httpd.conf, 在适当位置添加以下代码
Alias /AjaxStart "E:/projects/AjaxStart/build/"
<Directory "E:/projects/AjaxStart/build">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
五 集群设置,各个tomcat共享session http://www.blogjava.net/itstarting/archive/2008/03/03/102335.html
5.1 在project 的 WEB-INF/web.xml 中添加以下代码
<web-app> ------------> <web-app> <distributable />
5.2 修改%tomcat1%和%tomcat2%的server.xml, 把它们默认的cluster设置(默认已被注销),改为以下(注意两个tcpListenPort="4002" 不能占相同端口)
- <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"
- mcastClusterDomain="catalina"
- mcastAddr="228.0.0.4"
- mcastPort="45564"
- mcastBindAddress="127.0.0.1"
- mcastFrequency="500"
- mcastDropTime="3000"/>
- <Receiver
- className="org.apache.catalina.cluster.tcp.ReplicationListener"
- tcpListenAddress="127.0.0.1"
- 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>
测试apache的配置是否正确,并提供排错的提示
"C:/Program Files/Apache Group/Apache2/bin/Apache.exe" -t
需要進一步總結的內容
注意关于tomcat 和 apache 之间各自的线程数量的问题
http://blog.hnce.net/post/315.html (apache and tomcat 三種鏈接方式)--------查看jkstatus,集群運行狀況
http://www.goneeded.com/javas/articles/20070816/a01231457565.html compare mod_proxy and mod_jk
mysql cluster
http://blogger.org.cn/blog/more.asp?name=lhwork&id=32442
http://blogger.org.cn/blog/more.asp?name=lhwork&id=32441
http://blogger.org.cn/blog/more.asp?name=lhwork&id=22685 apache tomcat 負載平衡
http://www.blogjava.net/Unmi/archive/2007/09/18/146308.html 结合Apache和Tomcat实现集群和负载均衡
http://middleware.csdn.net/page/6fc0bb4c-176f-486a-96fe-0524db9426a1
http://webdev.csdn.net/page/172af2d8-152b-49df-9763-d76bb5eb07d7 linux 服務器網絡負載均衡的實現
有用博客
http://blogger.org.cn/blog/blog.asp?name=lhwork