日期:2014-05-16  浏览次数:20595 次

Apache2结合Tomcat6做LoadBalance+Cluster

?

转载自:http://blog.sina.com.cn/s/blog_53d27b3a01000ag3.html

?

负载均衡和集群是企业应用2 个重要的话题。有些人把他们混淆起来,虽然两件事情结合起来实现的是一个目的,就是提高企业应用程序的处理能力,但实际上是两件不同的工作,应用起来要根据具体情况进行处理。
早些年,可延展性作为J2EE吹嘘的一大法宝,各大厂商也纷纷提供各自的实现赚取高额的利润。但在实际应用上能起到多少作用,对于普通用户都是一个未知数,高额的代价就像一道不可逾越的高墙把多数用户隔在了墙外,而厂商则把守在墙头,一面吹嘘,一面收费。
在开源盛行的今天,多数技术都变得更加透明,我们甚至可以用完全开源的技术实现这个功能。
我做实验的版本是apache 2.0.55 + tomcat 6,apache是安装在Red Hat Linux 4E 上,tomcat 则是一个跑在linux上一个跑在windows上。
首先明确一下有关的概念,所谓负载均衡(loadbalance)所指的是,在服务器端短时间内获得大量的请求,单一服务器无法在一个较短的时间内相应这些请求,此时服务器需要一个机制,请求按照多个服务器不同的负载能力,把这些请求合理的分配。而集群(cluster)的作用则是在多个服务器之间共享用户信息,资源等。传统的做法是在集群的几个服务器之间完全共享用户会话信息,也就是说,同一个用户登陆以后,几个操作很可能是在不同的服务器上完成的,用户会话信息的任何变化都将在几个服务器上共享,在任何一个服务器上用户信息发生变化都需要通知其他服务器,称为服务器会话的同步复制。但事实证明这样的做法会因为复制用户信息损失大量的资源,性能也比较差。现在的做法是把特定的用户信息粘到特定的服务器上,同一个用户的操作都会在一台服务器上完成,有效避免了会话的复制操作,性能要明显高一些。
在apache和tomcat上如何配置上述服务,有不同的方法,比较通用的做法是在apache上加载mod_jk(我具体做的时候加载的是mod_jk2),通过加载这个模块,实现apache的负载均衡功能,就是请求合理分配到不同服务器上。在tomcat的host上配置cluster,实现整个host上的应用集群。

首先在apache上配置mod_jk2
我单独做了一个mod_jk的配置说明文件,在主配置中载入。在主配置文件中加入

include conf/jk.conf

新建一个jk.conf的文本文件,写入下面代码


#载入mod_jk2的模块
LoadModule jk2_module modules/mod_jk2.so
#设置mod_jk中的workers配置文件的位置
JkSet config.file /usr/local/apache2/conf/workers2.properties

根据tomcat文档中的范例,修改了相应的配置,形成下面workers2.properties文件
[logger]
level=DEBUG

[config:]
debug=0
debugEnv=0

[shm:]
info=Scoreboard. Requried for reconfiguration and status with multiprocess serve
rs.
file=anon

[workerEnv:]
info=Global server options
timing=1
debug=0

# 构造一个名称为lb的负载均衡配置
[lb:lb]

# 构造一个名字为 nb:8009的chanel,在下面可以覆盖主机地址和端口号
[channel.socket:nb:8009]
port=8009
host=130.120.2.248

[channel.socket:localhost:8109]
port=8109
host=localhost

# 定义ajp13的worker,名称为 nb:8009
[ajp13:nb:8009]
#前面定义的chanel
channel=channel.socket:nb:8009
#前面定义的负载均衡
group=lb

[ajp13:localhost:8109]
channel=channel.socket:localhost:8109
group=lb