Tomcat开发技术之与HTTP服务器的集成 (3)

6、Apache与多个Tomcat服务器集成时的负载平衡

在实际应用中,如果网站的访问量非常大,为了提高访问速度,可以将多个Tomcat服务器与Apache集成,让它们共同分担运行Servlet/JSP 组件的任务。 JK插件的loadbalancer(负载平衡器)负责根据在workers.properties文件中预先配置的lbfactor(负载平衡因数)为 这些Tomcat服务器分配工作负荷,实现负载平衡。

假定Apache和两个Tomcat服务器集成,一个Tomcat服务器和Apache运行在同一台机器上,使用的JK端口为8009,还有一个 Tomcat服务器运行在另一台机器上,主机名为anotherhost,使用的JK端口为8009。以下是把Apache和这两个Tomcat服务器集 成的步骤。

(1)把mod_jk_2.0.46.dll拷贝到/lib目录下。

(2)在/conf目录下创建如下的workers.properties文件(注意粗体部分的内容):

ps=\ 
#指定文件路径分割符
worker.list=worker1,
worker2,loadbalancer 

worker.worker1.port=8009  
#工作端口,若没占用则不用修改
worker.worker1.host=localhost 
#Tomcat服务器的地址
worker.worker1.type=ajp13 
#类型
worker.worker1.lbfactor=100 
#负载平衡因数

worker.worker2.port=8009 
#工作端口,若没占用则不用修改
worker.worker2.host=anotherhost 
#Tomcat服务器的地址
worker.worker2.type=ajp13 
#类型
worker.worker2.lbfactor=100 
#负载平衡因数

worker.loadbalancer.type=lb
worker.loadbalancer.
balanced_workers=worker1, worker2

以上文件创建了两个worker:worker1和worker2分别代表两个Tomcat服务器,它们由worker.loadbalancer来分配工作负荷。

(3)修改/conf/httpd.conf文件,在文件末尾加入如下内容:

# Using mod_jk2.dll to 
redirect dynamic calls to Tomcat
LoadModule jk_module
modules\mod_jk_2.0.46.dll
JkWorkersFile "conf\workers.properties"
JkLogFile "logs\mod_jk2.log" 
JkLogLevel debug
JkMount /*.jsp loadbalancer
JkMount /helloapp/* loadbalancer

当客户请求"/*.jsp"或"/helloapp/*"形式的URL,该请求都由loadbalancer来负责转发,它根据在workers.properties文件中为worker1和worker2分配的lbfactor属性,来决定如何调度它们。

只有在使用了loadbalancer的情况下,workers.properties文件中worker的lbfactor属性才有意义,lbfactor取值越大,表示分配给Tomcat服务器的工作负荷越大。

(4)修改两个Tomcat服务器的JK端口,确保它们和workers.properties文件中的配置对应。此外,在使用了loadbalancer后,要求worker的名字和Tomcat的server.xml文件中的元素的jvmRoute属性一致。

所以应该分别修改两个Tomcat的sever.xml文件,把它们的元素的jvmRoute属性分别设为worker1和worker2。以下是修改后的两个Tomcat服务器的元素:

Tomcat服务器1:

<Engine name="Catalina"
defaultHost="localhost"
debug="0" jmvRoute="worker1">

Tomcat服务器2:

<Engine name="Catalina"
defaultHost="localhost" 
debug="0" jmvRoute="worker2">

(5)在完成以上步骤后,分别启动两个Tomcat服务器和Apache服务器,然后访问 http://localhost/index.jsp,会出现Tomcat服务器的默认主页。由于此时由loadbalancer来调度Tomcat服 务器,因此不能断定到底访问的是哪个Tomcat服务器的index.jsp,这对于Web客户来说是透明的。

如果在进行以上实验时,两个Tomcat服务器都在同一台机器上运行,应该确保它们没有使用相同的端口。在Tomcat的默认的server.xml中,一共配置了以下3个端口:

<Server port="8005" 
shutdown="SHUTDOWN" debug="0">
<!-- Define a non-SSL Coyote
HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" />
<!-- Define a Coyote/JK2 
AJP 1.3 Connector on port 8009 -->
<Connector port="8009" />

如果两个Tomcat服务器都在同一台机器上运行,则至少应该对其中一个Tomcat服务器的以上3个端口号都进行修改。

此外,如果把Tomcat和其他HTTP服务器集成,Tomcat主要负责处理HTTP 服务器转发过来的客户请求,通常不会直接接受HTTP请求。因此为了提高Tomcat的运行性能,可以关闭Tomcat的HTTP连接器,方法为在 server.xml中把Tomcat的HTTP Connector的配置注释掉。

猜你喜欢

转载自1006836709.iteye.com/blog/1954692