实现此集群的方法参考了网上的很多文章,但由于很多文章都表明是原创的,故无法知道整个操作流程的真正作者是谁。下面就是我用我们真实的项目去实现这个过程。同时修复这过程中一些问题。以下的所有步骤均为亲自测试,并且是搭建成功的。 
而且下面有附件,是搭建符合均衡和集群所需材料,全部准备齐全。
 
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.3的mod_jk用于匹配Apache 2.2.X版本)
用于部署的测试项目 cms_gsics
材料 下载地址
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(一个.msi的安装包)安装到硬盘上, 然后将2个tomcat解压。(这里的安装和解压不限定具体目录,安装和解压到某个目录下即可)。

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

接着检查2个Tomcat,以及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目录下原来是没有这个文件的。我们需要自己新建这个文件。 
(3)在conf目录下新建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

# 设置日志存放路径   
JkLogFile logs/mod_jk.log 
# 设置日志级别 [debug/error/info]   
JkLogLevel info   
# 设置日志格式   
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"  
# JkOptions indicate to send SSL KEY SIZE,   
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories   
# JkRequestLogFormat set the request format   
JkRequestLogFormat "%w %V %T"

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

#JkMount /*.jsp controller 
JkMount /*.* controller 
#JkMount /*.do 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文件也是不存在的,也需要我们自己建立。这个文件的作用是对用于均衡负载的 负载器进行具体的登记。(比如我们用的2个tomcat).换句话说,workers.properties就是对几个worker的登记表。我们的2个tomcat就作为2个worker被登记在这个文件中。而具体要如何进行登记,下面再具体说。

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

JkMount + 过滤请求类型 + 处理器 
(4)接着,我们在conf目录下新建workers.properties内容如下:

workers.tomcat1_home=D:\tomcat1 
workers.tomcat1_home=D:\tomcat2 
workers.java_home=C:\Program Files\Java\jdk1.6.0_10\jre 
#路径分隔符 
ps=\ 
#server 列表(tomcat1,tomcat2为别名) 
worker.list = controller #模块版本

#worker.list = controller,Tomcat1,Tomcat2 #server 列表

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

worker.tomcat1.port=10009 #ajp13 端口号,在tomcat下server.xml配置,默认8009

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

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

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

#worker.tomcat1.redirect = Tomcat1

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

worker.tomcat2.port=20009  #ajp13 端口号,在tomcat下server.xml配置,默认8009

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

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

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

#worker.tomcat2.redirect = Tomcat2

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

worker.controller.type=lb

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

worker.controller.sticky_session=False

第一行,worker.list,列出了worker的列表。Tomcat1, tomcat2就是我们为2个tomcat的命名。而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中进行配置。(注:当有6个tomcat进行集群的时候,为了提高性能, worker.properties中的 redirect和activation就可以起到作用。我们可以对tomcat两两配对,两两互相设置redirect,两个其中一个设置activation. 形成3对,这样,就可以处理意外宕机的情况,保证6台集群可以继续运行下去。) 
4.   Tomcat集群配置

将2个tomcat分别解压后,用TC6_A,TC6_B 来区分下面的两个tomcat。 
(1)打开“ TC6_A ”文件夹下“ conf ”文件夹下的“ server.xml ”文件以及“ TC6_B ”文件夹下“ conf ”文件夹下的“ server.xml ”文件。 
提示:由于对各种网络端口及集群的配置内容都在 server.xml 文件中,因此想正确配置集群就需要修改各个 Tomcat 的 server.xml 配置文件。 
(2)找到 server.xml 配置文件中的“ Server ”配置项目,并进行修改。

<Server port="8005" shutdown="SHUTDOWN">

<Server port="10005" shutdown="SHUTDOWN">

<Server port="20005" shutdown="SHUTDOWN">

说明:第一行为两个 Tomcat 修改前的情况,第二行为 TC6_A Tomcat 修改后的情况,第三行为 TC6_B Tomcat 修改后的情况。 
(3)找到 server.xml 配置文件中的相应“ Connector ”配置项目,并进行修改。

修改前内容如下: 
<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />

TC6_A 中修改后内容如下:

<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port = " 10009 " protocol = "AJP/1.3" redirectPort = " 10043 " />

TC6_B 中修改后内容如下: 
<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port = " 20009 " protocol = "AJP/1.3" redirectPort = " 10043 " />

提示:此步骤目的是修改 AJP Connector 端口。 
(4) 
找到 server.xml 配置文件中的另一个相应“ Connector ”配置项目,并进行修改。

修改前内容如下: 
<Connector port = "8080" protocol = "HTTP/1.1"

connectionTimeout = "20000"

redirectPort = "8443" />

TC6_A 中修改后内容如下: 
<Connector port = " 10001 " protocol = "HTTP/1.1"

connectionTimeout = "20000"

redirectPort = " 10043 " />

TC6_B 中修改后内容如下: 
<Connector port = " 20001 " protocol = "HTTP/1.1"

connectionTimeout = "20000"

redirectPort = " 20043 " />

提示:此步骤目的是修改 HTTP Connector 端口,其中的“ 10001 ”与“ 20001 ”是未来通过浏览器访问集群中各个 Tomcat 实例的 HTTP 端口。 
(5)通过修改 Engine 配置选项,配置集群中每个 Tomcat 实例的名称。

修改前内容如下: 
<!-- You should set jvmRoute to support load-balancing via AJP ie :

<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = "jvm1">

-->

<Engine name = "Catalina" defaultHost = "localhost">

TC6_A 中修改后内容如下: 
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = " Tomcat1 ">

<!-- You should set jvmRoute to support load-balancing via AJP ie :

<Engine name = "Catalina" defaultHost = "localhost">

-->

TC6_B 中修改后内容如下: 
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = " Tomcat2 ">

<!-- You should set jvmRoute to support load-balancing via AJP ie :

<Engine name = "Catalina" defaultHost = "localhost">

-->

提示:请读者注意在修改过程中要注释掉原来 name 为 Catalina 的 Engine 配置项目,将 name 为 Standalone 的 Engine 配置项目的注释去掉并修改 jvmRoute 属性。 
(6)修改配置文件中的 Cluster 配置项目,对集群的各项参数进行设置。

修改前内容如下: 
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />

TC6_A 中修改后内容如下: 
<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="228.0.0.4"   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> 
TC6_B 中修改后内容如下: 
<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="228.0.0.4"     port="45564"    frequency="500"     dropTime="3000"/>

 <!-- Membership的address是组播地址,是固定的228.0.0.4 ,Receiver 那个的address是你的网络设置里面配的ip地址,不要用127.0.0.1 -->

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

address="auto"      port="4002"     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> 
测试项目集群配置:

(1)    修改cma_gsics项目WEB-INF下的web.xml,在<web-app></web-app>标签中添加 <distributable/>这句话

所有需要集群的web项目,其web.xml中都必须添加<distributable/>这个定义。

到此我们的集群和负载均衡已经搭建完毕,把我们的cma_gsics项目部署到两个tomcat中,然后依次启动两个tomcat,启动成功之后,在开始--所有程序---Apche HTTP 2.2.4 Server启动Apache(start Apache in Console),然后查看Apache安装路径下的conf文件夹下httpd.conf文件,找到 #Listen 12.34.56.78:80  Listen 127.0.0.1:81 查看我们绑定的IP地址和Apache的端口号,然后通过在浏览器输入:http://127.0.0.1:81来访问Apache,如果Apache启动成功,则进一步测试两个tomcat的负载均衡,http://127.0.0.1:81/cma_gsics/index.jsp查看可否正常访问到cma_gsics项目。然后再在cma_gsics中用servlet 写一个简单的登陆方法,在dopost中加入String sessionid = request.getSession().getId(); 
System.out.println(sessionid+"------------");,在登陆完毕提交的success.jsp页面不断刷新,查看后台输出信息,如果搭建成功的话,可以看到后台输出信息是两个tomcat轮流替换的效果,如果不是,则再根据出现问题进行调整。

来源:http://hechuanzhen.iteye.com/blog/1673425

Tomcat负载均衡和集群环境的搭建的更多相关文章

  1. 基于nginx的tomcat负载均衡和集群

    要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务器即可共享SESSION了. 你可以自己写tomcat的扩展来保存SESSI ...

  2. apache的tomcat负载均衡和集群配置 "

    略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务 ...

  3. 基于Apache的Tomcat负载均衡和集群(2)

    反向代理负载均衡 (Apache+JK+Tomcat) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方式 ...

  4. 基于apache的tomcat负载均衡和集群配置

    最近不是很忙,用零碎时间做点小小的实验. 以前公司采用F5负载均衡交换机,F5将请求转发给多台服务器,每台服务器有多个webserver实例,每个webserver分布在多台服务器,交叉式的分布集群. ...

  5. dubbo配置负载均衡、集群环境

    再用dubbo作为项目架构的时候,给consumer消费者用nginx提供了负载均衡策略和集群的实现, 但是想了下,consumer再多,但是提供者还是一个,最后还不都是落到了这一个provider上 ...

  6. linux下一个apache+tomcat负载均衡和集群

    先说一下我的环境 一个ubuntu虚拟机, 一个apache2.2示例 两tomcat1.7示例 1.安装apacheserver sudo apt-get install apache2 假设要重新 ...

  7. 使用apache和nginx代理实现tomcat负载均衡及集群配置详解

    实验环境: 1.nginx的代理功能 nginx proxy: eth0: 192.168.8.48 vmnet2 eth1: 192.168.10.10 tomcat server1: vmnet2 ...

  8. Apache、Tomcat负载均衡与集群

    一. 环境准备 1.软件下载 a) apache_2.0.55-win32-x86-no_ssl.msi: b) apache-tomcat-5.5.17.rar c) mod_jk-apache-2 ...

  9. apache + tomcat 负载均衡分布式集群配置

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

随机推荐

  1. 如何实现IOS_SearchBar搜索栏及关键字高亮

    搜索框的效果演示: 这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能. 我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示: // ...

  2. CTabCtrl控件标签的相关设置

    原文链接: http://blog.csdn.net/happyhell/article/details/6012177 1. 获得CTabCtrl标签高度:CRect rc; CTabCtrl *p ...

  3. 实现 Sunday 算法

    鉴于校园招聘笔试题,有个字符串模式匹配的问题,99+%都是暴力,偶尔一两个写KMP,但是明显是知其表不知其里.期待的 BM算法 或者 Sunday 没有出现!鉴于网友的回复,特此声明:我的代码假定字符 ...

  4. django 模板使用静态文件

    1.新建项目 2.新建app,并在install_app中添加该app 3.和app文件夹并列新建static.和TEMPLATES  文件夹,分别放静态文件和模板 4.setting.py中设置 T ...

  5. MySQL 数据库 分页查询

    在使用MySQL 进行数据库分页查询的时候最主要是使用LIMIT子句进行查询: 首先来看一下LIMIT: LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两 ...

  6. 分享九:php易混淆的语法

    一:php后期静态绑定 从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”:“后期绑定”意思说:static::不 ...

  7. ios 开源免费接口

    ios 开源免费接口 国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather. ...

  8. [Jobdu] 题目1391:顺时针打印矩阵

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2 ...

  9. Linux下修改时间时区的方法介绍

    点评:在Linux中,用于时钟查看和设置的命令主要有date.hwclock和clock.其中,clock和 hwclock用法相近,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件 ...

  10. NEXYS 3开发板练手--USB UART(二)

    上一篇文章中提到实际上我们操作的只是一个“伪”USB协议,我们真正需要完成的收发机遵循的协议应该是异步串行通信协议.这个协议对于大家来说应该是再熟悉不过了,在这里我就不多废话了.需要说明的是,我在这个 ...