tomcat6_apache2.2_ajp 负载均衡加集群实战分享
环境:
--------------------------------------------
一台apache2.2服务器,三台tomcat服务器:
apache2.2服务器
1.ip:192.168.1.20
2.只装apache软件:httpd-2.2.6.tar.bz2
安装路径:/usr/local/apache2
tomcat服务器:均配置相同的应用。
1.集群名:balancer://tomcatcluster
2.三台集群服务器ip:
IP_1:192.168.1.31
IP_2:192.168.1.32
IP_3:192.168.1.33
3.测试应用程序test文件夹放在tomcat6的webapps目录下
操作系统均为:centos4.5_x86
jre:1.6:jdk-6u1-linux-i586-rpm.bin
tomcat6.0:编译好的二进制软件包apache-tomcat-6.0.13.tar.gz
tomcat6.0安装路径:/usr/local/tomcat6
oralce的jdbc:class12.jar
软件包存放的路径:/home/xiutuo/software/
java安装路径:/usr/java/jdk1.6.0_01
使用普通用户:xiutuo来启动tomcat6
tomcat6开机自动启动脚本:/etc/init.d/tomcat
下载路径:
http://java.sun.com/javase/downloads/index.jsp
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
一:前言:
1.apache对tomcat集群支持有俩种方式:
a.通过apache2.1之后版本后内置的proxy_ajp。
b.对于apache2.1之版本则通过tomcat的jk2.0.4的mod_jk2.so:
(该版本已经停止开发)
将解压缩后的目录中的modules目录中的mod_jk2.so
文件复制到apache的安装目录下的modules目录中。
********************
俩种方式比较:
proxy_ajp配置较简单,主要表现在proxy_ajp目前只支持配置到目录,
还不支持对文件名称的pattern模式匹配
(即还不能定义到只对jsp文件起作用)。
而jk2则可配置性强,但已经停止开发
********************
官方对ajp和jk2说明:
JK2hasbeenputinmaintainermodeandnofurtherdevelopmentwilltakeplace.
ThereasonforshuttingdownJK2developmentwasthelackofdevelopersinterest.
OtherreasonwaslackofusersinterestinadoptingJK2,
causedbyconfigurationcomplexitywhencomparedtoJK.
ThelatestofficialJK2releaseis2.0.4.
JK2willhaveit'ssuccessorwithincoreApache2.1/2.2distribution.
Wehavedevelopednewproxy_ajpthatisanadditiontothemod_proxy
andusesTomcat'sAJPprotocolstack.Itisdeveloppedinhttpd-2.1
andintegratedinit.Wehavealsodevelopedanewproxy_balancer
moduleforloadbalancinghttpandajpprotocolstacks.
JKwillbefullysupportedforallotherwebservers.
ThenextJKreleaseisplannedfortheendofNovember.
LotsofcodefromJK2hasbeenportedtoJK
2.tomcat集群方式:
a.DeltaManager
--现在采用的该方式:内部机器集群少采用
b.BackupManager
********************
两种集群方式官方说明:
usingtheDeltaManagertoreplicatesessiondeltas.
Byall-to-allwemeanthatthesessiongetsreplicatedto
alltheothernodesinthecluster.Thisworksgreatforsmallercluster
butwedon'trecommenditforlargerclusters(alotoftomcatnodes).
Alsowhenusingthedeltamanageritwillreplicatetoallnodes,
evennodesthatdon'thavetheapplicationdeployed.
Togetaroundthisproblem,you'llwanttousetheBackupManager.
Thismanageronlyreplicatesthesessiondatatoonebackupnode,
andonlytonodesthathavetheapplicationdeployed.Downsideof
theBackupManager:notquiteasbattletestedasthedeltamanager.
********************
3.负载均衡(load-balance)定义:
在服务器端短时间内获得大量的请求,单一服务器无法在一个较短的时间内响应这些请求,
此时服务器需要一个机制,请求按照多个服务器不同的负载能力,把这些请求合理的分配。
4.集群(cluster):
在多个服务器之间共享用户信息,资源等。
tomcat6_apache2.2负载均衡加集群:高可用性至高体现。
现在的带集群功能相关软件oracle10g,mysql5,tomcat等。
二:软件安装
1.apache服务器安装:
这里主要介绍apache2的源码安装
#cd/home/xiutuo/software/
#tar-zvxfhttpd-2.2.6.tar.gz
#cdhttpd-2.2.6
#mkdir-p/usr/local/apache2
#./configure\
--prefix=/usr/local/apache2\
--enable-modules=so\
--enable-mods-shared=all\
--enable-proxy\
--enable-proxy-connect\
--enable-proxy-ftp\
--enable-proxy-http\
--enable-proxy-ajp\
--enable-proxy-balancer
注释:这里测试用,编译了所有可用模块,并激活了tomcat集群需要的
enable-proxy,enable-proxy-http,enable-proxy-connect,enable-proxy-ajp
和enable-proxy-balancer,其中proxy-ajp和proxy-balancer必须依赖proxy,
如果是自定义的编译除了以上几个必须的模块外,mod_status也要编译进去,切记。
enable-proxy-ftp可以不编译。
#make
#makeinstall
2.三台tomcat服务器安装
主要介绍jdk1.6u1和tomcat6的安装,三台机器重复此工作就可以了,
当然记得ip一定要设置正确。
jdk1.6安装
-------------------------------
a.卸载系统自带jdk
#rpm-ej2sdk-1.4.1-fcs
b.安装新jdk
#cd/home/xiutuo/software
进入软件包存放目录
#chmoda+xjdk-6u1-linux-i586-rpm.bin
使它有执行权限
#./jdk-6u1-linux-i586-rpm.bin
多敲几个空格,然后看到[yes]的时候输入yes,回车
然后在当前目录下就生成了jdk-6u1-linux-i586-rpm
#rpm-ivhjdk-6u1-linux-i586-rpm
c.设置环境变量
仅设置某个用户而不是所有用户可以修改~/.cshrc,~/.bash_profile文件,
追加下面一段,如果为所有用户以及以后添加的用户都加上环境变量的话,
追加/etc/profie文件.
***主意不要在profile和~/.cshrc或~/.bash_profile中重复追加**
这里:
#vi/etc/profile
//java
//如果你安装的j2sdk的路径不一样,请自行修改
JAVA_HOME=/usr/java/jdk1.6.0_01
exportJAVA_HOME
CLASSPATH=/usr/java/jdk1.6.0_01/lib:/usr/java/jdk1.6.0_01/jre/lib
exportCLASSPATH
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
exportPATH
JRE=/usr/java/jdk1.6.0_01/jre
exportJRE
d:立即生效
//如果你修改的是/etc/profile
#source/etc/profile
//如果你修改的是~/.cshrc
#source~/.cshrc
//如果你修改的是~/.bash_profile
#source~/.bash_profile
e:测试成功否
#java-version
Java(TM)SERuntimeEnvironment(build1.6.0_01-b06)
JavaHotSpot(TM)ClientVM(build1.6.0_01-b06,mixedmode,sharing)
看到这个消息,就ok啦
----------------------------------------------
tomcat6安装
tomcat6更详细的安装请看blog上tomcat文章
----------------------------------------------
a.安装tomcat,
#cd/home/xiutuo/software //进入软件包存放目录
#tar-zvxfapache-tomcat-6.0.13.tar.gz //解压
#mvapache-tomcat-6.0.13/usr/local/tomcat6//安装
#cd/usr/local/tomcat6/bin/ //进入安装目录
#tar-zvxfjsvc.tar.gz //解压
#cdjsvc-src //进入jsvc-src目录
#autoconf
#./configure--with-java=/usr/java/jdk1.6.0_01
#configure时切记加java的jdk路径,否则无法使用普通用户开机自动启动tomcat
#make //编译生成jsvc文件
#cpjsvc.. //拷贝jsvc到上级目录
#cd.. //回到上级目录
#cd/usr/local/tomcat6/
//运行下面的命令可以使tomcat以daemon方式运行
#./bin/jsvc-cp./bin/bootstrap.jar\
-outfile./logs/catalina.out\
-errfile./logs/catalina.err\
org.apache.catalina.startup.Bootstrap
b.配置oralce的jdbc
//拷贝oracle的jdbc到/usr/local/tomcat6/lib目录下
#cp/home/software/class12.jar./lib/
c.配置tomcat用户
#cd/usr/local/tomcat6/conf
#vitomcat-users.xml
内容如下:
<?xmlversion='1.0'encoding='utf-8'?>
<tomcat-users>
<rolerolename="tomcat"/>
<rolerolename="role1"/>
<rolerolename="manager"/>
<rolerolename="admin"/>
<userusername="tomcat"password="tomcat"roles="tomcat"/>
<userusername="role1"password="tomcat"roles="role1"/>
<userusername="both"password="tomcat"roles="tomcat,role1"/>
<userusername="admin"password="admin"roles="admin,manager"/>
</tomcat-users>
请修改tomcat里所有定义用户的密码:即修改password为自己想要的值。
d.把应用程序文件夹test放到webapps下
3.tomcat负载均衡和集群配置
参考官方配置文档:
http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html
http://tomcat.apache.org/tomcat-6.0-doc/balancer-howto.html
a.tomcat6配置文件server.xml和应用程序的web.xml
**开放负载均衡,默认使用ajp协议时使用8009端口(使用http协议时为8080端口)
**修改tomcat的conf/server.xml的<Engine>(使用ajp协议时配置)
把
<!--YoushouldsetjvmRoutetosupportload-balancingviaAJPie:
<Enginename="Standalone"defaultHost="localhost"jvmRoute="jvm1">
-->
<Enginename="Catalina"defaultHost="localhost">
改成
<!--YoushouldsetjvmRoutetosupportload-balancingviaAJPie:
-->
<Enginename="Standalone"defaultHost="localhost"jvmRoute="tomcat1">
<!--
<Enginename="Catalina"defaultHost="localhost">
-->
说明:
第一台tomcat就把jvmRoute="tomcat1"
第二台tomcat就把jvmRoute="tomcat2"
第三台tomcat就把jvmRoute="tomcat3"
**开放集群
**修改tomcat的conf/server.xml(使用ajp协议时配置)
在<Engine>后面或者<Host>后面简单的加上
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
也可以加上更详细参数的集群配置内容(这是官方默认,请自行修改相关参数):
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">
<MembershipclassName="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
***配置应用的web.xml
***在每个webapps应用中,修改配置文件web.xml文件添加元素<distributable/>
在web.xml文件中<web-app>元素下增加以下内容:
<!--此应用将与群集服务器复制Session-->
<distributable/>
具体修改如下:
修改前:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<web-appxmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
修改后:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<web-appxmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--此应用将与群集服务器复制Session-->
<distributable/>
</web-app>
4.配置apache的ajp负载均衡功能,这里请务必启用反向代理。
******************************
至于其中的原理请参考官方文档说明。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理还可以使用缓冲特性(由mod_cache提供)减少网络使用率。
反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。
反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
另外,还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时
存在于同一个URL空间下。
*****************************
参考文档:
tomcat6官方文档
http://tomcat.apache.org/tomcat-6.0-doc/balancer-howto.html
apache中文版本
http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/mod/mod_proxy.html
http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/mod/mod_proxy_balancer.html
apache官方英文版本
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html
***配置apache
***修改/usr/local/apache2/conf/httpd.conf文件
确保将以下Module的注释去掉
LoadModuleproxy_modulemodules/mod_proxy.so
LoadModuleproxy_connect_modulemodules/mod_proxy_connect.so
LoadModuleproxy_ftp_modulemodules/mod_proxy_ftp.so
LoadModuleproxy_http_modulemodules/mod_proxy_http.so
LoadModuleproxy_ajp_modulemodules/mod_proxy_ajp.so
LoadModuleproxy_balancer_modulemodules/mod_proxy_balancer.so
LoadModulestatus_modulemodules/mod_status.so
并在最后面,增加
<Location/server-status>
SetHandlerserver-status
OrderDeny,Allow
Denyfromall
Allowfromall
</Location>
<Location/balancer-manager>
SetHandlerbalancer-manager
OrderDeny,Allow
Denyfromall
Allowfromall
</Location>
ProxyRequestsOff
ProxyPass/testbalancer://tomcatcluster/stickysession=jsessionidnofailover=On
<Proxybalancer://tomcatcluster>
BalancerMemberajp://192.168.1.30:8009loadfactor=1
BalancerMemberajp://192.168.1.31:8009loadfactor=2
BalancerMemberajp://192.168.1.32:8009loadfactor=3
</Proxy>
注释:
ProxyRequestsOff表示启用反向代理。
ProxyPass为代理转发的Url,即将所有访问/的请求转发到
群集balancer://tomcatcluster,这里为/test即将所有访问/的请求转发到群集balancer://tomcatcluster的/test目录
BalancerMember为群集的成员,
即群集服务器1或2或3,负载均衡服务器会根据均衡规则来将请求转发给BalancerMember。
配置好后,启动Apahce服务器,访问localhost就会看到群集服务器中应用返回的结果。
访问http://192.168.1.20/balancer-manager,显示负载均衡有关信息
5.调试负载均衡集群系统
调试前务必:
先开启三台tomcat6服务器的tomcat服务!
再开启apache服务器的apache服务,切记!
a.开启tomcat服务
#cd/usr/local/tomcat6/bin
#./shutdown.sh//停止tomcat
#./start.sh //启动tomcat
查看tomcat的进程:
#ps-e|grepjava
出现了java这个进程的话,说明你的tomcat起来了。
b.开启apache服务
#cd/usr/local/apache2/bin
#./apachectlconfigtest
//命令检查一下配置是否有误,显示SyntaxOK,说明配置正确
#./apachectlstop//停止apache
#./apachectlstart//启动apache
6.检验是否负载均衡集群系统成功
访问apache服务器的web服务
http://192.168.1.20/balancer-manager
如果显示负载均衡有关信息则说明成功了。
接着可以访问http://192.168.1.20/test即访问到了tomcat的test应用
7.具体的tomcat集群负载均衡优化请参考文档自行设置相关参数
具体的apache优化请参考文档自行设置相关参数