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文件,内容如下

  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

如果还要指定*.do也进行分流就再加一行
JkMount /*.do controller

如果你想对所有的请求进行分流只需要写成
JkMount /* controller

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

  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

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,内容为

把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文件增加如下内容

贴出代码,方便复制:

  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>

备注:

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(官网上可以直接下载)

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

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

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  2. Apache负载均衡与Tomcat集群配置学习(Windows环境)

    本文主要参考自http://www.iteye.com/topic/985404?dhcc,经由实际操作配置操并记录而成. 由于最近的一个Java开发项目用到了Tomcat中间件作为web服务器,刚开 ...

  3. window xp Apache与Tomcat集群配置--转载

    转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...

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

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  5. (转)Apache+Tomcat集群配置

    本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是ht ...

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

    前言: nginx中有一块很重要的概念, 就是rewrite规则. 它会对URL进行修改, 然后进行内部的重定向. rewrite授予了nginx更多的自由, 使得后级服务的接入更加地方便. 本文将简 ...

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

    前言: 对于javaer而言, nginx+tomcat集群配置, 已然成了web应用部署的主流. 大公司如此, 小公司亦然. 对于个人开发者而言, 资源有限, 往往多个web应用混部于一台服务器(云 ...

  8. Linux+Apache+Tomcat集群配置

    参考: http://blog.csdn.net/bluishglc/article/details/6867358# http://andashu.blog.51cto.com/8673810/13 ...

  9. Nginx+Tomcat集群配置

    Nginx+Tomcat集群配置 一台虚拟机作为Nginx服务 两太虚拟机配置Tomcat+jdk环境 Nginx测试 启动: cd usr/local/nginx/sbin ./nginx ---& ...

随机推荐

  1. json序列化反序列

    json只能处理简单的数据类型:字典 列表等... 文件只能存字符串和二进制 序列化:把内存的对象变为字符串 反序列化:将字符串变回为内存对象

  2. Linux服务的安装与使用

    Spotlight on Unix 监控Linux服务器的安装与使用 详细请看:https://spotlight-on-unix.software.informer.com/download/#do ...

  3. Dataphin帮助企业构建数据中台系列之--萃取数据中心

    Dataphin作为阿里巴巴数据中台OneData (OneModel.OneID.OneService)方法论的产品载体,帮助企业构建三大数据中心:基于数据集成形成的垂直数据中心.基于数据开发沉淀的 ...

  4. project 计划添加编号或 任务分解时为任务添加编号

    [工具]-[选项]-[视图]-选择[显示大纲数字]-[确定]

  5. ARC093 F Dark Horse——容斥

    题目:https://atcoder.jp/contests/arc093/tasks/arc093_d #include<cstdio> #include<cstring> ...

  6. winform防止输入法对扫码的干扰

    把textbox的imemode的属性设为disable,就强制只能录入英文和半角符号,防止了中文输入法等的干扰. 参考:https://blog.csdn.net/jhycjhyc/article/ ...

  7. django-admin.py和manage.py的用法

    [简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ...

  8. php面试专题---6、正则表达式考点

    php面试专题---6.正则表达式考点 一.总结 一句话总结: 正则匹配步骤:1.先写出一个要匹配的字符串:2.自左向右的顺序使用正则表达式的原子和元字符进行拼接:3.最终加入模式修正符: 1.写出一 ...

  9. 原生js深拷贝函数

    function deepClone(data){ if(!data || !(data instanceof Object) || (typeof data=="function" ...

  10. Python字节码与解释器学习

    参考:http://blog.jobbole.com/55327/ http://blog.jobbole.com/56300/ http://blog.jobbole.com/56761/ 1. 在 ...