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

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

 
阅读更多

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

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

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


 

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

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

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

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

环境配置:

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

web服务器:apacheapache 2.0.55

java环境:jdk1.6

系统环境:winxp系统

 

1) web服务器配置

首先安装apacheweb服务器:

apache服务器和tomcat的连接方法其实有三种:mod_JKhttp_proxyajp_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 plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #加载mod_jk Module     
  2. LoadModule jk_module modules/mod_jk-apache-2.0.55.so     
  3.     
  4. #指定 workers.properties文件路径     
  5. JkWorkersFile conf/workers.properties     
  6.     
  7. #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器     
  8. JkMount /*.jsp controller    

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

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

 


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

 

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  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.      
  8. #========tomcat2========      
  9. worker.tomcat2.port=8029       #ajp13 端口号,在tomcat下server.xml配置,默认8009      
  10. worker.tomcat2.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址      
  11. worker.tomcat2.type=ajp13      
  12. worker.tomcat2.lbfactor = 2    #server的加权比重,值越高,分得的请求越多      
  13.      
  14. #========controller,负载均衡控制器========      
  15. worker.controller.type=lb      
  16. worker.controller.balanced_workers=tomcat1,tomcat2   #指定分担请求的tomcat      
  17. 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:修改tomcatserver.xml文件增加如下内容

 

贴出代码,方便复制:

 

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



 

备注:

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

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

tomcat-1:serverport8081   ajp/1.3connector8019  <Server port="8015" shutdown="SHUTDOWN">

tomcat-2serverport8082   ajp/1.3connector8029  <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-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    总结起来,Tomcat-Redis-Session-Manager通过整合Redis和Tomcat,实现了高效、可靠的session管理,特别适用于需要处理高并发和分布式部署的Web应用。其提供的jar包简化了集成过程,让开发者能快速地在Tomcat7和...

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    在IT行业中,尤其是在Web...通过这种方式,你可以构建一个高可用、可扩展的Tomcat集群,同时利用Redis的强大功能来处理Session管理,提升Web应用的服务质量和用户体验。这种架构尤其适用于高并发、高流量的Web应用。

    tomcat-redis-session-manager包集合下载(tomcat8)

    默认情况下,Tomcat将session数据存储在服务器内存中,但这种方法在高并发和分布式环境下可能不够高效,因为session数据无法在集群中的多个节点之间共享。 **知识点二:Redis介绍** Redis是一个高性能的键值对数据...

    tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x

    在集群配置中,多个Tomcat实例可以协同工作,提供高可用性和负载均衡。通过连接器,HTTPD能够将请求分发到不同的Tomcat实例,当某个实例出现问题时,其他实例可以继续提供服务,确保服务的连续性。 Tomcat连接器的...

    tomcat-redis-session-manager

    此外,为了确保高可用性,可以考虑在Redis集群上运行`tomcat-redis-session-manager`,这样即使某个Redis节点故障,session数据也不会丢失,服务仍能正常运行。 总的来说,`tomcat-redis-session-manager`是应对...

    session 共享 tomcat-redis-session-manager 所需要的jar (绝对可用)

    总结来说,这个压缩包提供了一套完整的解决方案,包括了连接Redis的Jedis客户端、对象池管理、Tomcat的Session管理器以及配置文件,使得开发者可以轻松地在Tomcat集群中实现Session共享,提升系统的可扩展性和容错性...

    tomcat-redis-session-manager-1.2-tomcat-6&7

    3. **配置`context.xml`**:在Tomcat的`context.xml`或每个Web应用的`WEB-INF/web.xml`中配置`Manager`元素,指定使用Redis Session Manager。 4. **设置连接配置**:配置Redis服务器的IP地址、端口、密码等信息。 5...

    redis-tomcat8以上集群所需要的jar :tomcat-redis-session-manager-master 等

    配置完成后,启动Tomcat集群,每个节点都会使用Redis作为Session存储。当一个用户在集群中的任一节点创建Session后,该Session信息会被持久化到Redis中。其他节点在处理同一用户的请求时,能够从Redis中获取并使用该...

    tomcat-redis-session-manager-tomcat-7.zip

    2. **下载和配置Tomcat-Redis-Session-Manager**:获取`tomcat-redis-session-manager-tomcat-7`压缩包,并将其解压到Tomcat的`lib`目录下。这个库包含了Tomcat的Redis会话管理器实现。 3. **修改Tomcat配置**:在`...

    分布式集群Session共享 简单多tomcat8+redis的session共享实现

    随着互联网应用的复杂性和用户量的增长,单个服务器往往无法满足需求,因此采用分布式部署的模式,比如多台Tomcat服务器组成的集群,成为普遍选择。然而,这种部署方式会带来Session管理的挑战,因为Session数据通常...

    tomcat-redis-session-manager.zip

    标题 "tomcat-redis-session-manager.zip" 涉及到的是一个用于在多个Tomcat服务器之间实现Session共享的解决方案,利用了Redis作为分布式缓存系统。这个压缩包包含了一系列的JAR文件,这些文件主要用于支持Tomcat ...

    apache-tomcat-8.0.17-windows-x64.zip

    5. **Cluster**:在集群环境中,Tomcat支持应用的分布式部署,能够实现会话复制和故障转移,提高可用性和可扩展性。 6. **Connector**:Tomcat支持多种连接器,如HTTP、AJP等,用于与Web服务器集成,如Apache ...

    apache-tomcat-7.0.47-memcached-各种序列化策略-session共享

    以上就是关于"apache-tomcat-7.0.47-memcached-各种序列化策略-session共享"的知识点,涵盖了Tomcat集群、Memcached的使用以及多种序列化策略的应用。通过深入理解和实践这些技术,你可以构建出高可用、高性能的Web...

    apache-tomcat-8.5.55.zip 集成 tomcat-cluster-redis-session-manager 4.0

    这个集成意味着Tomcat已经配置了使用Redis作为会话管理器的集群解决方案。 会话管理是Web应用程序中的关键部分,它允许服务器跟踪用户在网站上的活动。默认情况下,Tomcat使用内存中的会话管理器,但这种方式在...

    tomcat-cluster-redis-session-manager.zip

    标题中的"tomcat-cluster-redis-session-manager.zip"表明这是一个与Tomcat集群和Redis Session管理相关的压缩包。这个压缩包可能是为了帮助用户在Tomcat 7或8版本中配置和使用Redis作为Session存储,以实现跨服务器...

    tomcat-redis-session-manager-master.zip

    Tomcat作为广泛使用的Java应用服务器,其session管理机制是开发者必须掌握的关键技能之一。本文将围绕“tomcat-redis-session-manager-master.zip”这个压缩包中的源码,深入探讨如何使用Redis实现Tomcat的session...

    nginx集群用tomcat-redis-session-manager和commons-pool2-2.4.2和jedis-2.7.2

    总结来说,这个配置方案通过整合`nginx`、`Tomcat`、`Redis`和相关的Java库,实现了高效、可靠的Web应用集群部署,确保了Session数据的一致性和高可用性。通过合理配置和使用这些组件,可以大幅提升系统的可扩展性和...

    Nginx+Tomcat+Memcached-Session-Manager集群Session共享

    ### Tomcat集群的搭建与配置 为了实现Session共享,需要对多个Tomcat实例进行配置: 1. 复制Tomcat实例,创建多个Tomcat服务节点。 2. 修改每个Tomcat实例的配置文件(server.xml),确保每个实例监听不同的端口。 3...

    Nginx+Tomcat+Memcached共享session集群配置

    ### Nginx+Tomcat+Memcached 共享 Session 集群配置 #### 一、概述 在大型分布式系统中,为了实现高可用性和负载均衡,常常会使用 Nginx 作为反向代理服务器来分发请求到后端多个 Tomcat 实例上。然而,传统的基于...

    tomcat集群配置文件

    当我们谈论“tomcat集群配置文件”时,我们指的是将多个Tomcat实例组织成一个集群,以提高应用程序的可用性和可伸缩性。在集群环境中,负载均衡、故障转移和资源共享是关键特性。 首先,要配置Tomcat集群,你需要...

Global site tag (gtag.js) - Google Analytics