`

zz Tomcat负载均衡和集群环境的搭建

 
阅读更多

Tomcat负载均衡和集群环境的搭建:

魏超 2010331日星期三

 

注1:实现此集群的方法参考了网上的很多文章,但由于很多文章都表明是原创的,故无法知道整个操作流程的真正作者是谁。下面就是我用我们真实的项目去实现这个过程。同时修复这过程中一些问题。以下的所有步骤均为亲自测试,截图也是真实的。

 

注2:要完成集群和负载均衡配置,最简单步骤为完成所有标有下划线的操作。无下划线的部分为对操作的解释或是额外的说明。

 

1.   准备条件:

 

材料

本次搭建所用具体版本

Apache

Apache 2.2.15    (用于分发请求)

Tomcat  N

apache-tomcat-6.0.26.zip  2  (根据需求准备N个免安装的tomcat

Mod_jk

mod_jk-1.2.30-httpd-2.2.3.so (注意,这个需要和apache的版本匹配。2.2.3mod_jk用于匹配Apache 2.2.X版本)

用于部署的项目

Tlcom 1.2.6 sp3

 

 

材料

下载地址

Apache2.2

http://httpd.apache.org/download.cgi

Tomcat6.0.26

http://tomcat.apache.org/download-60.cgi

Mod_jk-1.2.30

http://tomcat.apache.org/download-connectors.cgi

 

 

2.   安装apache tomcat

 

apache安装到硬盘上, 然后将2tomcat解压。(这里的安装和解压不限定具体目录,安装和解压到某个目录下即可)。

这里我将apache2.2安装到D:\Apache Software Foundation\2tomcat也解压到同一个目录下。

接着检查apache是否能正常启动。



3.   apache 配置负载均衡

 

1取出下载的mod_jk-1.2.30-httpd-2.2.3.so。将其放置到Apache2.2\modules目录下。

2打开Apache2.2\conf\ httpd.conf文件。在其末尾添加上一行:

 

include "D:\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

 

即调用conf目录下的mod_jk.conf这个配置文件。当然,apache conf目录下原来是没有这个文件的。我们需要自己新建这个文件。

 

3conf目录下新建Mod_jk.conf内容如下:

 

#加载mod_jk Module

LoadModule jk_module modules/ mod_jk-1.2.30-httpd-2.2.3.so

#指定 workers.properties文件路径

JkWorkersFile conf/workers.properties

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

JkMount /*.jsp controller

 

2行中的mod_jk-1.2.30-httpd-2.2.3.so,就是我们之前放到modules目录下的那个.so文件。这里的名字就根据放进去的实际名字来写。版本不同,名字也就不一样。当然,mod_jk-1.2.30-httpd-2.2.3.so这个文件允许自己重命名。重命名后,只要在这里相应的配置上重命名后的名字,不会影响这个插件的功能。

 

4行中conf/workers.properties文件也是不存在的,也需要我们自己建立。这个文件的作用是对用于均衡负载的 负载器进行具体的登记。(比如我们用的2tomcat.换句话说,workers.properties就是对几个worker的登记表。我们的2tomcat就作为2worker被登记在这个文件中。而具体要如何进行登记,下面再具体说。

 

6行的作用就是配置apache对哪些请求进行转发。这里我按照网络上的教程,配置了对所有jsp页面的请求的转发。那么,当有jsp请求到达apache时,apache就会根据当时的负载情况,从worker中挑出负载低的那个worker,将这个jsp请求转发给他。(这里需要注意,当部署到tomcat上的项目有更多类型的请求的时候,需要在这里配置更多的请求规则)。而controller会在workers.peroperties中被配置。总的来说,转发规则的格式如下:

 

JkMount + 过滤请求类型 + 处理器

 

 

4)接着,我们conf目录下新建workers.properties内容如下:

 

worker.list = controller,tomcat1,tomcat2 #server 列表

#========tomcat1========

worker.tomcat1.port=8009 #ajp13 端口号,在tomcatserver.xml配置,默认8009

worker.tomcat1.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址

worker.tomcat1.type=ajp13 #定向包协议

worker.tomcat1.lbfactor = 1  #server的加权比重,值越高,分得的请求越多

worker.tomcat1.redirect = tomcat2

#========tomcat2========

worker.tomcat2.port=18009  #ajp13 端口号,在tomcatserver.xml配置,默认8009

worker.tomcat2.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址

worker.tomcat2.type=ajp13 #定向包协议

worker.tomcat2.lbfactor = 1  #server的加权比重,值越高,分得的请求越多

worker.tomcat2.redirect = tomcat1

#========controller,负载均衡控制器========

worker.controller.type=lb

worker.controller.balanced_workers=tomcat1,tomcat2  #指定分担请求的tomcat

worker.controller.sticky_session=1

 

第一行,worker.list,列出了worker的列表。Tomcat1, tomcat2就是我们为2tomcat的命名。而controller相当于包工头。他负责对2个(或者更多)的worker进行负载分配。在上面提到的Mod_jk.conf文件中配置的对jsp请求的处理器就是controller.在这里再由controller具体将任务分配给某一个tomcat.

下面几行就是分别对worker的配置。Port, host等属性都需要根据tomcat的实际配置来填。

实际上,这里对tomcat还有一个属性可以进行配置,即worker.tomcat2.activation = disabled 。就是对某一个tomcat的活动性进行禁用。这句配置的意思是,负载均衡启动的时候,其实负载都到tomcat1上面去。Tomcat2默认不参与负载。当tomcat1当掉的时候,通过worker.tomcat1.redirect = tomcat2 ,tomcat2就会自己启动起来,接替tomcat1继续工作。当然,这样就和负载均衡没有关系了。

 

5)到此,对apache的配置基本告一段落。如果集群中有更多的tomcat的话,请在worker.properties中进行配置。(注:当有6tomcat进行集群的时候,为了提高性能, worker.properties中的 redirectactivation就可以起到作用。我们可以对tomcat两两配对,两两互相设置redirect,两个其中一个设置activation. 形成3对,这样,就可以处理意外宕机的情况,保证6台集群可以继续运行下去。)

 

 

4.   Tomcat集群配置

2tomcat分别解压后,分别打开apache-tomcat-6.0.26 \conf\server.xml文件。

 

(1)  修改端口:

2tomcat, 为了避免端口冲突,其中一个端口使用默认的,而另一个得修改。必须修改的端口如下

 

 

 


 

 

 

以上3个地方都在前面加上一个“1.就可以避免2tomcat端口冲突。(注:这是tomcat6需要修改的端口。其他版本的tomcat可能不止要修改这些端口。总之冲突的端口均需要修改)

 

 

(2)  修改集群设置:

<Engine><Host>元素下添加以下内容均可。

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">

                     <Channel className="org.apache.catalina.tribes.group.GroupChannel">

            <Membership className="org.apache.catalina.tribes.membership.McastService"

                        address="224.0.0.1"

                        port="45564"

                        frequency="500"

                        dropTime="3000"/>

            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

                      address="auto"

                      port="4001"

                      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>

 

 

按照apache tomcat官方文档上面的说法,对于tomcat6要做集群的话,只需要将<Engine>元素下的

<!--

  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

-->

的注释符号去掉,启用这句配制就可以正常使用集群了。不过由于我搭建的测试环境2tomcat是在同一台机子上面,因此只启用这个<Cluster>的话,这个元素下的默认Receiver port就会冲突。因此必须补全这些配置。

另外,按照官方文档里说明的<Cluster>的默认配置,<Membership>元素下的address属性默认值为228.0.0.4 .  这个配置在我的系统上始终会出现2tomcat无法交换数据包的问题。需改成224.0.0.1才能正常使用。

需要而外注意的是2tomcat里添加到上面这段<Cluster>配置,其<Receiver>下的Port元素必需配置成不同的。如其中一个是4001,一个是4002.tomcat默认可以检测到40004100之间的端口)。

 

 

3修改<Engine>的属性。



 

 

2tomcat, jvmRoute分别配置成tomcat1tomcat2,即和apache/confworker.properites配置文件中配置的worker名称对应。

 

 

5.   Tlcom 集群配置:

 

(1)    修改tlcomweb.xml,添加 <Context distributable="true" />

 


 

 

所有需要集群的web项目,其web.xml中都必须添加<Context distributable="true" />

这个定义

 

(2)    tlcom分别部署到2tomcat中:

这里因为我沿用原来在tomcat上的开发方式,并不直接把项目放到tomcat/webapp目录下,而是通过rone.xmltlcom.xml两个配置文件放到apache-tomcat-6.0.26 A\conf\Catalina\localhost目录下

 

 


 

 

(3)    分别启动两个tomcat

可以在tomcat\bin目录下执行


 来启动,也可以通过在eclipse中先将server配置好(配置对应的2tomcat server),在eclipse中启动。

 

启动tomcat1:

 

和正常eclipse中启动一样,加载插件:

 

RONE初始化:

 

成功启动:

 

 


 

 

启动tomcat2:

启动过程和tomcat1一样,值得注意的是,在tomcat2启动的时候,tomcat1会打印出集群中加入member的提示:

 

 


 

(4)    启动apache.通过IP访问apache. 比如我的是  http://10.188.182.43 (这里80端口写不写是一样的)

你会发现可能RONE都登陆不了,或者登陆了页面都无法正常打开。原因在于我们一开始配置的Mod_jk.conf文件。文件末尾的请求转发。我们只转发了jsp页面的请求,就是说apache只会把jsp页面的请求转发到2tomcat上去。因此我们需要修改过滤的规则。我没有找到资料具体的各种规则应该怎么写,只能写一个大的过滤:

JkMount /* controller

JkMount /*.do controller

mod_jk.conf末尾改成上面这样。重启apache,你就可以看到RONE登陆界面了

 

(5)    测试:


 

我们进行一下传输配置的验证。可以看到tomcat2consol开始打印信息。那么这次操作负载均衡器就把请求发送到tomcat2上面去了。


 

验证完成


 

直接把tomcat2停止掉。可以在tomcat1的控制台中看到关于集群成员关闭的信息:

 

 


 

不要刷新页面,直接再次点击“全部验证”。可以看到,tomcat1上开始了验证业务。页面上没有出现异常,登陆用户的session也还在。业务处理透明地从tomcat2上转移到了tomcat1上去了。

 

 


 

 

 

 

6.   非本地访问apache

 我这里会出现本地可以正常通过http://10.188.182.43/rone/portal访问apache,而从别的PC无法访问的情况。经检查是windows防火墙的配置问题。当然,我们不能直接去禁用防火墙,只能为防火墙新建一条规则开放80端口在可信的网络域中。

分享到:
评论

相关推荐

    zookeeper linux集群搭建流程

    ZooKeeper Linux 集群搭建流程可以分为四步:下载和解压 ZooKeeper、创建目录和 myid 文件、修改 ZooKeeper 启动配置文件、启动 ZooKeeper 节点。通过这些步骤,可以成功搭建 ZooKeeper Linux 集群,满足分布式系统...

    nginx+tomcat集群实例

    "nginx+tomcat集群实例"是一种常见的Web服务架构,结合了Nginx的高效代理和负载均衡能力以及Tomcat对Java应用的良好支持。正确配置和管理这种架构,可以实现高并发、高可用的服务,满足大规模Web应用的需求。

    ZZ-2021030 网络搭建与应用赛项赛卷《网络环境》.pdf

    ZZ-2021030 网络搭建与应用赛项赛卷《网络环境》.pdf

    ZZ-2021030 网络搭建与应用赛项赛卷-网络搭建及安全部署竞赛报告单.pdf

    ZZ-2021030 网络搭建与应用赛项赛卷-网络搭建及安全部署竞赛报告单

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    ZZ-2022030网络搭建与应用全国职业院校技能大赛 赛项规程

    "ZZ-2022030网络搭建与应用全国职业院校技能大赛 赛项规程" 本赛项规程旨在选拔中等职业学校信息技术类网络搭建与应用方向优秀技术技能型人才,引领中职学校信息技术类专业建设与课程改革发展方向。该赛项通过真实...

    详解Nginx中的geo模块与利用其配置负载均衡的示例

    它以其高性能、高可靠性、以及易用性和灵活性而著称,常被用来作为负载均衡器使用。本文将详细解析Nginx中geo模块的作用、用法以及配置负载均衡的示例。 geo模块是Nginx的一个指令,它能够根据客户端的IP地址设置...

    将tomcat5.5 admin部署到 Tomcat7.0上

    在IT行业中,Tomcat是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web部分,包括Servlet和JSP规范。在本教程中,我们将探讨如何将Tomcat 5.5的admin应用部署到Tomcat 7.0上。这是一个常见的升级过程,...

    linux下java,tomcat,weblogic安装

    在Linux环境下搭建Java、Tomcat和WebLogic服务器是IT领域常见的任务,这涉及到操作系统管理、JVM配置、应用服务器的安装与部署等多个知识点。以下是对这些主题的详细讲解。 首先,我们从Java的安装开始。Java是运行...

    PHP开发工具与环境搭建

    ### PHP开发工具与环境搭建知识点概述 #### 一、PHP开发工具 **1.1 设计工具** - **ArgoUML**: Java编写的UML绘图工具,支持生成PHPstub,适合进行软件架构设计。 - **UmbrelloUML**: 需要在Unix/KDE环境下运行的...

    iOS开发环境搭建

    ### iOS开发环境搭建详解 #### 一、准备工作 在搭建iOS开发环境之前,我们需要进行一些必要的准备工作。首先,确保你的主机CPU支持Intel硬件虚拟化技术(IntelVT)。这是因为在虚拟机中安装macOS Snow Leopard...

    apache-tomcat-8.5.9

    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat ...

    ZZ-2022030 网络搭建与应用赛项正式赛卷.zip

    ZZ-2022030 网络搭建与应用赛项正式赛卷 2022-2023年的网络搭建与应用赛项赛题 参赛同学值得拥有

    在windows10系统中搭建Rust语言开发环境详细介绍

    ### 在Windows 10系统中搭建Rust语言开发环境详细介绍 #### 一、Rust语言简介 Rust是一门系统编程语言,它以其强大的安全特性而闻名,特别是针对并发安全问题有着独特的解决策略。该语言支持多种编程范式,包括...

    2024嵌入式面试资料嵌入式开发环境搭建

    在准备2024年的嵌入式面试过程中,掌握如何...通过以上内容的学习和理解,相信能够为准备2024年嵌入式面试的求职者们提供有力的支持,不仅能够成功搭建起自己的开发环境,还能够在面试中更加自信地展示自己的专业技能。

    ZZ-2021030 网络搭建与应用赛项赛卷《技能要求》.pdf

    ZZ-2021030 网络搭建与应用赛项赛卷《技能要求》

    2019年网络搭建与应用国赛样题1-设备部分完整参考答案

    2019年网络搭建与应用国赛样题1,完整操作及配置文件与防火墙截图已经具备,需注意的是,该样题交换机生成树部分是难点,其他相对简单。

Global site tag (gtag.js) - Google Analytics