Apache + Tomcat 的群集配置



使用群集和负载均衡的整体架构如下:



中间由一台服务器做负载均衡(Load Balancer),它将所有请求,根据一定的负载均衡规则发送给指定的群集服务器(Cluster),群集服务器拥有着相同的状态和相同的应用程序,并且他们的Session是相互复制的,这样,不管访问哪台服务器都具有相同的结果,即使一台服务器崩溃掉以后,可以由其他集群服务器继续负责应用程序的运行。


Tomcat中如何配置群集,我们假设有如下场景,一台负载均衡服务器负责请求的均衡,群集服务器A和群集服务器B组成一个群集,当某个群集服务器崩溃后,另外一台继续负责应用程序的运行。

一.配置Tomcat5.5.12群集服务器A

修改Tomcat配置文件server.xml

1.群集服务器A的端口号与B不冲突,即使Server Port,Connector,Coyote/JK2 AJP Connector的端口号唯一

2.在Host元素下增加以下内容:

<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" 


 managerClassName="org.apache.catalina.cluster.session.DeltaManager" 


 expireSessi 


 useDirtyFlag="true" 


 notifyListeners> 


 <!--每个群集服务器都需要有相同的Membership配置. 一个广播地址决定一个Tomcat 群集,群集中的Tomcat服务器必须能从同一个广播地址中接收广播信息--> 


 <Membership 


 className="org.apache.catalina.cluster.mcast.McastService" 


 mcastAddr="228.0.0.4" 


 mcastPort="45564" 


 mcastFrequency="500" 


 mcastDropTime="3000"/> 


 <!--tcpListenAddress:本机IP地址服务器将此地址广播给其他群集服务器--> 


 <Receiver 


 className="org.apache.catalina.cluster.tcp.ReplicationListener" 


 tcpListenAddress="10.1.2.161" 


 tcpListenPort="4001" 


 tcpSelectorTimeout="100" 


 tcpThreadCount="6"/> 



 <Sender className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" 


 replicati 


 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>




3.修改Web应用程序配置文件web.xml

在web.xml文件中<web-app>元素下增加以下内容:

<!--此应用将与群集服务器复制Session--> 


 <distributable/>



二. 配置Tomcat5.5.12群集服务器B

与群集服务器A配置基本相同,唯一不同的地方就是server.xml文件中

<Receiver 


 className="org.apache.catalina.cluster.tcp.ReplicationListener" 


 tcpListenAddress="10.10.13.145" 


 tcpListenPort="4002" 


 tcpSelectorTimeout="100" 


 tcpThreadCount="6"/> 


tcpListenAddress应为本机地址,如果两台群集服务器在一台机器上,则端口号要不同



注意:B的其他端口不要与A冲突。


三. 群集服务器具体配置结果



Mcast*用于广播,所有群集服务器需要填写相同的配置

tcpListen*本机的IP,群集服务器启动时,会将自己的IP和端口号广播出去,其他群集服务器收到后,响应广播发出者。


四.测试群集

启动群集服务器A,再启动群集服务器B会显示群集服务器的信息,表示群集服务器配置成功

五. 配置负载均衡服务器Apache2.2.3

现在虽然群集已经有了相同的状态,但需要不同的IP地址才能访问到服务器A与B,现在我们配置一台负载均衡服务器来实现统一的入口访问,和负载的均衡。

下载Apache服务器2.2.4 ( http://httpd.apache.org/download.cgi ) 


{可以参考文档 http://lamp.linux.gov.cn/Apache/ApacheMenu/index.html 


 对apache服务器安装和配置} 


修改conf/httpd.conf文件 


将以下Module的注释去掉 


LoadModule proxy_module modules/mod_proxy.so 


LoadModule proxy_balancer_module modules/mod_proxy_balancer.so 


LoadModule proxy_http_module modules/mod_proxy_http.so 



并增加以下元素 


ProxyRequests Off 



ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On 


<Proxy balancer://mycluster> 


BalancerMember http://10.10.13.145:9080/helloworld 


BalancerMember http://10.10.13.145:10080/helloworld smax=1 loadfactor=20 


</Proxy> 



<Location /balancer-manager> 


SetHandler balancer-manager 



Order Deny,Allow 


Deny from all 


Allow from all 


</Location> 



<Location /server-status> 


SetHandler server-status 



Order Deny,Allow 


Deny from all 


Allow from all 


</Location> 



其中 


ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On 


<Proxy balancer://mycluster> 


BalancerMember http://10.10.13.145:9080/helloworld 


BalancerMember http://10.10.13.145:10080/helloworld smax=1 loadfactor=20 


</Proxy> 


ProxyPass为代理转发的Url,即将所有访问/helloworld的请求转发到群集balancer://mycluster 


BalancerMember为群集的成员,即群集服务器A或B,负载均衡服务器会根据均衡规则来将请求转发给BalancerMember。 


(可以同时配置几个站点) 



配置好后,启动Apahce服务器,访问localhost/hellworld就会看到群集服务器中应用返回的结果。恭喜你,负载均衡和群集已经配置成功了。 


-à 如果Apache 无法启动,或许可以通过设置尝试解决: 


1.网上邻居 >> 本地连接 >>属性 >> internet协议(TCP/IP) >> 属性 >> 高级 >> wins标签 >> 去掉启用LMhosts查询前的勾. 


参考: Apache Cluster配置文件httpd.conf 


……. 


…… 


LoadModule proxy_module modules/mod_proxy.so 


#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 



LoadModule proxy_balancer_module modules/mod_proxy_balancer.so 


#LoadModule proxy_connect_module modules/mod_proxy_connect.so 



LoadModule proxy_http_module modules/mod_proxy_http.so 


#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so 



LoadModule negotiation_module modules/mod_negotiation.so 


#LoadModule rewrite_module modules/mod_rewrite.so 



ProxyRequests Off 



#设定第一个域名的群集 


ProxyPass /NewWebDesign balancer://mycluster stickysession=jsessionid nofailover=On 


<Proxy balancer://mycluster> 


 BalancerMember http://10.1.2.193:8088/NewWebDesign 


 #BalancerMember http://10.1.2.117:8088/NewWebDesign 


 BalancerMember http://10.1.2.161:8080/NewWebDesign 


 BalancerMember http://10.1.2.161:8088/NewWebDesign smax=1 loadfactor=20 


</Proxy> 



#设定第二个域名的群集 


ProxyPass /students balancer://studentscluster stickysession=jsessionid nofailover=On 


<Proxy balancer://studentscluster> 


 BalancerMember http://10.1.2.193:8088/students 


 #BalancerMember http://10.1.2.117:8088/students 


 BalancerMember http://10.1.2.161:8080/students 


 BalancerMember http://10.1.2.161:8088/students smax=1 loadfactor=20 


</Proxy> 



#设定第三个域名的群集 


ProxyPass /gwt balancer://gwtcluster stickysession=jsessionid nofailover=On 


<Proxy balancer://gwtcluster> 


 BalancerMember http://10.1.2.193:8088/gwt 


 #BalancerMember http://10.1.2.117:8088/gwt 


 BalancerMember http://10.1.2.161:8080/gwt 


 BalancerMember http://10.1.2.161:8088/gwt smax=10 loadfactor=20 


</Proxy> 



<Location /balancer-manager> 


 SetHandler balancer-manager 


 Order Deny,Allow 


 Deny from all 


 Allow from all 


</Location> 



<Location /server-status> 


 SetHandler server-status 


 Order Deny,Allow 


 Deny from all 


 Allow from all 


</Location> 


.


……

……


其他相关的参考文档:


群集技术


就像冗余部件可以使你免于硬件故障一样,群集技术则可以使你免于整个

系统的瘫痪以及操作系统和应用层次的故障。一台服务器集群包含多台拥有共享数

据存储空间的服务器,各服务器之间通过内部局域网进行互相连接;当其中一台服

务器发生故障时,它所运行的应用程序将与之相连的服务器自动接管;在大多数情

况下,集群中所有的计算机都拥有一个共同的名称,集群系统内任意一台服务器都

可被所有的网络用户所使用。一般而言,群集和高可用性结合的服务器可将运行提

升至99.99%。群集技术不仅仅能够提供更长的运行时间,它在尽可能地减少与既定

停机有关的停机时间方面同样有着重要意义。例如,如果使用群集,你可以在关闭

一台服务器的同时,不用与用户断开即可进行应用,硬件,操作系统的"流动升级

"。集群系统通过功能整合和故障过渡技术实现系统的高可用性和高可靠性,集群

技术还能够提供相对低廉的总体拥有成本和强大灵活的系统扩充能力。


http://www.360doc.com/showWeb/0/0/305047.aspx 

Apache2.2+Tomcat5.5负载均衡+集群配置 



http://www.360doc.com/showWeb/0/0/207324.aspx 


Clustering and Load Balancing in Tomcat 5, Part 1 



http://www.onjava.com/pub/a/onjava/2004/04/14/clustering.html?page=1 


Clustering and Load Balancing in Tomcat 5, Part 2 




http://www.360doc.com/showWeb/0/0/207707.aspx 


Tomcat群集配置 



http://lamp.linux.gov.cn/Apache/ApacheMenu/index.html 


Apache HTTP Server Version 2.2 文档 [最后更新:2007年2月5日]