`
peterwei
  • 浏览: 249538 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置
Peter Wei


周日晚和GF的老乡们喝了五粮液,导致周一起不了床,只好请假在家睡觉。白天睡了半天,晚上自然睡不着觉。正好现在的项目中也用到了负载均衡和集群的东西,虽然有新手贴的危险,但还是手痒,决定写点东西,以备不时之需。也希望能对大家有所帮助。

第一章. 背景简介
对于大多数企业应用,都希望能做到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>节点下添加:

<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="auto"
<!—tcpListenPort如果是同一机器部署两个tomcat7应用,则修改tomcat7_b为4001,以免冲突. 不同机器下,不用更改此项。—>
                      [color=red]port="4000"[/color]
                      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>

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
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster Test</title></head>
<body>
<%
  //HttpSession session = request.getSession(true);
  System.out.println(session.getId());
  out.println("<br> SESSION ID:" + session.getId()+"<br>");  
  // 如果有新的请求,则添加session属性
  String name = request.getParameter("name");
  if (name != null && name.length() > 0) {
     String value = request.getParameter("value");
     session.setAttribute(name, value);
  }  
	out.print("<b>Session List:</b>");  
	Enumeration<String> names = session.getAttributeNames();
	while (names.hasMoreElements()) {
		String sname = names.nextElement(); 
		String value = session.getAttribute(sname).toString();
		out.println( sname + " = " + value+"<br>");
        System.out.println( sname + " = " + value);
   }
%>
  <form action="testCluster.jsp" method="post">
    名称:<input type=text size=20 name="name">
     <br>
    值:<input type=text size=20 name="value">
     <br>
    <input type=submit value="提交">
   </form>
</body>
</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文件
稍前面加上
# 监听端口和监听地址
Listen 8000

2. conf/httpd.conf,去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(proxy)模块。
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_ftp_module modules/mod_proxy_ftp.so  
LoadModule proxy_http_module modules/mod_proxy_http.so 


3. conf/httpd.conf文件最后加上:
#虚拟机配置,负载均衡配置
<VirtualHost *:8000>
	ServerAdmin weigbo@163.com
	ServerName localhost
	ServerAlias localhost
	#小心,有些地方要有空格,要不然会出错哈哈。
	ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
	ProxyPassReverse / balancer://cluster/
	#ErrorLog "logs/error.log"
	#CustomLog "logs/access.log" common
</VirtualHost> 

#The ProxyRequests directive should usually be set off when using ProxyPass.
ProxyRequests Off
<proxy balancer://cluster>
	BalancerMember ajp://localhost:8009 loadfactor=1 route=tomcat7_a  smax=5 max=20 ttl=120 retry=300 timeout=15
	BalancerMember ajp://localhost:9009 loadfactor=1 route=tomcat7_b  smax=5 max=20 ttl=120 retry=300 timeout=15
	# status=+H为配置热备,当所有机器都over时,才会请求该机器
	#BalancerMember http://192.168.1.218:8009 status=+H
	ProxySet lbmethod=bytraffic
</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




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

  • 大小: 172.5 KB
  • 大小: 56 KB
  • 大小: 55.2 KB
  • 大小: 58.5 KB
  • 大小: 96.2 KB
  • 大小: 65.4 KB
  • 大小: 168.3 KB
  • 大小: 125.5 KB
分享到:
评论
40 楼 cmjcmj8080 2010-10-26  
这样配置实现的session复制时深拷贝还是浅拷贝?
39 楼 peterwei 2010-10-24  
因为里面还有一些ip方面的配置呀。原来是单机不同端口,仔细看一下配置文件,修改调试一下就ok了。
38 楼 cmjcmj8080 2010-10-20  
我照着帖子的方法配制两个tomcat7,在本机下能实现集群session复制,但是复制tomcat7_b到另外一台服务器,session复制就不能用了,这是什么原因呢?
改了一下ip发现apache的负载均衡还是能用的,就是session复制不行,知道的,提示一下啊 谢谢
37 楼 peterwei 2010-09-10  
viei 写道
感觉还是cache中心+session的令牌,让个web server自己去同步session开销比较低
前面用个nginx或者haproxy,然后做个lvs,这样你后面的tomcat可以挂载很多个。
这样基本一组应付5-10k并发是没问题的


你也分享一下吧。
36 楼 viei 2010-09-10  
感觉还是cache中心+session的令牌,让个web server自己去同步session开销比较低
前面用个nginx或者haproxy,然后做个lvs,这样你后面的tomcat可以挂载很多个。
这样基本一组应付5-10k并发是没问题的

35 楼 lovehzh 2010-09-09  
这方面的知识真的需要多留意一下。
34 楼 sunney2010 2010-09-09  
楼主的例子很好,值得学习,呵呵。谢谢了。
33 楼 makemyownlife 2010-09-08  
正在学习,楼主的交流精神值得佩服
32 楼 favey 2010-09-08  
恩,不错的例子,很有借鉴意义!
31 楼 zhyxfancy 2010-09-08  
peterwei 写道
基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置
Peter Wei


周日晚和GF的老乡们喝了五粮液,导致周一起不了床,只好请假在家睡觉。白天睡了半天,晚上自然睡不着觉。正好现在的项目中也用到了负载均衡和集群的东西,虽然有新手贴的危险,但还是手痒,决定写点东西,以备不时之需。也希望能对大家有所帮助。

第一章. 背景简介
对于大多数企业应用,都希望能做到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>节点下添加:

<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="auto"
<!—tcpListenPort如果是同一机器部署两个tomcat7应用,则修改tomcat7_b为4001,以免冲突. 不同机器下,不用更改此项。—>
                      [color=red]port="4000"[/color]
                      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>

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
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster Test</title></head>
<body>
<%
  //HttpSession session = request.getSession(true);
  System.out.println(session.getId());
  out.println("<br> SESSION ID:" + session.getId()+"<br>");  
  // 如果有新的请求,则添加session属性
  String name = request.getParameter("name");
  if (name != null && name.length() > 0) {
     String value = request.getParameter("value");
     session.setAttribute(name, value);
  }  
	out.print("<b>Session List:</b>");  
	Enumeration<String> names = session.getAttributeNames();
	while (names.hasMoreElements()) {
		String sname = names.nextElement(); 
		String value = session.getAttribute(sname).toString();
		out.println( sname + " = " + value+"<br>");
        System.out.println( sname + " = " + value);
   }
%>
  <form action="testCluster.jsp" method="post">
    名称:<input type=text size=20 name="name">
     <br>
    值:<input type=text size=20 name="value">
     <br>
    <input type=submit value="提交">
   </form>
</body>
</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文件
稍前面加上
# 监听端口和监听地址
Listen 8000

2. conf/httpd.conf,去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(proxy)模块。
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_ftp_module modules/mod_proxy_ftp.so  
LoadModule proxy_http_module modules/mod_proxy_http.so 


3. conf/httpd.conf文件最后加上:
#虚拟机配置,负载均衡配置
<VirtualHost *:8000>
	ServerAdmin weigbo@163.com
	ServerName localhost
	ServerAlias localhost
	#小心,有些地方要有空格,要不然会出错哈哈。
	ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
	ProxyPassReverse / balancer://cluster/
	#ErrorLog "logs/error.log"
	#CustomLog "logs/access.log" common
</VirtualHost> 

#The ProxyRequests directive should usually be set off when using ProxyPass.
ProxyRequests Off
<proxy balancer://cluster>
	BalancerMember ajp://localhost:8009 loadfactor=1 route=tomcat7_a  smax=5 max=20 ttl=120 retry=300 timeout=15
	BalancerMember ajp://localhost:9009 loadfactor=1 route=tomcat7_b  smax=5 max=20 ttl=120 retry=300 timeout=15
	# status=+H为配置热备,当所有机器都over时,才会请求该机器
	#BalancerMember http://192.168.1.218:8009 status=+H
	ProxySet lbmethod=bytraffic
</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




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


30 楼 wdq 2010-09-08  
看帖,回帖是一种美德!多谢分享
29 楼 zzy9zzy 2010-09-08  
<div class="quote_title">peterwei 写道</div>
<div class="quote_div">
<div class="quote_title">Memcached本身也是可以做集群的,但据我所知,memcached是存在内存中的,某台机器over后,数据是不存在了的,因为memcached并没有持久化。而且每个memcached服务器间的数据不共享。你说的<span style="color: #ff0000;">通过session备份的方式解决</span>,是指什么?愿听高见。</div>
</div>
<p><br>阿拉也是这个意思,怎么通过session备份的方式解决呢?学习……</p>
28 楼 peterwei 2010-09-08  
<div class="quote_title">dxm1986 写道</div>
<div class="quote_div">
<div class="quote_title">peterwei 写道</div>
<div class="quote_div">
<div class="quote_title">zzy9zzy 写道</div>
<div class="quote_div">
<div class="quote_title">JE帐号 写道</div>
<div class="quote_div">一直觉得,既然系统都需要搞负载均衡了,却还要搞Session复制,是有些矛盾的选择.适用于这个做法的场景应该是客户请求比较耗CPU,但是实际请求数量并不大的情况吧.<br><br>第三点"基于Cache的集中式Session",具体是指什么?<br>
</div>
<br><br>Session复制与负载均衡关系不大,主要是为了实现失败转移的,当一个服务器坏了的时候自动将客户请求转移到另外一个服务器。<br><br>“基于Cache的集中式Session”,我大概理解就是类似用Memcache集中管理Session的做法,这样做可以提高集群效率,便于失败转移的实施。</div>
<br>1.session复制是为了高可用性,就是解决fail-over的情况,而负载均衡是为了分担服务器的压力。<br>2.session复制的方式性能较差,一般适合于企业内部应用,就是简单的双机,多机互备的需要。不大适合于大型互联网应用集群。而session sticky的方式无法保证fail-over.所以有了集中式的Cache Session,用来代替本地Session.也就是将session集中到一台/一组独立的session服务器上,确保应用服务器无状态,是一种不错的实现应用服务器水平扩展的方法。比如楼上说的用MemCached,其本身(Session服务器)也是支持水平扩展的。<br>
</div>
<p> </p>
<p>用Memcached集中管理Session方式虽然比这种复制session更高效,但如果memcached运行在单台机器上时,如果该机器挂掉,系统所有的登录用户将会变成未登录状态,所以要处理好这种可能发生的突发灾难。可以通过memcached集群,通过session备份的方式解决。</p>
</div>
<p>Memcached本身也是可以做集群的,但据我所知,memcached是存在内存中的,某台机器over后,数据是不存在了的,因为memcached并没有持久化。而且每个memcached服务器间的数据不共享。你说的<span style="color: #ff0000;">通过session备份的方式解决</span>,是指什么?愿听高见。</p>
27 楼 smallhand 2010-09-08  
如此多的技术,只能说学习了。。。
26 楼 beowulf1985 2010-09-08  
有意思,mark
25 楼 zzy9zzy 2010-09-08  
<div class="quote_title">dxm1986 写道</div>
<div class="quote_div">
<p>用Memcached集中管理Session方式虽然比这种复制session更高效,但如果memcached运行在单台机器上时,如果该机器挂掉,系统所有的登录用户将会变成未登录状态,所以要处理好这种可能发生的突发灾难。可以通过memcached集群,通过session备份的方式解决。</p>
</div>
<p><br>因为memcache的集群方式好像有点特殊,是通过客户端算法平衡发送session到各个memcache节点,并没有复制session,也就是说每个memcache节点都有互不相同的session实例。</p>
<p> </p>
<p>请教一下,如果用memcache管session,怎么通过memcache集群的方式做session备份?或者有其他的备份方式?</p>
24 楼 pgy20032000 2010-09-08  
顶 标记一下
23 楼 CoderJ 2010-09-08  
mark
22 楼 melin 2010-09-08  
这种方案可以做到高可用:
http://melin.iteye.com/admin/blogs/698521
21 楼 dxm1986 2010-09-08  
<div class="quote_title">peterwei 写道</div>
<div class="quote_div">
<div class="quote_title">zzy9zzy 写道</div>
<div class="quote_div">
<div class="quote_title">JE帐号 写道</div>
<div class="quote_div">一直觉得,既然系统都需要搞负载均衡了,却还要搞Session复制,是有些矛盾的选择.适用于这个做法的场景应该是客户请求比较耗CPU,但是实际请求数量并不大的情况吧.<br><br>第三点"基于Cache的集中式Session",具体是指什么?<br>
</div>
<br><br>Session复制与负载均衡关系不大,主要是为了实现失败转移的,当一个服务器坏了的时候自动将客户请求转移到另外一个服务器。<br><br>“基于Cache的集中式Session”,我大概理解就是类似用Memcache集中管理Session的做法,这样做可以提高集群效率,便于失败转移的实施。</div>
<br>1.session复制是为了高可用性,就是解决fail-over的情况,而负载均衡是为了分担服务器的压力。<br>2.session复制的方式性能较差,一般适合于企业内部应用,就是简单的双机,多机互备的需要。不大适合于大型互联网应用集群。而session sticky的方式无法保证fail-over.所以有了集中式的Cache Session,用来代替本地Session.也就是将session集中到一台/一组独立的session服务器上,确保应用服务器无状态,是一种不错的实现应用服务器水平扩展的方法。比如楼上说的用MemCached,其本身(Session服务器)也是支持水平扩展的。<br>
</div>
<p> </p>
<p>用Memcached集中管理Session方式虽然比这种复制session更高效,但如果memcached运行在单台机器上时,如果该机器挂掉,系统所有的登录用户将会变成未登录状态,所以要处理好这种可能发生的突发灾难。可以通过memcached集群,通过session备份的方式解决。</p>

相关推荐

    基于mod_proxy+Apache_2.2.16+Tomcat_7的负载均衡与集群配置

    基于mod_proxy+Apache_2.2.16+Tomcat_7的负载均衡与集群配置

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

    NULL 博文链接:https://kakaluyi.iteye.com/blog/759637

    Mod_Proxy+Apache+Tomcat负载均衡与集群配置

    在当今的企业级应用中,确保系统的高可用性和稳定性是至关重要的。这通常通过建立集群来实现,即通过部署多台服务器来提供相同的服务,以此来...这样,就完成了整个Mod_Proxy+Apache+Tomcat负载均衡与集群的配置过程。

    负载均衡mod_jk及mod_proxy方式

    window下完整的apache+mod_jk或mod_proxy+tomcat配置方案,用于负载均衡及动静态页面分离。里面包含有相对应版本的apache、tomcat、mod_jk,已经多个参考文档

    apache代理mod_proxy、mod_proxy_http代理模块库包下载(32位windows\linux版本).txt

    该软件包是apache的httpd中mod_proxy.so、mod_proxy_http.so代理模块,分别对应包含linux、windows的版本。

    Apache+tomcat实现负载均衡

    7. **配置Tomcat**:在后端的每个Tomcat服务器上,你可能需要调整`server.xml`文件中的`Connector`配置,以允许来自Apache的代理请求。通常,这意味着将`Connector`的`protocol`属性设置为`AJP/1.3`或`HTTP/1.1`,并...

    apache+tomcat负载均衡_proxy模式

    内附完整配置教程和修改后的apache的httpd.conf文件和tomcat的server.xml配置文件,包含test测试项目,不包含apache和tomcat安装文件。 本教程参考网上资料,本机测试成功,如有问题可以私信说明。

    apache tomcat mod_proxY参数

    总之,`mod_proxy` 是 Apache 服务器与 Tomcat 或其他后端服务交互的重要工具,通过它可以实现灵活的负载分发、故障转移和安全控制,对于构建高可用和高性能的 Web 应用架构至关重要。正确理解和配置 `mod_proxy` ...

    Apache2.2 tomcat-6.0.18负载均衡与集群

    总结起来,"Apache2.2 tomcat-6.0.18负载均衡与集群"是一个复杂但关键的架构,涉及到Apache的mod_proxy和mod_jk模块,以及Tomcat的集群配置。这个主题涵盖了如何利用这些工具和技术创建一个高可用、高性能的Web服务...

    Apache 与 Tomcat 配置负载均衡

    Apache 和 Tomcat 配置负载均衡是Web服务器和应用服务器协同工作以提高网站服务性能和可用性的技术。Apache 作为静态资源服务器,Tomcat 作为动态应用服务器,两者结合可以实现高效、可靠的Web服务架构。 首先,...

    Apache2.2和Tomcat7集成负载均衡(软件和教程)

    【Apache2.2和Tomcat7集成负载均衡】 在现代Web应用环境中,为了提供高可用性和性能优化,经常需要将HTTP服务器(如Apache)与应用服务器(如Tomcat)进行集成,并实现负载均衡。Apache2.2和Tomcat7的集成能够充分...

    Apache+tomcat负载均衡

    Apache通常通过其模块mod_proxy来实现负载均衡,它可以与Tomcat或者其他应用服务器进行集成。 在Apache中配置负载均衡,首先需要安装mod_proxy和mod_proxy_balancer模块。这些模块允许Apache作为反向代理服务器,...

    Apache+多个Tomcat 服务器集群配置

    将以下Module的注释去掉,这里并没有使用mod_jk.so进行apache和tomcat的链接,从2.X以后apache自身已集成了mod_jk.so的功能。只需简单的把下面几行去掉注释,就相当于以前用mod_jk.so比较繁琐的配置了。这里主要采用...

    基于apache的tomcat负载均衡与集群

    【Apache Tomcat 负载均衡与集群】 Apache Tomcat 是一个开源的、基于Java的Web应用服务器,常用于部署Servlet和JSP应用。在高并发或者需要高可用性的情景下,单一的Tomcat服务器可能无法满足需求,这时候就需要...

    Nginx-1_6_2+Memcached-1_2_6+Tomcat7负载均衡实现Session共享

    本文将详细讲解如何使用Nginx-1.6.2作为反向代理和负载均衡器,结合Memcached-1.2.6实现Session共享,并在Tomcat7应用服务器集群中部署此架构。 首先,Nginx是一款轻量级的Web服务器/反向代理服务器,以其高效、...

    tomcat+apache集群配置实例

    总结,配置Tomcat+Apache集群涉及多个步骤,包括安装和配置Apache和Tomcat,启用负载均衡,配置session复制,以及对集群进行持续监控和优化。通过这样的设置,可以提升Web应用的性能,增强系统的稳定性和容错能力。

    Apache与Tomcat整合教程(服务器负载均衡)

    通过配置mod_jk.conf,我们可以设置负载均衡策略,如轮询、最少连接数或基于IP哈希的策略。 2. **Mod_proxy_module**:另一种方法是使用Apache的Mod_proxy模块,它可以透明地将请求转发到Tomcat。Mod_proxy提供了...

    Nginx+tomcat配置集群负载均衡实例

    本实例将详细阐述如何通过Nginx配置集群负载均衡,以实现动静分离,提升系统性能和稳定性。 首先,Nginx是一款轻量级的Web服务器/反向代理服务器,以其高性能、稳定性以及低内存占用著称。它能处理静态文件请求,...

Global site tag (gtag.js) - Google Analytics