1.
概述
对于大型网站系统或者访问量较高的应用系统,多用户的并发访问常常会导致服务器的异常甚至不响应,一个web服务器往往无法满足所有的负载。解决这个问题的办法就是把负载分担在多个web服务器上,使系统稳定、快速的运行。均衡负载最常用的方式是集群(cluster),即把多个web服务器节点分布在一个或多个硬件服务器上,已达到分担处理请求的目的。
2.
原理
对于以tomcat为application server的应用,常见的集群方式是web server(apache)调用连接器(如jk2),通过负载均衡(ajp13),把访问分发到各个tomcat节点,各个节点处理完访问后,把相应的response数据发送给web server,然后由web server把访问结果返回给浏览器(用户)。
Tomcat的集群主要包括三个部分:负载均衡、session同步、webApp(web资源)同步。
2.1.
负载均衡
负责request请求的自动分配,根据app server(tomcat)的负载来决定分配方式,常用apache的ajp13(属于tomcat的一个子项目)来处理。
2.2.
session同步
即Session
Replication,是集群面临最大的一个问题。
由于http协议的无状态性,对于用户识别以及信息保留一般都通过session来处理,所以各个cluster的节点必须保障session的一致性。同时session的同步还要考虑性能的问题(socket,IO etc…),tomcat中使用tomcat cluster子项目来实现session的同步(基于TCP/IP协议)。
对于超大型网站系统,基于性能方面的考虑,需要实现primary-secondary session replication,(prsp)即实现session的分级同步,减轻session复制对于访问相应的影响。Tomcat5.5以及以前版本没有实现对于prsp的支持,但据说会在下个版本实现。
2.3.
webApp同步
即webApp的自动分发。一次分发(deploy)/改动,各个cluster节点自动同步。
对于集群,各个cluster节点的文件资源(resource,包括程序、配置文件、页面、图片、用户上传资源文件等)必须保持一致。对于大型网站或高访问量的应用系统,这种同步必须在特别短的时间(小到可以被忽略)内、不对程序运行造成破坏的情况下进行,所以手工同步是不现实的。
Tomcat5.5以及以前的版本没有对此进行支持,需要自己来实现。
2.4.
图示
3.
方案
由于tomcat的web server功能和性能的局限性,采取以下方案:
-
采用web server + tomcat的方式
-
Tomcat 采用 tomcat5.5(配合jmx.jar,以使其可以运行在非jdk5.0版本)
-
Web server采用apche2.0
-
连接器(connecter)采用jk2
(见http://jakarta.apache.org/site/downloads/downloads_tomcat-connectors.cgi)
-
负载均衡采用ajp13 (tomcat集成)
-
集群采用tomcat自带cluster (tomcat集成)
-
文件资源同步 (未实现,建议参考tomcat
context reload部分。)
4.
配置方式
1.软件的准备
a)Apache 2.0
b)Tomcat 5.5(以及jdk1.4兼容布丁)
c)mod_jk2.so
2.Apache和Tomcat的整合以及Balancer的配置
a)首先安装Apache,然后将mod_jk2.so拷贝在Apache的Module目录中
b)修改httpd.conf文件,添加以下内容:
LoadModule
jk2_module modules/mod_jk2.so
c)在Apache中的conf/httpd.conf添加指定web目录,如
Alias /myWebApp
"D:/tomcat/webapps/myWebApp/"
或者直接设定为默认访问目录”/”:
DocumentRoot
"D:/tomcat/webapps/myWebApp/"
在Apache中的conf/httpd.conf添加如下配置,已禁止访问所有/WEB-INF/目录:
<Directory
~ "/WEB-INF/">
Order allow,deny
Deny from all
</Directory>
d)在Apache的conf目录中建立workers2.properties文件,内容如下:
[logger.apache2]
level=DEBUG
[shm]
file={apache_home}\logs\shm.file
size=1048576
#第一个Tomcat的配置
[channel.socket:tomcat1]
#tomcat connecter端口,自己定义,保持和tomcat的server.xml中的一致既可
port=8009
#tomcat ip地址或域名
host=localhost
# 定义worker
[ajp13:tomcat1]
channel=channel.socket:tomcat1
#第二个Tomcat的配置
[channel.socket:tomcat2]
#tomcat connecter端口,自己定义,保持和tomcat的server.xml中的一致既可
port=9009
#tomcat ip地址或域名
host=localhost
#定义worker
[ajp13:tomcat2]
channel=channel.socket:tomcat2
#定义Balancer(负载均衡器)
[lb:lb1]
worker=ajp13:tomcat2
worker=ajp13:tomcat1
#Uri的映射,满足uri条件的,apache才会送给tomcat来处理,所以这里要列出所有送给tomcat$#处理的uri,以后缀名或者web路径的方式。
[uri:/*.do]
[uri:/*.jsp]
group=lb:lb1
注:{…}代表得内容需要根据具体情况来配置。
e)修改Tomcat的配置
修改第一个Tomcat的conf目录中server.xml,添加或修改以下内容:
<Connector
port="8009" enableLookups="false"
redirectPort="8443" debug="0" protocol="AJP/1.3"
/>
<!—port和worker2对应–>
修改第二个Tomcat的conf目录中的server.xml,添加或修改以下内容:
<Connector
port="9009" enableLookups="false"
redirectPort="8443" debug="0" protocol="AJP/1.3"
/>
<!—port和worker2对应–>
注:和apache集成的tomcat最好只保留一个connector(在server.xml中去除不使用的),否则用户可能跳过apache对tomcat直接访问,造成不可预料的异常。
修改第一个Tomcat的conf目录中jk2.properties文件,添加以下内容:
channelSocket.port=8009
#和server.xml以及worker对应
修改第二个Tomcat的conf目录中jk2.properties文件,添加以下内容:
channelSocket.port=9009
#和server.xml以及worker对应
这样Tomcat和Apache的整合就完成了,你可以直接通过Apache来访问Tomcat5了.
3.Tomcat集群的配置
a)在Tomcat的server.xml文件的Host下有类似以下内容(已经被注释掉):
<Cluster
className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.1.2.3"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4002"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"/>
<Valve
className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Deployer
className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
</Cluster>
把这个<Cluster>标签反注释掉,使之生效即可。
b)在另一个Tomcat同上。
注:如果在同一台机器上运行,则tcpListenPort不能一样.
c)在需要作集群的webapp的web.xml中加上<distributable/>(具体位置在description标签之后).
这样所有的配置就结束了.配置完后,集群中的Tomcat会自动保证Session的复制.
注:三个及以上数量的cluster节点的配置依次类推。
参考:tomcat doc的cluster-howto以及“钝刀”的tomcat4.1的配置。
5. 对于系统程序编码的影响
5.1.
session同步
为了保障tomcat
cluster各个节点对于session的自动同步,系统中所有保存在session的object必须实现序列化接口(Serializable),而且必须保证所有session中的object的成员域可序列化(如不能有java.sql.connection之类的涉及物理资源的成员域)。
5.2.
关于static
由于各个cluster节点为两个单独的程序,分别拥有独立的堆栈甚至Jvm,系统中所有程序都不能出现依赖于具体请求的static变量或方法(换句话说,就是不能在各个servlet/jsp/action中共享非final的可能发生变化的static变量),比较常见的是在singleton模式中。
5.3.
数据库并发
集群环境下,对数据库的并发访问可能会提升,但这种并发访问和同一个tomcat的多线程并发访问并无区别,所以确切的说,这并不是集群带来的问题,在所有多线程的情况下都必须注意。
6.
总结、综述
大型网站系统或访问量大的应用系统,在高并发访问的情况下,由于业务处理时间较长,可能会造成响应迟缓甚至不响应的情况发生。
Tomcat集群主要解决业务处理的负载均衡,即把业务处理的压力分担在各个节点上,现在的情况下,其实施的主要成本为:
1.
添置服务器,最集群节点。
2.
开发自动同步webapp资源的系统。
3.
对现有系统不符合第5条的模块的改进。
同时,在性能上,由于session共享带来的序列化/反序列化以及socket数据传送开销都比较大,在系统session更新频繁的情况下要慎重考虑是否使用集群。
分享到:
相关推荐
Apache + Tomcat 集群配置 Apache + Tomcat 集群配置是指将 Apache 服务器与 Tomcat 服务器集成,以提高服务器的性能和可扩展性。本文将详细介绍如何配置 Apache + Tomcat 集群,包括安装 Apache 和 Tomcat 服务器...
Apache+Tomcat集群配置,Apache+Tomcat集群配置,Apache+Tomcat集群配置
Apache+Tomcat集群配置续Apache+Tomcat集群配置续Apache+Tomcat集群配置续Apache+Tomcat集群配置续
### Apache和Tomcat集群配置详解 #### 一、软件准备 在进行Apache和Tomcat集群配置之前,首先需要准备所需的软件资源。 - **Apache 2.2**: - Windows平台: 从官方网站 [http://httpd.apache.org/download.cgi]...
在IT领域,特别是企业级应用服务环境中,Apache与Tomcat的集群配置与负载均衡是提升系统性能、确保高可用性和可扩展性的关键策略之一。在Windchill 9这一特定背景下,通过Apache作为前端代理服务器,配合多个Tomcat...
#### 三、Apache+Tomcat集群配置步骤 **步骤1:环境准备** - 安装Apache。 - 安装两个Tomcat实例,并在各自的`webapps`目录下部署测试项目。 **步骤2:JK插件配置** - 将`mod_jk.so`复制到`<apache_home>/...
总结,"apache+tomcat集群配置文件和文档说明"涵盖了Apache和Tomcat的集群配置,涉及Apache的负载均衡配置、Tomcat的session复制和集群通信设置,以及Java环境的准备。通过这些配置,可以构建一个高可用的Web服务...
**二、Tomcat集群配置** 1. **安装Tomcat**:下载并安装两个Tomcat实例,分别监听不同的端口(如上述8080和8081)。 2. **复制共享session配置**:由于集群中的各个Tomcat实例需要共享session,所以需要在每个...
以下是对Apache与Tomcat集群配置的详细解析: 1. **Apache HTTP Server配置**: - Apache通常作为前端代理服务器,接收来自客户端的HTTP请求,并通过AJP协议将这些请求转发给Tomcat实例。 - 在`httpd.conf`配置...
这份"apache+tomcat集群配置文件和文档"将涵盖以上所有要点,指导你逐步配置和测试Apache+Tomcat集群。按照文档操作,你将能够构建出一个高效且稳定的Web服务环境。在实际操作中,务必根据你的硬件资源和具体需求...
Apache和tomcat集群部署配置文件案例,包含Apache中的配置文件httpd.conf,mod_jk.conf,workers.properties,以及tomcat中配置文件server.xml