目录
集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就像是一个服务实体,但事实上集群由一组服务实体组成。
与单一服务实体相比较,集群提供了以下两个关键特性:
1,可扩展性——集群的性能不限于单一的服务实体,新的服 务实体可以动态地加入到集群,从而增强集群的性能。
2,高可用性——集群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,同样的服务可以由多个服务实体提供。如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。集群提供的从一个出 错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。
为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:
(1) 负载均衡——负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。
(2) 错误恢复——由于某种原因,执行某个任务的资源出现故障,另一服 务实体中执行同一任务的资源接着完成任务。这种由于一个实体中的资源不能工作,另一个实体中的资源透明的继续完成任务的过程叫错误恢复。
负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的。
集群主要分成三大类:高可用集群(High Availability Cluster/HA), 负载均衡集群(Load Balance Cluster),高性能计算集群(High Performance Computing Cluster/HPC)
(1) 高可用集群(High Availability Cluster/HA):一般是指当集群中有某个节点失效的情况下,其上的任务会自动转移到其他正常的节点上。还指可以将集群中的某节点进行离线维护再上线,该过程并不影响整个集群的运行。常见的就是2个节点做 成的HA集群,有很多通俗的不科学的名称,比如"双机热备", "双机互备", "双机",高可用集群解决的是保障用户的应用程序持续对外提供服 务的能力。
(2) 负载均衡集群(Load Balance Cluster):负载均衡集群运行时一般通过一个或者多个前端负载均衡器将工作负载分发到后端的一组服务器上,从而达到将工作负载分发。这样的计算机集群有时也被称为服务器群(Server Farm)。一般web服务器集群、数据库集群 和应用服务器集群都属于这种类型。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器 上。从检查其他服务器状态这一点上 看,负载均衡和容错集群很接近,不同之处是数量上更多。
(3) 高性能计算集群(High Performance Computing Cluster/HPC):高性能计算集群采用将计算任务分配到集群的不同计算节点而提高计算能力,因而主要应用在科学计算领域。这类集群致力于提供单个计算机所不能提供的强大的计算能力
通常配置tomcat集群有三种方式:使用DNS轮询,使用apache r-proxy代理方式,使用apache mod_jk方式。
(1)DNS轮询的缺点:当集群中某台服务器停止之后,用户由于dns缓存的缘故,便无法访问服务,必 须等到dns解析更新,或者这台服务器重新启动。还有就是必须把集群中的所有服务端口暴露给外界,没有用apache做前置代理的方式安全,并 且占用大量公网IP地址,而且tomcat还要负责处理静态网页资源,影响效率。优点是集群配置最简单,dns设置也非常简单。
(2)R- proxy的缺点:当其中一台tomcat停止运行的时候,apache仍然会转发请求过去,导致502网关错误。但是只要服务器再启动就不存 在这个问题。
(3)mod_jk方式的优点是,Apache 会自动检测到停止掉的tomcat,然后不再发请求过去。缺点就是,当停 止掉的tomcat服务器再次启动的时候,Apache检测不到,仍然不会转发请求过去。
R-proxy和mod_jk的共同优点是.可 以只将Apache置于公网,节省公网IP地址资源。可以通过设置来实现Apache专门负责处理静态网页,让Tomcat专门负责处理jsp和 servlet等动态请求。共同缺点是:如果前置Apache代理服务器停止运行,所有集群服务将无法对外提供。R-proxy和 mod_jk对静态页面请求的处理,都可以通设置来选取一个尽可能优化的效果。这三种方式对实现最佳负载均衡都有一定不足,mod_jk相对好些,可以通过设置lbfactor参数来分配请求任务。
Apache+ Tomcat整合的目标:
(1) 可以提高整体web服务器性能,将动态页面交给tomcat处理,将静态文件交给apache处理,可以大大提高服务器的静态文件处理性能。
(2) 可以实现web服务器的负载均衡,服务器可采用集群的方式来响应客户端请求。Apache的作用是做代理,将请求分发给各个tomcat处理,tomcat作为集群服务器处理请求。这样可以提高整体web服务器性能和访问量。
(3) 可以实现无缝升级应用程序和容错处理,在tomcat集群中如果有一个tomcat挂掉了,用户还可以通过其他tomcat来进行访问,同时如果我们想升级应用程序,我们可以通过升级每个tomcat的应用程序来实现升级,在升级的过程中不会影响web服务器的访问。
下面就是以1个apache+2个tomcat通过mod_jk配置集群。
所需软件包:
JDK:jdk-8u181-linux-x64.tar.gz
Apache:httpd-2.4.34.tar.gz,apr-1.6.3.tar.gz,apr-util-1.6.1.tar.gz,pcre-8.38.tar.gz
Tomcat:apache-tomcat-8.5.32.tar.gz
Mod_jk:mod_jk-1.2.31-httpd-2.2.x.so
服务器:
服务器系统版本信息:CentOS Linux 7 (Core)
服务器IP:192.168.17.130
将下载好的软件保存到服务器上:目录为/usr/softwares,也可以建立其他文件夹保存。
JDK:jdk-8u181-linux-x64.tar.gz
Apache:httpd-2.4.34.tar.gz,apr-1.6.3.tar.gz,apr-util-1.6.1.tar.gz,pcre-8.38.tar.gz
Tomcat:apache-tomcat-8.5.32.tar.gz
Mod_jk:tomcat-connectors-1.2.43-src.tar.gz
(Mod_jk下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors)
1) 拷贝软件包
[root@172-30-4-6 ~] mkdir /usr/java #创建jdk安装目录
[root@172-30-4-6 ~] cd /usr/softwares #进入jdk软件包目录
[root@172-30-4-6 tomcattest] cp jdk-8u181-linux-x64.tar.gz /usr/java #将jdk安装文件拷贝到安装目录
2) 安装JDK
[root@172-30-4-6 tomcattest] cd /usr/java #进入jdk安装目录
[root@172-30-4-6 java] tar -xzvf jdk-8u181-linux-x64.tar.gz #解压jdk文件包
3) 配置环境变量
[root@172-30-4-6 java] vim /etc/profile #修改系统环境变量文件
#添加内容如下:
export JAVA_HOME=/usr/java/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
4) 测试
[root@172-30-4-6 profile] java -version #查看java安装版本
显示结果:java version "jdk1.8.0_181"
1) 解压
[root@172-30-4-6 ~] cd /usr/softwares #进入apr软件包目录
[root@172-30-4-6 softwares] tar -xzvf apr-1.6.3.tar.gz #解压apr安装文件
2) 安装
[root@172-30-4-6 softwares] cd apr-1.6.3 #进入apr安装目录
[root@172-30-4-6 apr-1.6.3] ./configure --prefix=/usr/apr # configure参数可以自己根据需要修改,可以使用—help获得相关命令参数信息。
注意:
1.configure过程中可能会报no acceptable C compiler found in $PATH错误
原因:缺少c语言编译工具
解决方法:yum install gcc下载此软件后重新configure即可;
2.configure过程中可能会报cannot remove 'libtoolT': No such file or directory错误
此时vim configure编辑文件,找到RM='$RM'改为RM='$RM -f',保存退出重新configure即可。
[root@172-30-4-6 apr-1.6.3] make #编译
[root@172-30-4-6 apr-1.6.3] make install #安装
完成安装apr
1) 解压
[root@172-30-4-6 ~] cd /usr/softwares #进入apr-util软件包目录
[root@172-30-4-6 softwares] tar -xzvf apr-util-1.6.1.tar.gz #解压apr-util安装文件
2) 安装
[root@172-30-4-6 softwares] cd apr-util-1.6.1 #进入apr-util安装目录
[root@172-30-4-6 apr-util-1.6.1] ./configure --prefix=/usr/apr-util --with-apr=/usr/apr # configure参数可以自己根据需要修改,可以使用—help获得相关命令参数信息。
[root@172-30-4-6 apr-util-1.6.1] make #编译
注意:
1.make过程中可能会报错:
xml/apr_xml.c:35:19: 致命错误:expat.h:没有那个文件或目录
#include <expat.h>
^
编译中断。
make[1]: *** [xml/apr_xml.lo] 错误 1
make[1]: 离开目录“/usr/softwares/apr-util-1.6.1”
make: *** [all-recursive] 错误 1
原因:缺少expat库
解决方法:yum install expat-devel
[root@172-30-4-6 apr-util-1.6.1] make install #安装
完成安装apr-util
1) 解压
[root@172-30-4-6 ~] cd /usr/softwares #进入apr-util软件包目录
[root@172-30-4-6 softwares] tar -xzvf pcre-8.38.tar.gz #解压pcre安装文件
2) 安装
[root@172-30-4-6 softwares] cd pcre-8.38 #进入pcre安装目录
[root@172-30-4-6 pcre-8.38] ./configure --prefix=/usr/pcre
注意:
1.configure过程中可能会报错:
configure: error: You need a C++ compiler for C++ support.
原因:缺少c++的编译器
解决方法:yum install -y gcc gcc-c++
[root@172-30-4-6 pcre-8.38] make #编译
[root@172-30-4-6 pcre-8.38] make install #安装
完成安装pcre
1) 解压
[root@172-30-4-6 ~] cd /usr/softwares #进入apache软件包目录
[root@172-30-4-6 softwares] tar -xzvf httpd-2.4.34.tar.gz #解压apache安装文件
2) 安装
[root@172-30-4-6 softwares] cd httpd-2.4.34 #进入apache安装目录
[root@172-30-4-6 httpd-2.4.34] ./configure --prefix=/usr/apache --with-apr=/usr/apr --with-apr-util=/usr/apr-util --with-pcre=/usr/pcre
[root@172-30-4-6 httpd-2.4.34] make #编译
注意:
1.若报错
collect2: error: ld returned 1 exit status
make[2]: *** [htpasswd] 错误 1
make[2]: 离开目录“/usr/softwares/httpd-2.4.34/support”
make[1]: *** [all-recursive] 错误 1
make[1]: 离开目录“/usr/softwares/httpd-2.4.34/support”
make: *** [all-recursive] 错误 1
原因:缺少libtool-ltdl-devel
解决方法:yum install libtool-ltdl-devel 并重新编译安装apr-util
[root@172-30-4-6 httpd-2.4.34] make install #安装
3) 启动
[root@172-30-4-6 httpd-2.4.34] cd /usr/apache/ #进入apache安装目录
[root@172-30-4-6 apache] ./bin/apachectl start #启动apache服务器
注意:
1.若报错
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
原因:没有设置ServerName
解决方法:在配置文件conf/httpd.conf中加入一行“ServerName localhost:80”即可
重启apache服务器:./bin/apachectl restart
4) 测试
访问apache服务器:http://192.168.17.130/
若非本机访问时,访问不了则需要打开防火墙80端口。
响应结果:It works! #apache服务器安装成功
apache相关命令:
前提,需要在apache的安装编译后的目录下
./bin/apachectl start #开启apache服务
./bin/apachectl stop #停止apache服务
./bin/apachectl restart #重启apache服务
1. 解压
[root@172-30-4-6 ~] mkdir /usr/tomcat #创建tomcat文件夹
[root@172-30-4-6 ~] cd /usr/softwares #进入tomcat软件包目录
[root@172-30-4-6 ~] mv apache-tomcat-8.5.32.tar.gz /usr/tomcat/apache-tomcat-8.5.32.tar.gz #将tomcat软件包移至tomcat文件夹下
[root@172-30-4-6 tomcat] tar –xzvf apache-tomcat-8.5.32.tar.gz #解压tomcat安装包
2. 安装
[root@172-30-4-6 tomcat] cp -a apache-tomcat-8.5.32 apache-tomcat-8.5.32_1 #tomcat1
[root@172-30-4-6 tomcat] mv apache-tomcat-8.5.32 apache-tomcat-8.5.32_2 #tomcat2
3. 配置
因为该例子是在同一台服务器上安装两个tomcat服务器,避免服务器端口使用冲突,tomcat1端口采用默认配置,tomcat2端口需要重新配置。
[root@172-30-4-6 tomcat] cd /usr/tomcat/apache-tomcat-8.5.32_2/conf #进入tomcat2配置目录,可修改server.xml配置文件
[root@172-30-4-6 tomcat] cd /usr/tomcat/apache-tomcat-8.5.32_1/conf #进入tomcat1配置目录,可修改server.xml配置文件
[root@172-30-4-6 conf] vim server.xml #修改tomcat2配置文件
(1) 修改server端口号
#tomcat1 默认配置
<Server port="8005" shutdown="SHUTDOWN">
#tomcat2 修改端口号为9005
<Server port="9005" shutdown="SHUTDOWN">
(2) 修改HTTP connector端口号
#tomcat1默认配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#tomcat2 修改端口号为9080
<Connector port="9080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
(3) 修改 AJP connector 端口号
注意:此端口号是为了与前端服务器apache对接,若apache与tomcat不在同一台机器,则需要让防火墙开放该端口号8009/9009
#tomcat1 默认配置
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
#tomcat2 修改端口号9009
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
(4) 修改 engine 名称
#tocmat1 修改jvmRoute=”tomcat1”
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
#tocmat2 修改jvmRoute=”tomcat2”
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
4. 启动
[root@172-30-4-6 tomcattest] /usr/tomcat1/bin/startup.sh #启动tomcat1
[root@172-30-4-6 tomcattest] /usr/tomcat1/bin/startup.sh #启动tomcat2
5. 测试
#tomcat1测试
http://192.168.17.130:8080
#tomcat2 测试
http://192.168.17.130:9080
若非本机访问时,访问不了则需要打开防火墙80端口。
结果:显示tomcat首页
1) 解压
[root@172-30-4-6 ~] cd /usr/softwares #进入mod_jk软件包目录
[root@172-30-4-6 softwares] tar -xzvf tomcat-connectors-1.2.43-src.tar.gz #解压mod_jk安装文件
2) 安装
[root@172-30-4-6 softwares] cd tomcat-connectors-1.2.43-src/native #进入pcre安装目录
[root@172-30-4-6 native] ./configure --with-apxs=/usr/apache/bin/apxs
[root@172-30-4-6 native] make #编译
[root@172-30-4-6 native] make install #安装
[root@172-30-4-6 native] make clean #清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
此时,mod_jk.so会安装在/usr/apache/modules/mod_jk.so
完成安装mod_jk
1, httpd.conf的配置
[root@172-30-4-6 ~] cd /usr/apache/conf #进入apache配置目录
[root@172-30-4-6 conf] vim httpd.conf #修改httpd.conf配置文件
#增加include配置
Include conf/mod_jk.conf
2, mod_jk.conf的配置
[root@172-30-4-6 conf] touch mod_jk.conf #创建mod_jk.conf文件
[root@172-30-4-6 conf] vim mod_jk.conf #修改mod_jk配置
#mod_jk 配置mod_jk包
LoadModule jk_module modules/mod_jk.so
#workers 配置工作负责文件
JkWorkersFile conf/workers.properties
#jk log 配置jk日志文件
JkLogFile logs/mod_jk.log
#jk log leve 配置日志级别
JkLogLevel info
# 配置jk日志内存共享
JkShmFile logs/mod_jk.shm
#balancer 配置负载均衡模式,此处过滤.jsp结尾的文件负载均衡到各个服务器上
JkMount /*.jsp balancer
[root@172-30-4-6 conf] cp /usr/softwares/mod_jk-1.2.31-httpd-2.2.x.so /usr/apache/modules #将mod_jkb包拷贝到apache的modules目录下
3, workers.properties的配置
[root@172-30-4-6 conf] touch workers.properties #创建worker.properties文件
[root@172-30-4-6 conf] vim workers.properties
#worker的变量
worker.list=balancer,jk_watcher,tomcat1,tomcat2
#tempalte 负载模板配置
worker.template.type=ajp13
#worker全局的重试次数,在apache服务器启动后,会最多尝试若干次连接这些负载均衡服务器,若连接不上则任务down掉
worker.retries=3
#balancer 负载配置
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2
worker.balancer.sticky_session=true
#tomcat1的配置
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.17.130
worker.tomcat1.reference=worker.template
worker.tomcat1.activation=A
#worker.tomcat1.lbfactor=1 #lbfactor值越大,表示被分配的负载越大
#tomcat2 的配置
worker.tomcat2.port=9009
worker.tomcat2.host=192.168.17.130
worker.tomcat2.reference=worker.template
worker.tomcat2.activation=A
#worker.tomcat2.lbfactor=1 #lbfactor值越大,表示被分配的负载越大
#负载均衡监视器
worker.jk_watcher.type=status
worker.jk_watcher.read_only=false
worker.jk_watcher.mount=/jkStatus
在workers.properties文件中的jk_warcher为负载均衡监视器,这里配置后可以直接通过链接http://192.168.17.130/jkStatus访问。
worker.jk_watcher.mount=/jkStatus,即是设置访问链接名
新建一个项目:项目名称都为TestTomcat
新建一个jsp页面:名称为testjsp.jsp
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎访问</title>
</head>
<body>
<%
System.out.println(new Date()+"=============tomcat1=================");
%>
tomcat1=======<%=new Date()%>
</body>
</html>
(1)将测试项目发布到tomcat1服务器上 。
(2)修改项目testjsp.jsp文件
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎访问</title>
</head>
<body>
<%
System.out.println(new Date()+"=============tomcat2=================");
%>
tomcat2=======<%=new Date()%>
</body>
</html>
(3)将修改后的项目发布到tomcat2服务器上
分别在不同的客户端上访问apache代理服务器。
http://192.168.17.130/TestTomcat/testjsp.jsp
访问结果:
tomcat2=======Wed Jun 29 13:25:03 CST 2011
或者
tomcat1======Wed Jun 29 13:26:03 CST 2011
在Tomcat集群中实现session同步,可以通过session共享和复制来实现,下面以session复制来实现session同步。
修改部署的所有tomcat的相应配置文件,这里只显示其中一个tomcat下的配置文件修改,其他类似。
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_1/conf #进入tomcat配置目录
[root@172-30-4-6 conf] vim server.xml #修改server.xml配置
# 在<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">后面加上以下配置:
<!--
Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点.
className 表示tomcat集群时,之间相互传递信息使用那个类来实现信息之间的传递.
channelSendOptions可以设置为2、4、8、10,每个数字代表一种方式
2 = Channel.SEND_OPTIONS_USE_ACK(确认发送)
4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送)
8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(异步发送)
在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性,此时channelSendOptions设为10
-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<!--
Manager决定如何管理集群的Session信息。Tomcat提供了两种Manager:BackupManager和DeltaManager
BackupManager-集群下的所有Session,将放到一个备份节点。集群下的所有节点都可以访问此备份节点
DeltaManager-集群下某一节点生成、改动的Session,将复制到其他节点。
DeltaManager是Tomcat默认的集群Manager,能满足一般的开发需求
使用DeltaManager,每个节点部署的应用要一样;使用BackupManager,每个节点部署的应用可以不一样.
className-指定实现org.apache.catalina.ha.ClusterManager接口的类,信息之间的管理.
expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有Session失效
notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否通知session listeners
maxInactiveInterval-集群下Session的有效时间(单位:s)。
maxInactiveInterval内未活动的Session,将被Tomcat回收。默认值为1800(30min)
-->
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<!--
Channel是Tomcat节点之间进行通讯的工具。
Channel包括5个组件:Membership、Receiver、Sender、Transport、Interceptor
-->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<!--
Membership维护集群的可用节点列表。它可以检查到新增的节点,也可以检查到没有心跳的节点
className-指定Membership使用的类
address-组播地址
port-组播端口,此端口必须让防火墙开放
frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500
dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000
注: 组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。
一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。
它提高了数据传送效率,减少了骨干网络出现拥塞的可能性
相同组播地址、端口的Tomcat节点,可以组成集群下的子集群
-->
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<!--
Receiver : 接收器,负责接收消息
接收器分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式)
className-指定Receiver使用的类
address-接收消息的地址
port-接收消息的端口,若tomcat集群不在同一台机器,则需要让防火墙开放该端口
autoBind-端口的变化区间
如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听
selectorTimeout-NioReceiver内轮询的超时时间
maxThreads-线程池的最大线程数
-->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" #默认为auto,改为自己的IP
port="4000" #同一台服务器上的tomcat必须修改为不同的端口,tomcat1修改为4001,tomcat2修改为4002。
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<!--
Sender : 发送器,负责发送消息
Sender内嵌了Transport组件,Transport真正负责发送消息
-->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<!--
Transport分为两种:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)
-->
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<!--
Interceptor : Cluster的拦截器
TcpFailureDetector-网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,
此时TcpFailureDetector可以拦截到某个节点关闭的信息,
并尝试通过TCP连接到此节点,以确保此节点真正关闭,从而更新集群可以用节点列表
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<!--
MessageDispatch15Interceptor-查看Cluster组件发送消息的方式是否设置为
Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。
设置为Channel.SEND_OPTIONS_ASYNCHRONOUS时,
MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<!--
Valve : 可以理解为Tomcat的拦截器
ReplicationValve-在处理请求前后打日志;过滤不涉及Session变化的请求,如客户端对图片,css,js的请求就不会涉及Session,因此不需检测,filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"
JvmRouteBinderValve-Apache的mod_jk发生错误时,保证同一客户端的请求发送到集群的同一个节点
-->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<!--
Deployer : 同步集群下所有节点的一致性
-->
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<!--
ClusterListener : 监听器,监听Cluster组件接收的消息
使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager
-->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
#分别给集群中每个tomcat在Engine后添加cluster配置,需要修改有#注释的配置:
address=”172.30.4.6” #本机IP地址
port=”4001” #同一机器需要修改端口号,tomcat1为4001,tomcat2为4002
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_1/webapps #进入到web应用项目中
[root@172-30-4-6 webapps] vim TestTomcat/WEB-INF/web.xml #修改web.xml
#在web.xml文件中的</web-app>前面加入
<!--此应用将与群集服务器复制Session-->
<distributable/>
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_1/webapps/TestTomcat #进入到web应用项目中
[root@172-30-4-6 webapps] vim /TestTomcat/testjsp.jsp #修改testjsp.jsp
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎访问</title>
</head>
<body>
<%
System.out.println(new Date()+"=============tomcat1=================");
session.setAttribute("tomcat1", "I am tomcat1");
%>
tomcat1=======<%=new Date()%>===<%=session.getId()%>==<%=session.getAttribute("tomcat1")%>==<%=session.getAttribute("tomcat2")%>
</body>
</html>
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_2/webapps/TestTomcat #进入到tomcat2的web应用项目中
[root@172-30-4-6 webapps] vim /TestTomcat/testjsp.jsp #修改testjsp.jsp
<%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎访问</title>
</head>
<body>
<%
System.out.println(new Date()+"=============tomcat2=================");
session.setAttribute("tomcat2", "I am tomcat2");
%>
tomcat2=======<%=new Date()%>===<%=session.getId()%>==<%=session.getAttribute("tomcat1")%>==<%=session.getAttribute("tomcat2")%>
</body>
</html>
测试结果发现,session不共享
访问http://192.168.17.130:8080/TestTomcat/testjsp.jsp结果显示
tomcat1=======Wed Aug 08 17:50:57 CST 2018===D60E9F76D432FEDB069442B284702913.tomcat1==I am tomcat1==null
访问http://192.168.17.130:9080/TestTomcat/testjsp.jsp结果显示
tomcat2=======Wed Aug 08 17:42:08 CST 2018===2CB5D868D39A4E8F47F2548DB16690D5.tomcat2==null==I am tomcat2
在这一步费了我一个下午加晚上的时间,终于找到原来是防火墙的锅,就是在4.1.1的server.xml文件配置的时候,有一个menbership标签的组播形式,需要开一个45564的端口(默认端口也是45564),否则session无法共享。
解决方法有两种:
第一种简单粗暴,直接关闭防火墙,再重启apache服务即可。
#关闭防火墙
systemctl stop firewalld
#重启apache服务
cd /usr/apache
./bin/apachectl restart
第二种方法,防火墙开启45564端口
#开启45564端口
firewall-cmd --zone=public --add-port=45564/udp --permanent
firewall-cmd --reload
#查看所有打开的端口
firewall-cmd --zone=public --list-ports
#重启apache服务
cd /usr/apache
./bin/apachectl restart
测试结果如下,成功解决了session不共享的问题
访问http://192.168.17.130:8080/TestTomcat/testjsp.jsp结果显示
tomcat1=======Wed Aug 08 20:12:43 CST 2018===12B141B8BEDD905A893937119506D70B.tomcat1==I am tomcat1==I am tomcat2
访问http://192.168.17.130:9080/TestTomcat/testjsp.jsp结果显示
tomcat2=======Wed Aug 08 20:12:48 CST 2018===12B141B8BEDD905A893937119506D70B.tomcat2==I am tomcat1==I am tomcat2
至此,在centos7系统上的一个简单apache2+tomcat8+mod_jk的tomcat集群就搭建完成了。
总结,tomcat集群就是,一个前端服务器apache2,加上若干个后端服务器tomcat8,通过mod_jk来配置形成传说中的tomcat集群服务器。这里需要注意的是,防火墙端口号的开放。若apache2和若干个tomcat8均在不同的机器上,则需要以下几个端口号的开放,第一,tomcat与前端服务器对接的tcp端口号(默认8009),第二,tomcat间session共享时的组播地址的udp端口号(默认45564),第三,tomcat间session共享时的接收信息的tcp端口号(默认4000),同时该接收信息的ip地址也要注意须改为本机的IP地址(默认auto)。