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

释放双眼,带上耳机,听听看~!

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版本)
用于部署的项目 Tlcom 1.2.6 sp3

1
1

 

 

材料 下载地址
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

1
1

 

 

2.   安装apache 和 tomcat

 

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

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

接着检查apache是否能正常启动。
Tomcat负载均衡和集群环境的搭建

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

#指定那些请求交给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文件也是不存在的,也需要我们自己建立。这个文件的作用是对用于均衡负载的 负载器进行具体的登记。(比如我们用的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内容如下:

 

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

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

worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.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 端口号,在tomcat下server.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就是我们为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分别解压后,分别打开apache-tomcat-6.0.26 \conf\server.xml文件。

 

(1)  修改端口:

2个tomcat, 为了避免端口冲突,其中一个端口使用默认的,而另一个得修改。必须修改的端口如下:
Tomcat负载均衡和集群环境的搭建

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

 

 

(2)  修改集群设置:

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
1&lt;Cluster className=&quot;org.apache.catalina.ha.tcp.SimpleTcpCluster&quot;&gt;
2
3                     &lt;Channel className=&quot;org.apache.catalina.tribes.group.GroupChannel&quot;&gt;
4
5            &lt;Membership className=&quot;org.apache.catalina.tribes.membership.McastService&quot;
6
7                        address=&quot;224.0.0.1&quot;
8
9                        port=&quot;45564&quot;
10
11                        frequency=&quot;500&quot;
12
13                        dropTime=&quot;3000&quot;/&gt;
14
15            &lt;Receiver className=&quot;org.apache.catalina.tribes.transport.nio.NioReceiver&quot;
16
17                      address=&quot;auto&quot;
18
19                      port=&quot;4001&quot;
20
21                      autoBind=&quot;100&quot;
22
23                      selectorTimeout=&quot;5000&quot;
24
25                      maxThreads=&quot;6&quot;/&gt;
26
27 
28
29            &lt;Sender className=&quot;org.apache.catalina.tribes.transport.ReplicationTransmitter&quot;&gt;
30
31              &lt;Transport className=&quot;org.apache.catalina.tribes.transport.nio.PooledParallelSender&quot;/&gt;
32
33            &lt;/Sender&gt;
34
35            &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.TcpFailureDetector&quot;/&gt;
36
37            &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor&quot;/&gt;
38
39          &lt;/Channel&gt;
40
41               
42
43                &lt;Valve className=&quot;org.apache.catalina.ha.tcp.ReplicationValve&quot;
44
45                 filter=&quot;&quot;/&gt;
46
47          &lt;Valve className=&quot;org.apache.catalina.ha.session.JvmRouteBinderValve&quot;/&gt;
48
49 
50
51          &lt;Deployer className=&quot;org.apache.catalina.ha.deploy.FarmWarDeployer&quot;
52
53                    tempDir=&quot;/tmp/war-temp/&quot;
54
55                    deployDir=&quot;/tmp/war-deploy/&quot;
56
57                    watchDir=&quot;/tmp/war-listen/&quot;
58
59                    watchEnabled=&quot;false&quot;/&gt;
60
61 
62
63          &lt;ClusterListener className=&quot;org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener&quot;/&gt;
64
65          &lt;ClusterListener className=&quot;org.apache.catalina.ha.session.ClusterSessionListener&quot;/&gt;
66
67       &lt;/Cluster&gt;
68
69

 

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


1
2
3
4
5
6
1&lt;!--
2
3  &lt;Cluster className=&quot;org.apache.catalina.ha.tcp.SimpleTcpCluster&quot;/&gt;
4
5--&gt;
6

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

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

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

 

 

(3)修改<Engine>的属性。
Tomcat负载均衡和集群环境的搭建

2个tomcat, jvmRoute分别配置成tomcat1和tomcat2,即和apache/conf里worker.properites配置文件中配置的worker名称对应。

 

 

5.   Tlcom 集群配置:

(1)    修改tlcom的web.xml,添加


1
2
3
4
5
1&lt;Context
2distributable
3=&quot;true&quot;
4/&gt;
5

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

这个定义

 

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

这里因为我沿用原来在tomcat上的开发方式,并不直接把项目放到tomcat/webapp目录下,而是通过将rone.xml和tlcom.xml两个配置文件放到apache-tomcat-6.0.26 A\conf\Catalina\localhost目录下
Tomcat负载均衡和集群环境的搭建

(3)    分别启动两个tomcat

可以在tomcat\bin目录下执行  startup.bat

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

 

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

 

RONE初始化:

 

成功启动:
Tomcat负载均衡和集群环境的搭建

启动tomcat2:

启动过程和tomcat1一样,值得注意的是,在tomcat2启动的时候,tomcat1会打印出集群中加入member的提示:
Tomcat负载均衡和集群环境的搭建

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

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

JkMount /* controller

JkMount /*.do controller

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

 

(5)    测试:
Tomcat负载均衡和集群环境的搭建

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

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

验证完成

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

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

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

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

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

6.   非本地访问apache

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

给TA打赏
共{{data.count}}人
人已打赏
安全运维

设计模式之桥接模式

2021-12-12 17:36:11

安全运维

OpenSSH-8.8p1离线升级修复安全漏洞

2022-1-9 9:47:55

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索