最近公司要给客户提供一套集群方案,项目组采用了Apache和Tomcat的集群配置,用于实现负载均衡的实现。
由于以前没有接触过Apache,因此有些手生,另外在网上搜寻了很多有关这方面的集群文章,但是没有一篇是可以从头到尾,配置可以成功的,或者是文件不全,解释不清等。
博主本人希望借这个机会,自己总结一份,用于分享使用。
本集群采用ajp的方式来实现,方法简单易懂。实际上对于这种集群的配置,无非就是把需要的软件等下载后,修改相应的配置文件,最后依次启动即可。
这里我把需要的应用软件和相应的配置文件贴出,大家可以对比自己的文件是否匹配。
事先说明下,本人做的是完全分布式集群,也就是真正的在不同的虚拟机上做的操作。并不是在同一台机器上做的,因此如果各位在同一台机器上做该操作的话,不建议采纳。
三台机器:
系统:CentOS 5.x
主节点:192.168.1.101
子节点1:192.168.1.151
子节点2:192.168.1.152
1. 需要用到的软件:(具体安装步骤无需描述)
apache 2.2.25 安装在主节点上 /opt/apache2
apache-tomcat-6.0.37 安装在子节点1和子节点2上 /opt/apache-tomcat-6.0.37
2.配置文件
apache安装后,需要注意三个地方需要修改:
1)ServerName localhost:80 该localhost为本地主机名,该主机名为hosts文件所显示的名字,配置错误的话,会出现 httpd:Could not reliably determine.......错误。
2)在文件的最后需要配置以下文本,用于控制集群的成员。
ProxyPass /images ! ProxyPass /css ! ProxyPass /js ! ProxyRequests Off ProxyPass /test balancer://mycluster/ stickysession=JSESSIONID ProxyPassReverse /test balancer://mycluster/ stickysession=JSESSIONID <Proxy balancer://mycluster> BalancerMember ajp://192.168.1.152:8009/test/ loadfactor=1 BalancerMember ajp://192.168.1.151:8009/test/ loadfactor=1 </Proxy>
该配置为Apache的反向代理,用于通过apache去访问tomcat项目。test为博主的项目Context,两个BalanceMember是集群中的成员。8009端口是tomcat的ajp端口名。
上述修正:昨天在进行试验的时候疏忽了这块,今天在公司试验的时候才发现。大家一定要注意下,BalancerMember一行中的route=worker1和route=worker2都不能加上,一旦加上的话,就不会通过apache的指定去进行分布的访问了,因此这里一定要去掉。否则的话,只会在一个tomcat容器中进行操作。
最后的下面balancer-manager是用于查看负载均衡运行情况的路径配置。
该文本需要添加在
<IfModule ssl_module> SSLRandomSeed startup builtin SSLRandomSeed connect builtin </IfModule>的上面。
3)最后还需要在
ProxyPass /images ! ProxyPass /css ! ProxyPass /js !的上面加入下面配置:
<Location /server-status> SetHandler server-status Order Deny,Allow Deny from all Allow from all </Location> <Location /balancer-manager> SetHandler balancer-manager Order Deny,Allow Deny from all Allow from all </Location>
本人也是遇到了这种问题,最后找了很长时间,才发现需要引入上面配置。
至此为止,apache的配置就完成了,下面进行tomcat的配置。
3.Tomcat配置文件
首先说一点,Tomcat也只是配置一个文件,就是server.xml。并且里面的端口无需改动,因为是在真正的分布式中来实现的。只需要修改一个地方,就是Engine节点。
在之前的Engine节点上,加入一个属性jvmRoute,值是刚才我们提到的worker1或worker2,具体配置如下:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.1.152" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
最后把所要操作的项目放到tomcat的webapp下,另外项目本身的web.xml文件中,需要引入<distributable/>元素。
至此为止,Tomcat的配置也完成了。
4.启动测试
启动的顺序在网上看到五花八门,本人自己测试是需要先启动Apache,然后依次启动Tomcat子节点。
测试的地址 http://192.168.1.101:80/test
测试查看的负载均衡情况地址 http://192.168.1.101:80/balancer-manager
测试方法:我们可以在项目的index.jsp文件最后加入一段打印,如:
<% system.out.println("=============="); %>
以上是个人的总结,本人也是第一次配置该集群,如有不成熟的地方,请下面留言。
附加说明:近期在公司部署这套流程以后,发现每次通过apache分发到tomcat容器中,点击某个链接后,会被立即弹出到登陆页面。
该现象是由于没有做Session的复制共享原因造成,原理是当通过apache进入tomcat容器时,tomcat1节点进入后,客户端会持有一个唯一的session标识,当第二次通过apache再次进入时,会进入到tomcat2节点,因此这样的话,由于之前持有的是tomcat1的session标识,因此进入tomcat2节点后,这个唯一标识在tomcat2节点中是不存在的,因此会被容器认为无session信息,所以会被弹出到系统之外。
该问题主要解决的办法是通过session复制以及序列化的方式进行解决。
博主本人近期正在研究通过memcached来统一管理session的方法,如果配置成功的话,会放出解决方案。
另外如果有哪位朋友做过该功能,可以相互探讨下,或论坛留言和博客留言都可以。
Session共享解决方案已经解决,具体可以访问本人另外一篇博文:
通过memcached来实现对tomcat集群中Session的共享策略