一、 为什么要用集群?
- 如果项目都在在一台计算机的服务器上,若这台计算机出现问题,则会导致整个项目无法运行。
- 一台计算机的并发量有限,理论上单节点tomcat能够稳定的处理请求并发量200-300,若多台计算机一同运行则能显著提高效率。
二、 集群带来的好处
-
负载均衡
也叫垂直集群,将多个服务器,安装在同一个计算机上。这样的系统非常适合于运行同一组应用程序的大量用户。每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。 -
失败迁移
也叫水平集群,将服务器安装在各个不同的计算机上。若一台计算机出现问题,越不会连累其他计算机。
三、 模拟实现集群
- 首先下载apache服务器工具(此apache是一个服务工具,不是之前理解的 基金组织。)
- 配置刚刚下载的apache
-
如图路径打开httpd.conf配置文件
-
根据自己下载的Apache路径配置
-
执行命令注册apache服务
a. 以管理员身份打开cmd执行命令: “D:\cluster\httpd\Apache24\bin\httpd.exe” -k install -n apache24
执行cmd命令:b. 如果在注册apache服务时,提示“丢失VCRUNTIME140.DLL”,则需要下载并安装vc_redist.x64.exe。下载地址https://www.microsoft.com/en-US/download/details.aspx?id=48145
-
注册成功后查看服务是否开启
- 复制两份tomcat到apache24目录下,并改名为tomcata和tomcatb供以后分辨
在ClusterProject中创建一个WEB-INF包和index.jsp,在WEB-INF包下创建web.xml文件(.idea不用创建,运行后会自动生成)
在tomcata中的ClusterProject项目的index.jsp中填入以下代码待之后运行,title为tomcata,tomcatb中同理,只要将title改为tomcatb即可
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>tomcata</title>
</head>
<body>
服务器地址
<%
out.print(request.getRemoteAddr()+":"+request.getLocalPort());
%>
sessionID:
<%
out.print(session.getId());
%>
</body>
</html>
- 规划并修改接口:server.xml
将tomcata/conf和tomcata/conf中的server.xml文件端口号修改为以下:server端口号 http协议端口 ajp协议端口号 tomcat-a: 1005 1080 1009 tomcat-b 2005 2080 2009
若AJP为注解,打开修改即可 - 配置引擎Engine
也是在service.xml文件中,增加jvmRoute(以tomcata为例):
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat-a">
- 打开集群开关
打开以下注释:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
- tomcat集群配置搞定,下载mod_jk.so,找到其中的中的httpd.zip
- 配置mod_jk.so
a. 存放到位置,\Apache24\modules\mod_jk.so
b. \Apache24\conf\下创建配置文件配置workers.properties,并按下图修改配置文件
worker.list=controller,tomcata,tomcatb
#tomcata,lbfactor为1:2,tomcatb比tomcata更容易获得请求
worker.tomcata.port=1009
worker.tomcata.host=localhost
worker.tomcata.type=ajp13
worker.tomcata.lbfactor=1
#tomcatb
worker.tomcatb.port=2009
worker.tomcatb.host=localhost
worker.tomcatb.type=ajp13
worker.tomcatb.lbfactor=2
#controller
worker.controller.type=lb
worker.controller.balanced_workers=tomcata,tomcatb
worker.controller.sticky_session=false
分布式session策略:
- sticky:固定将每一个用户的请求 分给特定的服务器,后期的请求不会分给其他服务器
- session广播(自动同步session): 自动同步session,弊端:如果服务器太多,可能造成广播风暴(将一个服务器的session,需要同步到其他所有的服务器中)
- 集中管理方式(推荐):将各个服务器的session集群存储到一个 数据库中
- 配置\Apache24\conf\mod_jk.conf (用于加载mod_jk.so和workers.properties)
#加载mod_jk.so和workers.properties
LoadModule jk_module modules/mod_jk.so
#加载workers.properties
JkWorkersFile conf/workers.properties
JkMount /* controller
其中JkMount /* controller,表示拦截一切请求。也可以之拦截jsp: /*.jsp
执行顺序为mod_jk.so,workers.properties ->mod_jk.conf -> apache程序会自动加载httpd.conf
-
配置Apache/conf/httpd.conf: include conf/mod_jk.conf
在apache启动时自动加载mod_jk.conf -
配置完成
环境变量中的CATALINA_HOME会使启动tomcat时自动开启CATALINA_HOME指定的tomcat。而集群 需要开启多个不同的tomcat,因此在单机环境下,需要删除CATALINA_HOME。
四、 测试
- 依次打开tomcata/bin/startup.bat和tomcatb/bin/startup.bat
- 开启后在网址栏输入localhost/ClusterProject/index.jsp(apache端口号默认为80,所以可以不用填)。
刷新几次后发现tomcatb的次数多于tomcata,是因为我们之前在配置文件你中设置了worker.tomcata.lbfactor的值导致的。
大功告成!