日期:2014-05-17  浏览次数:21036 次

Tomcat6.0的负载均衡(Apache2.2)与集群配置

这两天尝试了一下Tomcat的负载均衡以及集群配置,小可不才斗胆记录如下,网上好多都是先配lb再配集群滴,小子反其道而行先配集群吧,首先声明这个与手把手或者从零开始系列不太粘边只提供一个配置过程及思想,纯拿来主义在这可能不太灵光。后续在理解好这些原理后可能会再谈谈自己的心得,欢迎各位大牛参观指导^_^~

1、环境列表

  • 电脑一枚(各位看官,这个真不能算废话啊)
  • Win7

?

2、软件包列表(注意都是Win版x86系列的包哟)

  • Apache 2.2
    • 相当于一个代理服务器,所有请求先经过apache服务器后分发给各Tomcat实例进行处理。很好理解~
  • Tomcat 6.0.32
    • 注意:之前使用6.0.20版本,在配置集群的时候多播总是有问题,相同配置改在6.0.32中就没问题了
    • 解压3份,分别重命名为tomcat1、tomcat2、tomcat3(这个你想解几个就解几个,取三为多的意思)
    • 注意修改3个Tomcat实例conf/server.xml文件,把相应的端口号修改一下以免冲突哟。(小子把tomcat1上的所有端口都加上1前缀了,如8080变成18080,方便记忆识别嘛,以此类推~)
  • tomcat-connectors-1.2.32-windows-i386-httpd-2.2.x (JK_MOD)
    • apache modules,lb就是用介个模块来搞滴
  • JMeter 2.4
    • 用于自动化的测试、当然除此之外还是有些手工的测试
  • Eclipse Indigo
    • 用于编写测试webapp,喜欢用什么ide就用什么吧^_^

?

3、编写测试代码

编写测试代码的目的是便于观察配置是否成功,1)直观识别出请求被负载均衡到不同的Tomcat实例中;2)同一Session是否被分配到同一Tomcat实例处理,Session能否在集群中共享;3)当集群中某一Tomcat实例意外down机后,请求能否透明分配给另一Tomcat实例进行处理。

最关键的就是如何直观识别出请求被哪个Tomcat实例处理,我采用的比较懒的解决方案:Servlet在接到请求后在终端System.out.print当前Session的属性。

代码实在拿不出手,只得琵琶半遮面了,主要是直观标识出session及相应属性:

由于session没有数据来源,所以再编写jsp页面(提供两parameter:name&nameValue)提交session属性。相应配置web.xml以完成该webapp应用。就不打包代码了,更优美的实现在等待着你^_^~

?

关于该webapp的部署就无关紧要了,无论是打war包,或者直接写<Context docBase="*" path="/*"></Context>都行,由于部署了三个Tomcat实例,小子采用的是第2种方案。只要能给Tomcat实例部署上就O了~

?

4、配置集群

参考材料:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

官方的HowTo里解释的很详细了,在6.0.32版本上,我所做的只是简单打开3个Tomcat实例配置文件中Cluster元素的注释而已。(由于Cluster元素有默认配置,介个可以参考howto里给出的内容,所以完全没有必要再手工给出详细的配置^_^)此处,集群各Tomcat实例的Receiver端口会自动检测4000-4100端口值并完成分配的,所以也不需要额外进行手工配置,好吧,再贴点代码片断:

?

测试:依次打开3个Tomcat实例,观察3个实例输出即可。若成功,三个输出终端会有同步session state的输出以及相应的MemberShip信息。或者在打开完成后,任意关闭一个Tomcat实例,若其余两终端有成员退出等提示则也可证明成功^_^。绑定应用级别的测试等配完负载均衡后再来吧,莫急莫急~

?

5、负载均衡

参考材料:http://tomcat.apache.org/connectors-doc/generic_howto/quick.html

官方的quick start写的也比较quick,主要包含两方面的配置:

1)workers.properties:配置的woker的名称注意要与tomcat实例配置中的jvmRoute一致(该值相应补充配置到Engine元素上,在注释部分有该属性的提示,抄一下就会了);同时在这里需要提供一个lb的worker,按我的逻辑来看,所有请求会由这个worker进行核心的分发任务。

2)apache的配置:加载jk_mod.so,进行相应配置即可。这个参照官方的quick start改改就行了,官方的设置比较多贴下我这个可行的配置仅供参考:

?


简单测试版本:启动Apache服务器,多开浏览器(目的是隔离Session),以http://locahost/demo/*.do形式访问Apache服务器,观察tomcat终端的输出。在Session隔离的情况下,多个终端会有相应的输出^_^。感觉负载均衡这块的配置比较简单,我也是一次过的,主要是注意在workers.properties里worker的名称一定要与tomcat engine元素的jvmRoute值一致,如此才能保证同一session被发送到同一实例中进行处理。(通过在session.id后加上.$jvmRoute的值来标识的,通过测试代码