Tomcat集群配置学习篇-----分布式应用

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

别担心,不管是目前IBM的webSphere还是大众化的tomcat服务器,都为我们提供了一种通用的解决方式,就是多台服务器来分担访问量,这样在一个服务器上的压力就会减小很多,你可以根据自己的需求去配置任意多的服务器来支撑你的应用系统,如果一台服务崩溃了,那么另外的应用服务器依然可以继续支持应用继续服务。多应用服务器的简单流程图大致如下:

为了实现这个原理我们就需要解决两个问题:

1:如何实现多应用服务器间的session共享:(一台服务器崩溃,另外一台服务器可以继续支持)

2:如何分发请求到各个应用服务器实现压力分解:(这里的解决方案是用apache做 web服务器)

下面我们就是实际行动来看看如何实现这种实现。

环境配置:

App应用服务器apache-tomcat-7.0.52-1

web服务器:apache的apache 2.0.55

java环境:jdk1.6

系统环境:winxp系统

1) web服务器配置

首先安装apache的web服务器:

apache服务器和tomcat的连接方法其实有三种:mod_JK、http_proxy和ajp_proxy。

一:软件环境    1. Apache: apache 2.0.55 (由http://httpd.apache.org/进入下载)(点击下载apache 2.0.55)    2. Tomcat: apache-tomcat-7.0.52-1    3. mod_jk: 在页面 http://tomcat.apache.org/   Download 标题下找到 Tomcat Connectors 链接进入(点击下载mod_jk-apache-2.0.55.so),看起来像是个Unix/Linux下的动态库,实际应是个Win32  的 DLL 动态库,大概是为保持不同平台配置的一致性,才用了这个扩展名。

二:负载均衡  用Apache进行分流,把请求按照权重以及当时负荷分tomcat1,tomcat2...去处理
1. 安装apache,tomcat    我把Apache安装在D:/Apache Group/Apache2   解压两分Tomcat, 分别在 D:/Apache Group/apache-tomcat-7.0.52-1,D:/Apache Group/apache-tomcat-7.0.52-1
2.修改Apache配置文件http.conf    在apache安装目录下conf目录中找到http.conf,在文件最后加上下面一句话就可以了
   include conf/mod_jk.conf

3. http.conf 同目录下新建mod_jk.conf文件,内容如下

[html] view plaincopyprint?

  1. #加载mod_jk Module
  2. LoadModule jk_module modules/mod_jk-apache-2.0.55.so
  3. #指定 workers.properties文件路径
  4. JkWorkersFile conf/workers.properties
  5. #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
  6. JkMount /*.jsp controller
#加载mod_jk Module
LoadModule jk_module modules/mod_jk-apache-2.0.55.so   

#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties   

#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount /*.jsp controller  

如果还要指定*.do也进行分流就再加一行 JkMount /*.do controller
如果你想对所有的请求进行分流只需要写成 JkMount /* controller

4. 在http.conf同目录下新建 workers.properties文件

[html] view plaincopyprint?

  1. worker.list = controller,tomcat1,tomcat2  #server 列表
  2. #========tomcat1========
  3. worker.tomcat1.port=8019       #ajp13 端口号,在tomcat下server.xml配置,默认8009
  4. worker.tomcat1.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址
  5. worker.tomcat1.type=ajp13
  6. worker.tomcat1.lbfactor = 1    #server的加权比重,值越高,分得的请求越多
  7. #========tomcat2========
  8. worker.tomcat2.port=8029       #ajp13 端口号,在tomcat下server.xml配置,默认8009
  9. worker.tomcat2.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址
  10. worker.tomcat2.type=ajp13
  11. worker.tomcat2.lbfactor = 2    #server的加权比重,值越高,分得的请求越多
  12. #========controller,负载均衡控制器========
  13. worker.controller.type=lb
  14. worker.controller.balanced_workers=tomcat1,tomcat2   #指定分担请求的tomcat
  15. worker.controller.sticky_session=1
worker.list = controller,tomcat1,tomcat2  #server 列表
#========tomcat1========
worker.tomcat1.port=8019       #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1    #server的加权比重,值越高,分得的请求越多    

#========tomcat2========
worker.tomcat2.port=8029       #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 2    #server的加权比重,值越高,分得的请求越多    

#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2   #指定分担请求的tomcat
worker.controller.sticky_session=1

5. 修改tomcat配置文件server.xml 如果你是水平集群,即在不同电脑上安装tomcat,tomcat的安装数量为一个,可以不必修改tomcat配置文件.我这里是在同一台电脑上安装两个tomcat,实现的是垂直集群方式,所以必须修改其中一个的设置,以避免端口冲突,按照参考文章是把原来以9开头的端口号改为以9开头端口号,但是在我机器上如果以9开头的端口号,例如9080、9082会与我的WebSphere Application Server配置冲突,所以我这里采取的策略是把原来端口号的第三位改为1,如8080改为8180。
打开tomcat2/conf/server.xml文件
1) 将关闭Tomcat的监听端口改成由8005改为8105 即把  <Server port="8005" shutdown="SHUTDOWN"> 改为  <Server port="8105" shutdown="SHUTDOWN">
2) 把http服务端口号由8080改为8180 找到  <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->     <CONNECTOR port="8080" 把这里的8080改为8180
3) 把AJP端口号由8009改为8109 找到  <!-- Define an AJP 1.3 Connector on port 8009 -->     <CONNECTOR port="8009" 把这里的8009改为8109 4) 把 HTTP 代理端口从8082改为8182(这个配置默认是被注释掉的,可跳过这一步) 找到 <CONNECTOR port="8082" 把这里的8082改为8182 5) 编写一个测试 jsp 建立一个目录TestCluster,里面新建一个test.jsp,内容为

<%
System.out.println("===========================");
%> 把TestCluster放到tomcat1,tomcat2的webapps下
6) 启动apache,tomcat1,tomcat2,进行测试 通过 http://localhost/TestCluster/test.jsp 访问,多刷新几次页面,查看Tomcat1和Tomcat2的窗口,你将可以看到打印了一行行"===========================",并且从统计上来说,大约在tomcat2打印的数量是在Tomcat1中的两倍,可以看到请求会被tomcat1,tomcat2按照不同的权重分流处理,实现了负载均衡。
作下面的集群配置,请在workers.properties把tomcat1和tomcat2的权重改为一样的,使请求较平均分配,将有便于看到实验的效果。

首先配置web应用服务器配置tomcat-A配置

1:修改tomcat的server.xml文件增加如下内容

贴出代码,方便复制:

[html] view plaincopyprint?

  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
  2. channelSendOptions="6">
  3. <Manager className="org.apache.catalina.ha.session.BackupManager"
  4. expireSessionsOnShutdown="false"
  5. notifyListenersOnReplication="true"
  6. mapSendOptions="6"/>
  7. <Manager className="org.apache.catalina.ha.session.DeltaManager"
  8. expireSessionsOnShutdown="false"
  9. notifyListenersOnReplication="true"/>
  10. <Channel className="org.apache.catalina.tribes.group.GroupChannel">
  11. <Membership className="org.apache.catalina.tribes.membership.McastService"
  12. bind="127.0.0.1"
  13. address="228.0.0.4"
  14. port="45564"
  15. frequency="500"
  16. dropTime="3000"/>
  17. <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
  18. address="127.0.0.1"
  19. port="4001"
  20. selectorTimeout="100"
  21. maxThreads="6"/>
  22. <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
  23. <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
  24. </Sender>
  25. <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
  26. <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  27. <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
  28. </Channel>
  29. <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
  30. filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
  31. <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
  32. </Cluster>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                   channelSendOptions="6">  

            <Manager className="org.apache.catalina.ha.session.BackupManager"
                     expireSessionsOnShutdown="false"
                     notifyListenersOnReplication="true"
                     mapSendOptions="6"/>
            <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"
                          bind="127.0.0.1"
                          address="228.0.0.4"
                          port="45564"
                          frequency="500"
                          dropTime="3000"/>
              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                        address="127.0.0.1"
                        port="4001"
                        selectorTimeout="100"
                        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"/>
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
            </Channel>  

            <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>  

            <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>  

备注:

1) App应用服务器tomcat-B配置和tomcat-A基本相同,但需要注意的是两台服务器如果在一个电脑上就需要注意端口的冲突问题,比如:tomcat-A的端口是8080,那么tomcat-B就是8081或者其他,其他的以此类推

我这里这里的端口配置如下:

tomcat-1:serverport:8081   ajp/1.3connector:8019  <Server port="8015" shutdown="SHUTDOWN">

tomcat-2:serverport:8082   ajp/1.3connector:8029  <Server port="8025" shutdown="SHUTDOWN">

2) 然后就是新建一个web应用测试一下,在新建应用的web.xml里面需要加上

<distributable/>

3) 到这里就可以测试你的配置了,先启动tomcat-1,然后启动tomcat-2,如果你在两个控制台里面看到类似的如下信息

证明两台应用服务器已经配置完成了。

4) 新建web应用,web.xml配置文件里面需要添加如下内容来配合实现session共享:

<distrbutable/>

然后将应用分别部署到两台服务器,启动两台应用服务器进行测试:

注:由于jsp自带session对象,所以在测试的时候最好把页面自带的session对象关闭后再测试,关闭代码<%@ page session="false"%>

Tomcat-A  index.jsp代码:

<body>

This is my JSP page.tomcat-A <br>

<%

HttpSession mysession = request.getSession(false);

if(mysession==null){

mysession = request.getSession(true);

mysession.setAttribute("appname","value-A");

out.println("new session:"+mysession.getId());

}else{

out.println("old session:"+mysession.getId());

}

out.println("appname="+mysession.getAttribute("appname"));

%>

</body>

Tomcat-B  index.jsp代码:

<body>

This is my JSP page.tomcat-B<br>

<%

HttpSession mysession = request.getSession(false);

if(mysession==null){

mysession = request.getSession(true);

mysession.setAttribute("appname","value-A");

out.println("new session:"+mysession.getId());

}else{

out.println("old session:"+mysession.getId());

}

out.println("appname="+mysession.getAttribute("appname"));

%>

</body>

5) 分别访问两台服务器:http://172.23.1.46:8081/mycluster

http://172.23.1.46:8082/mycluster分别访问得到结果如下就证明配置可以了。

访问8081服务器:

页面刷新后结果如下:

访问8082服务器:

页面刷新后结果如下:

到这里tomcat服务器就配置完成了,接下来就需要配置统一入口的负载均衡的web服务器,这里用的是apache 2.2.19(官网上可以直接下载)

时间: 2024-11-02 08:59:14

Tomcat集群配置学习篇-----分布式应用的相关文章

转载 Tomcat集群配置学习篇-----分布式应用

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

java集群优化——Nginx+tomcat集群配置-理论篇

我们了解一个道理,就是数据的增长是我们必然面对的问题,因为在技术日益变化的当下,我们收集数据的方式和存储及处理技术不断升级,迫使我们面对这一问题,并且,在数据挖掘日益火热的今天,我们也要对这样的问题加以重视,改变在所难免! 我们曾经想过,在极致优化的情况下,一台普通服务器,是可以挖掘出无穷的潜力的,我的们的确曾做到这一点,用一台2万元的设备,承载了同时1万余人的并发,但是随着技术的衍生,我们需要更灵活地处理应用,我们需要更及时的响应速度,我们需要实时地对数据进行分析和处理!这时,我们必然接触一个

Tomcat集群配置--负载均衡

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

Apache+Tomcat集群配置

本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache[下载地址] 企业框架源码 Apache是http服务器,我们利用其对Tomcat进行负载均衡.目前最新版本为2.2.17,下载地址为http://httpd.apache.org/download.cgi#apache22.如下图: 目前已经出现Apache2.3.11,但是为beta版本,所以没有使用. 下载后直接

Apache + Tomcat集群配置详解 (1)

一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://tomcat.apache.org/download-60.cgi,下载Tomcat 6.0.18 zip文件 注意:由于Apache和Tomcat项目与集群相关的模块均处于持续发展和优化过程中,因此笔者不保证本文配置方法对所有Apache和Tomcat版本均适用. 二.软件安装 把Apache安装为运

Apache + Tomcat集群配置详解

Apache + Tomcat集群配置详解 一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://tomcat.apache.org/download-60.cgi,下载Tomcat 6.0.18 zip文件 注意:由于Apache和Tomcat项目与集群相关的模块均处于持续发展和优化过程中,因此笔者不保证本文配置方法对所有Apache和Tomcat版本均

nginx+tomcat集群配置(1)---根目录设定和多后端分发配置

前言: 对于javaer而言, nginx+tomcat集群配置, 已然成了web应用部署的主流. 大公司如此, 小公司亦然. 对于个人开发者而言, 资源有限, 往往多个web应用混部于一台服务器(云主机), 如何隔离访问这些服务资源? 彼此又不影响呢? nginx来为你排忧解难, ^_^. 本文将介绍tomcat的简单配置和部署, 以及nginx作为反向代理, 如何分流. 基础架构: 不成文的约定: 1). 一个tomcat容器部署一个webapp应用实例 2). url根目录访问webapp

Nginx+Memcached+Tomcat集群配置

1.   Nginx Nginx是通过将多个Web Server绑定到同一个IP地址下,以实现多个WebServer间的负载均衡,降低单个Web Server的负荷,以提高整体的性能与稳定性. 安装和配置Nginx的简单方式如下: 1)      下载并解压Nginx到本地目录:http://nginx.org/en/download.html 2)      对Nginx的配置主要是对它的配置文件/conf/nginx.conf的修改.如下链接是nginx.conf配置文件各个属性的详细说明:

nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路

前言: nginx中有一块很重要的概念, 就是rewrite规则. 它会对URL进行修改, 然后进行内部的重定向. rewrite授予了nginx更多的自由, 使得后级服务的接入更加地方便. 本文将简单讲述nginx的rewrite规则和原理, 同时讲解下如何借助rewrite实现单tomcat实例/多Web App服务 对应的多域名根目录访问. 案列目标: 首先来谈一下之前对于多Web App服务对应多域名根目录访问的方案. 注: 一个域名对应一个tomcat实例, 一个tomcat实例只包含