集群的搭建

Tomcat 集群搭建
本部分将介绍实际的 Tomcat 集群是如何搭建的,主要包括如下两部分内容:
1.Tomcat 的下载与安装
2. 集群的搭建
在安装 Tomcat 之前,我们需要先下载安装 JDK6 ,并配置好相应的环境变量。关于 JDK6 的下载及安装,读者可以通过登陆“ http://www.unix-center.net/ ”网站,参照 在 Solaris 操作系统上搭建 Java EE 开发环 境 教程的相关部分来详细学习,这里就不再赘述。
这里的介绍从配置系统环境变量开始,步骤如下:
( 1 )打开系统根目录( / )下“ etc ”文件夹中的“ profile ”文件,在文件末尾加入如下配置项目。
JAVA_HOME=/jdk6
export JAVA_HOME
JRE_HOME=/jdk6/jre
export JRE_HOME
提示:上述配置项目设置了 JAVA_HOME 与 JRE_HOME 环境变量,这两个环境变量在启动 Tomcat 服务器时会起作用。
( 2 )再在“ profile ”文件末尾加入如下配置项目。
PATH = $JAVA_HOME/bin:$JRE_HOME/bin:$PATH
提示:上述配置项目修改了 PATH 环境变量,将 JDK 的 bin 路径添加到 PATH 中,这样向 java 、 javac 这样的 Java 命令才能够正确执行。
( 3 )完成上述步骤后重新启动计算机或重新登陆操作系统就完成了对 JDK6 的设置,接着就可以进行 Tomcat 的下载与安装了。
( 4 )在浏览器地址栏输入“ http://tomcat.apache.org/download-60.cgi ”,进入如图 3-1-1 所示的 Tomcat 下载页面。

图 3-1-1
( 5 )进入上述页面后,点击页面左侧的 超链接,在页面下方找到 ,超链接,再点击便可是开始下载所需版本的 Tomcat 了,如图 3-1-2 所示。

图 3-1-2
( 6 )将下载好的“ apache-tomcat-6.0.14.zip ”拷贝到系统根目录( / )下,并将其解压到系统根目录下以便操作,如图 3-1-3 所示。

图 3-1-3
( 7 )解压完成后将在系统跟目录下生成名称为“ apache-tomcat-6.0.14 ”的文件夹,这时在终端键入如下两条命令即可启动 Tomcat , Tomcat 正常启动将出现如图 3-1-4所示信息。
cd /apache-tomcat-6.0.14/bin
./startup.sh

图 3-1-4
( 8 )在浏览器地址栏输入“ http://localhost:8080 ” ,进入如图 3-1-5 所示的 Tomcat 欢迎页面。

图 3-1-5
( 9 )下面通过一个简单的“ Test.jsp ”程序进一步验证 Tomcat 是否安装成功,新建名称为“ Test.jsp ”的 Jsp 源文件并在其中输入如下代码。
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title> Tomcat 测试 </title>
</head>
<body>
<font color = "red" size = "20" >
<% out.print( " 恭喜您,成功的安装并启动了 Tomcat !!! " ); %>
</font>
</body>
</html>
( 10 )将编写完成的“ Test.jsp ”文件存放到“ apache-tomcat-6.0.14 ”文件夹下“ webapps ”文件夹中的“ ROOT ”文件夹下。
( 11 )在控制台输入如下几条命令重新启动 Tomcat 。
cd /apache-tomcat-6.0.14/bin
./shutdown.sh
./startup.sh
( 12 )在浏览器地址栏输入“ http://localhost:8080/Test.jsp ” , 如图 3-1-6所示,这样我们就成功的完成了 Tomcat 的安装。

图 3-1-6

 

完成了 Tomcat 的安装后,就可以开始搭建 Tomcat 集群了,具体步骤如下:
( 1 )将系统根目录( / )下的“ apache-tomcat-6.0.14 ”的文件夹改名为“ TC6_A ”,如图 3-2-1 所示。

图 3-2-1
( 2 )在系统根目录( / )下新建一个文件夹,将其命名为“ TC6_B ”,如图 3-2-2 所示。

图 3-2-2
( 3 )将“ TC6_A ”文件夹下的所有文件目录拷贝到“ TC6_B ”文件夹下,如图 3-2-3 所示。

图 3-2-3
提示:进行上述步骤操作的原因是,本案例中集群的各个 Tomcat 服务器实例运行在同一个物理服务器上,因此集群中有几个 Tomcat 实例一般就需要几个 Tomcat 的安装。另外,由于集群中的各个 Tomcat 实例位于同一个物理服务器上的一个操作系统下,因此各个实例占用的各种网络端口不能相同,否则集群中的多个 Tomcat 实例不能同时正常启动,下面的步骤将介绍如何修改 Tomcat 实例需要使用的各个网络端口。
( 4 )打开“ TC6_A ”文件夹下“ conf ”文件夹下的“ server.xml ”文件以及“ TC6_B ”文件夹下“ conf ”文件夹下的“ server.xml ”文件,如图 3-2-4 所示。

图 3-2-4
提示:由于对各种网络端口及集群的配置内容都在 server.xml 文件中,因此想正确配置集群就需要修改各个 Tomcat 的 server.xml 配置文件。
( 5 )找到 server.xml 配置文件中的“ Server ”配置项目,并进行修改。
<Server port="8005" shutdown="SHUTDOWN">
<Server port="10005" shutdown="SHUTDOWN">
<Server port="20005" shutdown="SHUTDOWN">
说明:第一行为两个 Tomcat 修改前的情况,第二行为 TC6_A Tomcat 修改后的情况,第三行为 TC6_B Tomcat 修改后的情况。
( 6 )找到 server.xml 配置文件中的相应“ Connector ”配置项目,并进行修改。
• 修改前内容如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />
q TC6_A 中修改后内容如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port = " 10009 " protocol = "AJP/1.3" redirectPort = " 10043 " />
• TC6_B 中修改后内容如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port = " 20009 " protocol = "AJP/1.3" redirectPort = " 10043 " />
提示:此步骤目的是修改 AJP Connector 端口。
( 7 )找到 server.xml 配置文件中的另一个相应“ Connector ”配置项目,并进行修改。
• 修改前内容如下:
<Connector port = "8080" protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = "8443" />
• TC6_A 中修改后内容如下:
<Connector port = " 10001 " protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = " 10043 " />
• TC6_B 中修改后内容如下:
<Connector port = " 20001 " protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = " 20043 " />
提示:此步骤目的是修改 HTTP Connector 端口,其中的“ 10001 ”与“ 20001 ”是未来通过浏览器访问集群中各个 Tomcat 实例的 HTTP 端口。
( 8 )通过修改 Engine 配置选项,配置集群中每个 Tomcat 实例的名称。
• 修改前内容如下:
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = "jvm1">
-->
<Engine name = "Catalina" defaultHost = "localhost">
• TC6_A 中修改后内容如下:
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = " Tomcat1 ">
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name = "Catalina" defaultHost = "localhost">
-->
• TC6_B 中修改后内容如下:
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = " Tomcat2 ">
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name = "Catalina" defaultHost = "localhost">
-->
提示:请读者注意在修改过程中要注释掉原来 name 为 Catalina 的 Engine 配置项目,将 name 为 Standalone 的 Engine 配置项目的注释去掉并修改 jvmRoute 属性。
( 9 )修改配置文件中的 Cluster 配置项目,对集群的各项参数进行设置。
• 修改前内容如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />
• TC6_A 中修改后内容如下:
<Cluster
className = "org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions = "8"
>
<Manager className = "org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown = "false"
notifyListenersOnReplication = "true" />
<Channel className = "org.apache.catalina.tribes.group.GroupChannel" >
<Membership className = "org.apache.catalina.tribes.membership.McastService"
address = "228.0.0.4"
port = "45564"
frequency = "500"
dropTime = "3000"/>
<Receiver className = "org.apache.catalina.tribes.transport.nio.NioReceiver"
address = "auto"
port = "4000"
autoBind = "100"
selectorTimeout = "5000"
maxThreads = "6" />
<Sender className = "org.apache.catalina.tribes.transport.ReplicationTransmitter" >
<Transport className = "org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Interceptor
className = "org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
</Channel>
<Valve className = "org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
<Valve className = "org.apache.catalina.ha.session.JvmRouteBinderValve" />
<Deployer className = "org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir = "/tmp/war-temp/"
deployDir = "/tmp/war-deploy/"
watchDir = "/tmp/war-listen/"
watchEnabled = "false"/>
<ClusterListener className = "org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
<ClusterListener className = "org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
• TC6_B 中修改后内容如下:
<Cluster
className = "org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions = "8"
>
<Manager className = "org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown = "false"
notifyListenersOnReplication = "true" />
<Channel className = "org.apache.catalina.tribes.group.GroupChannel">
<Membership className = "org.apache.catalina.tribes.membership.McastService"
address = "228.0.0.4"
port = "45564"
frequency = "500"
dropTime = "3000" />
<Receiver className = "org.apache.catalina.tribes.transport.nio.NioReceiver"
address = "auto"
port = "4000"
autoBind = "100"
selectorTimeout = "5000"
maxThreads = "6" />
<Sender className = "org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className = "org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Interceptor className = "org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
</Channel>
<Valve className = "org.apache.catalina.ha.tcp.ReplicationValve"
filter = ""/>
<Valve className = "org.apache.catalina.ha.session.JvmRouteBinderValve" />
<Deployer className = "org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir = "/tmp/war-temp/"
deployDir = "/tmp/war-deploy/"
watchDir = "/tmp/war-listen/"
watchEnabled = "false" />
<ClusterListener className = "org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
<ClusterListener className = "org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
提示:上述配置内容主要是对集群中各个 Tomcat 实例间进行通信的方式、端口以及 Session 共享算法的设置。本教程由于篇幅所限,不能一一详细介绍,有兴趣的读者可以参看 Tomcat 的官方文档,其中有非常详细的说明。
( 10 )这样我们就完成了对 Tomcat 集群的设置,下面就可以同时启动这两个 Tomcat 实例了。
( 11 )在终端键入如下两条命令,启动 TC6_A Tomcat 实例,如图 3-2-5 所示。
cd /TC6_A/bin
./startup.sh

图 3-2-5
( 12 )再新开一个终端窗口,在其中键入如下两条命令,启动 TC6_B Tomcat 实例,如图 3-2-6 所示。
cd /TC6_B/bin
./startup.sh

图 3-2-6
提示:请读者特别注意,在启动多个 Tomcat 时,必须等一个 Tomcat 实例完全启动之后才可以启动另一个 Tomcat 实例。例如:必须先等 TC6_A 实例先启动以后才可以启动 TC6_B 实例,否则,将发生错误,导致两个 Tomcat 实例都无法正常启动。
( 13 )在浏览器地址栏输入“ http://localhost:10001 ” ,便进入如图 3-2-7 所示的 Tomcat 欢迎页面。

图 3-2-7
提示:上述页面是集群中 TC6_A Tomcat 实例的欢迎页面。
( 14 )再新开一个浏览器,在浏览器地址栏输入“ http://localhost:20001 ” ,便进入如图 3-2-8 所示的 Tomcat 欢迎页面。

图 3-2-8
提示:上述页面是集群中 TC6_B Tomcat 实例的欢迎页面。如果能顺利看到上述两个步骤的 Tomcat 欢迎页面,则说明 Tomcat 集群配置基本成功。下面将通过一个十分简单的 JSP 来进一步测试对“ TC6_A ”和“ TC6_B ”的设置是否成功。
( 15 )在“ TC6_A ”文件夹下“ webapps ”文件夹下“ ROOT ”文件夹中新建名称为“ Hello.jsp ”的 Jsp 源文件,并向其中添加如下代码:
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>Tomcat 测试 </title>
</head>
<body>
<font color="red" size="20">
<!— 使用 out 内建对象打印一条消息到输出页面 -->
<% out.print( “Tomcat 集群测试 A !!! ” ); %>
</font>
</body>
</html>

( 16 )在“ TC6_B ”文件夹下“ webapps ”文件夹下“ ROOT ”文件夹中新建名称为“ Hello.jsp ”的 Jsp 源文件,并向其中添加如下代码:
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>Tomcat 测试 </title>
</head>
<body>
<font color="red" size="20">
<!-- 使用 out 内建对象打印一条消息到输出页面 -->
<% out.print( “Tomcat 集群测试 B !!! ” ); %>
</font>
</body>
</html>
提示:上述两个步骤实际上是在集群中的不同 Tomcat 实例中部署了相同的 Web 应用。这样,在未来为集群设置了负载均衡器后,集群中任何一个实例都可以对外提供完全相同的服务,这在后面的部分会详细介绍。当然细心的读者会发现这两个 Hello.jsp 并不完全相同,这是为了在测试的时候提供方便,可以非常容易地知道访问了集群中那个实例的服务,实际开发中不必如此。
( 17 )在浏览器地址栏输入“ http://localhost:10001/Hello.jsp ”,便进入如图 3-2-9 所示的页面。

图 3-2-9
( 18 )再新开一个浏览器,在浏览器地址栏输入“ http://localhost:20001/Hello.jsp ”,便进入如图 3-2-10 所示的页面。

图 3-2-10
如果能顺利地在浏览器中见到上述两个页面,则说明集群中的两个 Tomcat 实例工作完全正常。下面就可以为集群安装、设置 Apache 负载均衡器了。
Apache 负载均衡器
前面的教程中已经介绍,在使用 Tomcat 6.0 搭建 Web 集群时,一般使用 Apache 作为负载均衡器(有的技术资料中也称为喷射器)。因此,本节将介绍如何安装 Apache 及其如何将其配置为 Tomcat 集群的负载均衡器,主要包括如下内容:
• Apache 的下载与安装
• 将 Apache 配置为 Tomcat 集群的负载均衡器
Apache 是一种开放源码的 HTTP 服务器,可以在大多数计算机操作系统中运行。由于其多平台支持和安全性高而被业界广泛使用,是目前市面上最流行的 HTTP 服务器软件之一。
下面将向读者介绍如何下载 Solaris x86 系统下所需的 Apache 服务器安装包及其安装过程,具体步骤如下:
( 1 )在大部分情况下 Solaris 操作系统没有自带 “ libiconv ”包,而 Apache 服务器的安装与运行需要这个包的支持。因此下载安装 Apache 服务器之前,首先需要安装“ libiconv ”。
( 2 )在浏览器地址栏输入“ http://www.sunfreeware.com/programlistintel10.html ”,进入如图 4-1-1 所示页面。

图 4-1-1
提示:由于 Solaris 操作系统的特殊性,很多开源软件官方网站上提供的下载包并不能很方便地进行安装,因此 Sun 以及一些社区专门建立了 sunfreeware 网站,提供 Solaris 下各种开源软件及支持包的下载。一般情况下,从此网站下载的包都能够很方便的使用 Solaris 下的包管理器进行安装,故笔者选择从这个网站下载 Apache 与 libiconv 的安装包。
( 3 )进入上述页面后,点击页面右侧的 超链接进入“ libiconv ”包的下载页面,如图 4-1-2 所示。

图 4-1-2
( 4 )进入上述网页后,点击网页中的 超链接,便开始下载在 Solaris 下所需的“ libiconv ”安装包文件“ libiconv-1.11-sol10-x86-local.gz ”。
( 5 )将已下好的“ libiconv-1.11-sol10-x86-local.gz ”文件,存放到系统根目录( / )下,在终端键入如下命令,对“ libiconv-1.11-sol10-x86-local.gz ”文件进行解压,如图 4-1-3 所示。
gunzip libiconv-1.11-sol10-x86-local.gz

图 4-1-3
( 6 )执行完上述命令后读者会发现,在系统根目录下将生成名称为“ libiconv-1.11-sol10-x86-local ”的文件,如图 4-1-4 所示。

图 4-1-4
( 7 )接着在终端键入如下命令,对生成的“ libiconv-1.11-sol10-x86-local ”包文件进行安装,如图 4-1-5 所示。
pkgadd –d libiconv-1.11-sol10-x86-local

图 4-1-5
提示: pkgadd 为 Solaris 下专用的包安装命令,用其安装软件包可以说是最简单的一种方式的,就像 Linux 下流行的 rpm 一样。
( 8 )在 pkgadd 命令执行后,系统会询问对包的安装方式,一般没有特殊情况采用“ all ”方式。在终端输入如下命令,按下回车键开始安装“ libiconv-1.11-sol10-x86-local ”包,
all
( 9 )接着系统会询问是否创建目录,输入“ y ”,按下回车键正式开始安装过程,上述两步如图 4-1-6 所示。

图 4-1-6
( 10 )安装完成后,终端窗口中将出现如图 4-1-7 所示的内容,这就说明正确完成了 libiconv 包的安装工作,下面就可以进行 Apache 服务器的安装了。

图 4-1-7
( 11 )在浏览器地址栏输入“ http://www.sunfreeware.com/programlistintel10.html ”,进入如图 4-1-8 所示页面。

图 4-1-8
( 12 )进入上述页面后,点击页面右侧的 超链接进入 Apache 安装包下载页面,如图 4-1-9 所示。

图 4-1-9
( 13 )进入网页后,点击网页中的 超链接,便可以开始下载 Apache 服务器的安装包了。
( 14 )将已下载完成的“ apache-2.2.6-sol10-x86-local.gz ”文件存放到系统根目录( / )下,在终端键入如下命令,对“ apache-2.2.6-sol10-x86-local.gz ”文件进行解压,如图 4-1-10 所示。
gunzip apache-2.2.6-sol10-x86-local.gz

图 4-1-10
( 15 )解压完成后读者会发现在系统根目录下将生成名称为“ apache-2.2.6-sol10-x86-local ”的文件,如图 4-1-11 所示。

图 4-1-11
( 16 )接着在终端键入如下命令,对生成的“ apache-2.2.6-sol10-x86-local ”文件包进行安装,如图 4-1-12 所示。
pkgadd –d apache-2.2.6-sol10-x86-local

图 4-1-12
提示:与前面安装 libiconv 包相同,系统也会询问安装方式,读者还使用“ all ”方式即可。
( 17 )安装完成后,终端窗口中将出现如图 4-1-13 所示的内容,这就说明正确完成了 Apache 服务器的安装工作。

图 4-1-13
( 18 )打开“ /usr/local/apache2/conf ”目录下的“ httpd.conf ”文件,如图 4-1-14 所示。

图 4-1-14
( 19 )在其中找到内容为 的一行,在其前面加上“ # ”将其注释掉,如图 4-1-15 所示。

图 4-1-15
提示:如果不将上述内容的行注释掉, Apache 服务器不能正常启动。这主要是因为缺少相应的包文件造成的,有兴趣的读者可以参看 Apache 服务器的官方文档。
( 20 )修改完成后,将文件保存。接着在终端键入如下命令,启动 Apache 服务器,如图 4-1-16 所示。
/usr/local/apache2/bin/apachetl start

图 4-1-16
( 21 )在浏览器地址栏输入“ http://localhost ”,进入如图 4-1-17 所示的 Apache 服务器欢迎页面。

图 4-1-17
提示:如果能正确见到如图 4-1-19 所示的页面,则说明 Apache 服务器正常工作了,下面就可以将其关闭,并配置为 Tomcat 集群的负载均衡器了。
( 22 )在终端中键入如下命令,关闭 Apache 服务器,如图 4-1-18 所示。
/usr/local/apache2/bin/apachetl stop

图 4-1-18
到这里为止, Apache 服务器的安装工作就全部完成了,下面的部分将向读者介绍如何将 Apache 配置为 Tomcat 集群的负载均衡器。
1 )打开“ /usr/local/apache2/conf ”目录下的“ httpd.conf ”文件,在文件最后添加如下配置项目,如图 4-2-1 所示。
ProxyRequests Off
ProxyPass / balancer://myCluster/
<Proxy balancer://myCluster/>
BalancerMember ajp://localhost:10009 route=Tomcat1
BalancerMember ajp://localhost:20009 route=Tomcat2
</Proxy

图 4-2-1
说明:其中“ myCluster ”是集群的名称,“ ajp://localhost:10009 route=Tomcat1 ” 对应 Tomcat 集群中的 TC6_A 实例,“ ajp://localhost:20009 route=Tomcat2 ” 对应 Tomcat 集群中的 TC6_B 实例。经过上述配置后, Apache 就可以成为前面搭建的 Tomcat 集群的负载均衡器了。
( 2 )修改完成后,保存“ httpd.conf ”文件。
( 3 )在终端中键入如下命令,启动“ TC6_A ” Tomcat 实例。
cd /TC6_A/bin
./startup.sh
( 4 )再打开一个新的终端,在其中键入如下命令,启动“ TC6_B ” Tomcat 实例
cd /TC6_B/bin
./startup.sh
( 5 )再打开第三个终端窗口,在其中键入如下命令,启动 Apache 服务器。
/usr/local/apache2/bin/apachetl start
( 6 )在浏览器地址栏输入“ http://localhost/Hello.jsp ”,将进入如图 4-2-2 所示页面。

图 4-2-2
( 7 )刷新网页,读者可以看到如图 4-2-3 所示页面。

图 4-2-3
说明:由于 Apache 作为 Tomcat 集群的负载均衡器,使用的是轮换算法,其均匀地将请求发送到集群中的各个 Tomcat 实例。因此,从上面两幅图中可以看出,是轮换访问两个不同 Tomcat 实例中的 Hello.jsp 页面的。当然,看到轮换的情况也就说明 Apache 负载均衡器正常工作了。


压力测试
Apache 不但是一款非常优秀的开源 HTTP 服务器,在安装后其还自带了一个非常方便的集群压力测试工具 ab 。所谓对集群的压力测试就是在同一时间段内向集群集中发送一批请求,看集群的响应情况。根据响应的情况可以看出集群的配置是否优良,是否能满足业务负载的需要。下面就向读者介绍 ab 压力测试工具的使用,步骤如下:
( 1 )在终端中键入如下命令对 Tomcat 集群进行压力测试如图 5-8-1 所示。
cd /usr/local/apache2/bin
./ab –n 200 –c 20 http://localhost/OnlineShop

图 5-8-1
说明:“ ab ”命令中“ -n ”后的参数表示对 Tomcat 集群发送请求的次数,“ -c ”后的参数表示每一次并发发送请求的数量。
( 2 )在执行完上述命令后,系统会以文本方式显示测试的结果,如下所列:
Benchmarking localhost (be patient)
Competed 100 requests
Finishes 200 requests
Server Software:
Server Hostname: localhost
Server Port 80
Document Path: /OnlineShop
Document Length: 0 bytes
Concurrency Level: 20
Time taken for tests: 1.905977 seconds
Complete requests: 200
Failed requests: 0
Write errors: 0
Non-2xx responses: 200
Total transferred: 35000 byts
HTML transferred: 0 bytes
Requests per second: 104.33 [#/secl] (mean)
Time per request: 190.598 [ms] (mean)
Time per request: 9.530 [ms] (mean, across all concurrent requests)
Transfer rate: 17.84 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 35 162 120.8 134 532
Waiting: 3 154 121.8 121 532
Total: 35 162 120.8 134 532
Percentage of the requests served within a certain time (ms)
50% 134
66% 181
75% 210
80% 231
90% 350
95% 455
98% 511
99% 528
100% 532 (longest request)
提示:测试结果中包含了响应性能、时间等各方面的值,根据这些值可以分析出集群的工作情况能否满足需要。想了解测试结果各项细节含义的读者可以自行查阅关于 ab 的官方文档,这里不再一一赘述。


在完成了上述所有的开发过程后,接下来就可以在 Tomcat 集群下部署运行应用程序了,步骤如下:
( 1 )将 OnlineShop 文件夹分别拷贝到 TC6_A 文件夹以及 TC6_B 下的 webapps 目录中。
( 2 )启动 TC6-A 服务器,这里读者可以通过查看 TC6_A 文件夹下 logs 文件夹中的日志文件来查看 TC6_A 服务器的启动信息,如图 5-7-1 所示。

图 5-7-1
提示: Tomcat 服务器的日志存放在 Tomcat 安装目录的 logs 目录下,如 TC6-A 的日志在 /TC6-A/logs 目录下。
( 3 )启动 TC6-B 服务器,这里读者需要通过再次查看 TC6_A 文件夹下 logs 文件夹中的日志文件来查看 TC6_B 服务器是否能与 TC6-B 服务器通讯,如果不能在 TC6_A 文件夹的日志文件中看到如图 5-7-2 所示内容,那么表示集群并没有完全正常工作。这可能是由于防火墙、网络或其他配置不正确造成的,如果读者遇到此类情况需要检查系统的各项设置。

图 5-7-2
( 4 )以上步骤正常运行后,启动 Apache 服务器。
( 5 )接下来在浏览器地址栏输入“ http://localhost/OnlineShop ”,进入如图 5-7-3 所示页面。

图 5-7-3
( 6 )逐个测试购物车应用的各个功能,如图 5-7-4 所示。

图 5-7-4
注意:读者会发现当测试本应用的各项应用功能时,其他功能都可以正常运行,而对购物车的操作有时会不正确。例如,当点击“购物车”页面中的“删除”按钮时,页面所显示的商品数量会莫名其妙的变动。这是由于 Tomcat6 集群要求负载均衡器工作在“ sticky session ”模式下,否则集群可能工作不正常。读者不必担心,下面将介绍如何解决这个问题。
( 7 )关闭 TC6_A 服务器、 TC6_B 服务器以及 Apache 服务器。
( 8 )打开“ /usr/local/apache2/conf ”目录下的“ httpd.conf ”文件,对“ ProxyPass ”项目进行如下修改。
• 修改前
ProxyPass / balancer://myCluster/
• 修改后
ProxyPass / balancer://myCluster/ lbmethod=byrequests stickysession=JSESSIONID nofailover=Off
提示: 修改后添加的“ stickysession=JSESSIONID ”项就是让 Apache 负载均衡器工作在“ sticky session ”模式下。所谓“ sticky session ”模式就是对于使用到同一个 Session 的请求绑定到集群中的特定服务器上,而不是轮换访问各个服务器,这样 Session 就不会工作不正常了。当然,对于使用不同 Session 的请求,还是进行负载均衡轮换的。
( 9 )保存“ httpd.conf ”文件后,依次启动 TC6-A 服务器、 TC6-B 服务器以及 Apache 服务器。
( 10 )接下来在浏览器地址栏输入“ http://localhost/OnlineShop ”,进入商品列表页面,就可以对此案例的功能进行最后测试了。读者会发现,再次使用购物车时,就不会有先前不正常的情况出现了。
到这里,就完成了整个集群中 Web 应用的开发与部署。

注意,最后一个购物车的实例,我没有附上源代码,因为代码其实很简单,重点在于这个实例最后解决的Session冲突问题.
这个问题在Apache+Tomcat集群上很严重,甚至很多网站运营后才发现这个问题.


Apache对session请求进行的是轮询.这将导致很严重的后果,一个匿名的用户,无意意中可能会得到注册用户的权限,并可以对其进行任意操作.所以这个问题一定要注意.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值