基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置

第一章. 背景简介
对于大多数企业应用,都希望能做到7*24小时不间断运行。要保持如此高的可用性并非易事,比较常见的做法是将系统部署到多台机器上,每台机器都对外提供同样的功能,这就是集群。系统变为集群时,除了要求系统能够支持水平伸缩外,还要解决两个问题:

1, 如何均衡地访问到提供业务功能的机器。

2, 如何保证当机器出现问题时,用户能自动跳转到另外的机器,不影响使用。

常用的负载均衡技术有硬件和软件两种,本示例常用软件的技术实现。软件也有很多实现技术,如基于apache的mod_jk以及mod_proxy等。基于mod_jk的文章有不少,本文演示一下用mod_proxy的方式。

实现集群的应用最重要的是处理用户Session的问题,一般有三种策略:

1, Session复制

2, Session Sticky

3, 基于Cache的集中式Session

本文使用的是Tomcat 7.0.2应用服务器,用的方法是Session复制。

第二章. 配置环境

1, JDK1.6,请自行下载安装,搞Java的一般都装有的吧,哈哈。

2, Apache 2.2.16, (released 2010-07-25),现在为止应该是最新的稳定版本,下载地址: http://httpd.apache.org/download.cgi

3, Tomcat 7.0.2,目前也是最新的版本。Minimum Java Version1.6.下载地址:http://tomcat.apache.org/download-70.cgi

4, 安装过程略

第三章. 部署图

第四章. Tomcat7集群配置

一、 就地取材,复制tomcat7/webapps下的examples,重命名为cluster应用,以后就用cluster做测试。

二、 详细配置参照tomcat7 \webapps\docs\cluster-howto.html 或者http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

三、 为了在Tomcat7中实现session复制,以下必需完成:

• 所有session属性必需实现 java.io.Serializable

• Uncomment the Cluster element in server.xml。把Cluster元素的注释去掉。参照四

• If you have defined custom cluster valves, make sure you have the
ReplicationValve defined as well under the Cluster element in server.xml
。参照四

• If your Tomcat instances are running on the same machine, make
sure the tcpListenPort attribute is unique for each instance, in most
cases Tomcat is smart enough to resolve this on it‘s own by
autodetecting available ports in the range 4000-4100。参照四<
Receiver>中的注释

• Make sure your web.xml has the <distributable/> element or set at your <Context distributable="true" /> 参照四

• If you are using mod_jk, make sure that jvmRoute attribute is set
at your Engine <Engine name="Catalina" jvmRoute="node01" > and
that the jvmRoute attribute value matches your worker name in
workers.properties .用mod_jk的情况,我们可以不管。

• Make sure that all nodes have the same time and sync with NTP service! 当使用多台机器时,要保证不同机器时间的同步。原因为tomcat session复制的一些机制。具体原因看文档。

• Make sure that your loadbalancer is configured for sticky session mode. 保证负载均衡软件设置为session sticky模式。

四、 详细配置:

1. 修改tomcat7_a/conf/server.xml, 我们采用的是默认的配置,在<Engine>节点下添加:

Java代码  

  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
  2. channelSendOptions="8">
  3. <Manager className="org.apache.catalina.ha.session.DeltaManager"
  4. expireSessionsOnShutdown="false"
  5. notifyListenersOnReplication="true"/>
  6. <Channel className="org.apache.catalina.tribes.group.GroupChannel">
  7. <Membership className="org.apache.catalina.tribes.membership.McastService"
  8. address="228.0.0.4"
  9. port="45564"
  10. frequency="500"
  11. dropTime="3000"/>
  12. <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
  13. address="auto"
  14. <!—tcpListenPort如果是同一机器部署两个tomcat7应用,则修改tomcat7_b为4001,以免冲突. 不同机器下,不用更改此项。—>
  15. [color=red]port="4000"[/color]
  16. autoBind="100"
  17. selectorTimeout="5000"
  18. maxThreads="6"/>
  19. <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
  20. <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
  21. </Sender>
  22. <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
  23. <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  24. </Channel>
  25. <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
  26. filter=""/>
  27. <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
  28. <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
  29. tempDir="/tmp/war-temp/"
  30. deployDir="/tmp/war-deploy/"
  31. watchDir="/tmp/war-listen/"
  32. watchEnabled="false"/>
  33. <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
  34. <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
  35. </Cluster>

2. <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 修改,仅为了调试方便。

3. tomcat7_a\webapps\cluster\WEB-INF\web.xml中加入<distributable/>

4. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_a">,添加jvmRoute属性,此项为后面apache负载均衡用到。

五、 复制一份tomcat7_a应用,改名为tomcat7_b.只是为了图方便,实际应该复制的是前面的cluster工程。注意以下几点配置就ok.

1. 修改tomcat7_a/conf/server.xml 中的Server port属性<Server port="8006" shutdown="SHUTDOWN">,因为是同一台机器两个tomcat应用,所以改一下。

2. 修改<connector port="8082" protocol="HTTP/1.1" onnectionTimeout="20000" edirectPort="8443" />,同理,为了避免同一台机器端口号冲突。部置在不同的机器是不用管的。

3. 修改<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_b">,此项为后面apache负载均衡用到。

4. 修改<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4001" autoBind="100" selectorTimeout="5000" maxThreads="6"/>

5. tomcat7_b\ebapps\cluster\WEB-INF\web.xml中加入<distributable/>

到此集群配置完成.

第五章. 集群测试

1. tomcat7_a和tomcat7_b的cluster工程中分别添加测试文件:testCluster.jsp

Java代码  

  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <%@ page import="java.util.*" %>
  3. <html><head><title>Cluster Test</title></head>
  4. <body>
  5. <%
  6. //HttpSession session = request.getSession(true);
  7. System.out.println(session.getId());
  8. out.println("<br> SESSION ID:" + session.getId()+"<br>");
  9. // 如果有新的请求,则添加session属性
  10. String name = request.getParameter("name");
  11. if (name != null && name.length() > 0) {
  12. String value = request.getParameter("value");
  13. session.setAttribute(name, value);
  14. }
  15. out.print("<b>Session List:</b>");
  16. Enumeration<String> names = session.getAttributeNames();
  17. while (names.hasMoreElements()) {
  18. String sname = names.nextElement();
  19. String value = session.getAttribute(sname).toString();
  20. out.println( sname + " = " + value+"<br>");
  21. System.out.println( sname + " = " + value);
  22. }
  23. %>
  24. <form action="testCluster.jsp" method="post">
  25. 名称:<input type=text size=20 name="name">
  26. <br>
  27. 值:<input type=text size=20 name="value">
  28. <br>
  29. <input type=submit value="提交">
  30. </form>
  31. </body>
  32. </html>

2. 启动tomcat7_a,启动完毕后,启动tomcat7_b

3. 进入http://localhost:8081/cluster/testCluster.jsp 对应tomcat7_a(8081),登录几次,可看到

4. 另外打开一个浏览器,进入http://localhost:8082/cluster/testCluster.jsp对应tomcat7_b(8082),登录name:tomcat_b,value:b value可看到

5. 刷新tomcat7_a(8081)相关页面,可以看到从tomcat7_b提交的值session同步过来了,说明集群成功。

第六章. Session集群工作步骤

参照tomcat7 doc:

To make it easy to understand how clustering works, We are gonna
take you through a series of scenarios. In the scenario we only plan to
use two tomcat instances TomcatA and TomcatB. We will cover the
following sequence of events:

1. TomcatA starts up

2. TomcatB starts up (Wait that TomcatA start is complete)

3. TomcatA receives a request, a session S1 is created.

4. TomcatA crashes

5. TomcatB receives a request for session S1

6. TomcatA starts up

7. TomcatA receives a request, invalidate is called on the session (S1)

8. TomcatB receives a request, for a new session (S2)

9. TomcatA The session S2 expires due to inactivity.

第七章. 负载均衡配置

Tomcat有两种负载均衡的方式:

1. 使用 JK1.2.x native connector

2. 使用Apache HTTP Server 2.x with mod_proxy

我们使用的是mod_proxy,在Apache Http Server2.2以上版本已经自动带有:

Mod_proxy supports either HTTP or AJP load balancing. 我们通过ajp方式。

详细查看:tomcat7\webapps\docs\balancer-howto.html

1. 首先,监听8000端口, 在Apache安装目录下找到conf/httpd.conf文件

稍前面加上

Java代码  

  1. # 监听端口和监听地址
  2. Listen 8000

2. conf/httpd.conf,去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(proxy)模块?

Java代码  

  1. LoadModule proxy_module modules/mod_proxy.so
  2. LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
  3. LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
  4. LoadModule proxy_connect_module modules/mod_proxy_connect.so
  5. LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
  6. LoadModule proxy_http_module modules/mod_proxy_http.so

3. conf/httpd.conf文件最后加上:

Java代码  

  1. #虚拟机配置,负载均衡配置
  2. <VirtualHost *:8000>
  3. ServerAdmin weigbo@163.com
  4. ServerName localhost
  5. ServerAlias localhost
  6. #小心,有些地方要有空格,要不然会出错哈哈。
  7. ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
  8. ProxyPassReverse / balancer://cluster/
  9. #ErrorLog "logs/error.log"
  10. #CustomLog "logs/access.log" common
  11. </VirtualHost>
  12. #The ProxyRequests directive should usually be set off when using ProxyPass.
  13. ProxyRequests Off
  14. <proxy balancer://cluster>
  15. BalancerMember ajp://localhost:8009 loadfactor=1 route=tomcat7_a  smax=5 max=20 ttl=120 retry=300 timeout=15
  16. BalancerMember ajp://localhost:9009 loadfactor=1 route=tomcat7_b  smax=5 max=20 ttl=120 retry=300 timeout=15
  17. # status=+H为配置热备,当所有机器都over时,才会请求该机器
  18. #BalancerMember http://192.168.1.218:8009 status=+H
  19. ProxySet lbmethod=bytraffic
  20. </proxy>

4. Tomcat7配置(server.xml):

因为是同一机器,两个应用,所以配不同的端口,不同机器则不用配,要和前面的ajp对应上。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />

第八章. 负载均衡测试

Tomcat7_a的cluster工程的测试文件:testCluster.jsp加上html代码:

<b>负载均衡测试:此为:Tomcat7_a上的文件,<font color=red>aaaaaaaaaaaaaaaaaa</font><b>

Tomcat7_b的cluster工程的测试文件:testCluster.jsp加上html代码

<b>负载均衡测试:此为:Tomcat7_b上的文件,<font color=red>bbbbbbbbbbbbbbbbbb</font><b>

打开浏览器,进入地址:http://localhost:8000/cluster/testCluster.jsp

多刷新几次,会看到页面值会在aaaaa和bbbbb间切换,说明负载均衡配置成功。如图:

第九章. Mod_proxy负载均衡算法

目前mod_proxy有3种负载均衡算法:

1. Request Counting(我猜是Round-robin), lbmethod=byrequests

2. Weighted Traffic Counting(这个是按权重,此例也是用此算法), lbmethod=bytraffic

3. Pending Request Counting(从apche文档来看,应该是按负载量,也就是往负载少的派发新请求). lbmethod=bybusyness

它们通过lbmethod值设置。

第十章. 参考文档:

Tomcat 7 doc文档

http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

第十一章. 补充内容:负载均衡管理器

负载均衡管理器可以动态更新负载均衡的应用,你可以用管理器更改负载因子或者特定的应用,还可以把应用设为off模式。

为了使用balancer management, mod_status和mod_proxy_balancer 必需要加载到apache.

设置:

#此项为mod_proxy_balancer管理器需要

LoadModule status_module modules/mod_status.so

在负载均衡项前加上:

#mod_balancer管理应用

<Location /balancer-manager>

SetHandler balancer-manager

Order Allow,Deny

Allow from all

</Location>

可以通过以下地址访问:http://localhost:8000/balancer-manager

附件中是一些相关的配置文件,大家可以参考:

基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置

时间: 2024-08-28 06:13:41

基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置的相关文章

Apache + Tomcat + JK 实现负载均衡和集群(状态复制)

原文请见http://www.cnblogs.com/dennisit/p/3370220.html 本文介绍了集群和负载均衡的基本开源实现,实现了用Apache分发请求到多个Tomcat里面对应的应用. 模块介绍 - Apache作为Web服务器,用于处理静态Http请求: - Tomcat作为应用服务器(Servlet容器),处理动态请求: - JK 作为Apache与Tomcat之间的桥梁,实现了Apache与Tomcat一对多的对应,使后端Tomcat负载均衡. 开发环境 - Windo

Apache + Tomcat + JK 实现负载均衡和集群

本文介绍了集群和负载均衡的基本开源实现,实现了用Apache分发请求到多个Tomcat里面对应的应用. 模块介绍 - Apache作为Web服务器,用于处理静态Http请求: - Tomcat作为应用服务器(Servlet容器),处理动态请求: - JK 作为Apache与Tomcat之间的桥梁,实现了Apache与Tomcat一对多的对应,使后端Tomcat负载均衡. 开发环境 - Windows 7操作系统 - Java SE8 - Apache 2.2.14    (本地安装路径:D:\A

apache + tomcat 负载均衡分布式集群配置

Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问量过大,就会出现服应用务器崩溃的情况,这个时候怎么办,难道就只能去重启服务器吗?好,如果是一般的小型公益网站到也无所谓,但如果是比如像大型航空公司售票等电子商务网站,每天每小时都有大量的订单业务,如果这些售票系统一旦崩溃后,再去重启,这些时间和客户的损失就直接会影响到航空公司的利益,这些损失如何去避

使用apache和nginx代理实现tomcat负载均衡及集群配置详解

实验环境: 1.nginx的代理功能 nginx proxy: eth0: 192.168.8.48 vmnet2 eth1: 192.168.10.10 tomcat server1: vmnet2 eth0: 192.168.10.20 tomcat server2: vmnet2 eth0: 192.168.10.30 # yum install -y nginx-1.8.1-1.el6.ngx.x86_64.rpm # vim /etc/nginx/conf.d/default.conf

基于apache的tomcat负载均衡和集群配置

最近不是很忙,用零碎时间做点小小的实验. 以前公司采用F5负载均衡交换机,F5将请求转发给多台服务器,每台服务器有多个webserver实例,每个webserver分布在多台服务器,交叉式的分布集群.F5只是简单了解,毕竟那玩意几十万的价格实在不是我一个小喽喽能弄来做试验玩的,而起公司也不能开放权限.后来知道apache.Nginx软件可以实现负载(F5是操作于IOS网络模型的传输层,Nginx.apache是基于http反向代理方式,位于ISO模型的第七层应用层.直白些就是TCP UDP 和h

基于apache的tomcat负载均衡和集群配置session共享

接上面的话题接着继续完善.为什么没接到上篇呢?原因很简单太长的文章不爱看!就像有人写了上千行的方法一样,不是逼得没办法谁爱看谁看,反正我不看. 期间我没有一次配置成功,从失败的开始说起, 1.准备jar包 注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一样,需要针对tomcat版本下载对应的包. 这是采用的最新稳定版1.6 首先我到官网:http://code.google.com/p/memcached-session-manager/下载了最新的jar 由于公司网络

Centos基于Apache的Tomcat负载均衡和集群

Centos基于Apache的Tomcat负载均衡和集群 一.背景原理1.tomcat 做个WEB服务器有它的局限性,处理能力低,效率低.承受并发小(1000左右).但目前有不少网站或者页面是JSP的.并采用了tomcat做为WEB,因此只能在此基础上调优.2.目前采取的办法是Apache + Mod_JK + tomcat 来解决一部分请求,用户访问的是apache,但有jsp页面的时候才会去请求tomcat.如果量一大,那么tomcat无法承受,那么只能做tomat集群,Apache + M

Apache配置反向代理、负载均衡和集群(mod_proxy方式)

Apache配置负载均衡和集群使用mod_jk的方式比较多.但是mod_jk已经停止更新,并且配置相对复杂.Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多. 1.Apache配置反向代理    正向代理一般是指PC连接到代理服务器,由代理服务器转发请求到网站.而反向代理指的是用户将请求发送给反向代理服务器,由反向代理服务器将请求路由转发到具体的服务器.    比如机房有两个Tomcat提供服务,但是由于防火墙的原因,用户不能直接访问.这个时候,可以使用反向

Apache、Tomcat负载均衡与集群

一. 环境准备 1.软件下载 a) apache_2.0.55-win32-x86-no_ssl.msi: b) apache-tomcat-5.5.17.rar c) mod_jk-apache-2.0.55.so 下载地址: http://download.csdn.net/detail/crazyiter_com/4178657 2.软件安装 a)  Apache安装路径为:E:\ide\apache\Apache2 (具体可以根据自己的盘符而定) b) Tomcat放置位置和名称注意: