Tomcat集群实现负载均衡,搭建种类有2种:
Tomcat安装包中有文档:
file:///D:/test/apache-tomcat-8.0-x32-8109/webapps/docs/balancer-howto.html
第一种:
apache+tomcat+mod_jk
第二种
apache+tomcat+mod_proxy
我们的应用软件的java开发的管理系统,服务器Tomcat8,数据库mysql,包括jdk在内都是32位的;要对大量的web请求实现负载均衡,session共享
Apache2.4作为请求转发器,tomcat1,tomcat2 实现负载均衡、session共享,其中一个宕机,业务依然正常运行
目标1:搭建apache+tomcat实现集群,达到请求负载均衡
目标2:同一会话保持session状态数据,采用粘性session。(这里涉及粘性session和复制session的区别,下面会介绍)
由于不考虑64位情况,统一都是win32机器配置;jdk/tomcat8/apache2.4都是32位
其中jdk和tomcat8下载和安装不再赘述;
Apache统一下载地址:
万事问百度:
度娘好美丽
选择最新的apache,点击download
(这个图是后补上的)
下面的页面红线字体表示apache官方只提供源码,不提供二进制,大网站就是牛!如需要二进制的,需要用下面框框的第三方地址
我选择apache Lounge(apache haus里面我没找到方案1中用到的mod_jk,故选择了Lounge)
!!!!!!!上面的的红字说:如果没有安装vc14此处会报错!如果您的不知所以,最好下载都装上(反正我装了)
下面这个是搭建方案1时用到的mod_jk.so(下载zip,解压里面的mod_jk.so即是)
上文中已经提到了,这里只是强调下
解压后如图:
建议将Apache24直接copy到C盘根目录,如下图:
Apache默认即使c盘根目录,
关键词:ServerAdmin [email protected]这是Apache管理员Email地址,改不改无所谓。
关键词:#ServerNamewww.example.com:80这是Apache的服务器地址,这个地方必须把前面的”#“去掉,把”www.example.com“改成”localhost“或127.0.0.1。
效果如图:
如果放在这里,其他都不用改了,采用默认即可,直接运行bin/httpd.exe即可,不要关闭窗口(一个个啥都没有的黑黑的窗口);打开浏览器输入localhost,出现it works!
OK!!
注意2点:
1 只要双击httpd.exe后,无法保持黑窗口状态,即秒关闭或停一会消失都是conf/httpd.conf配置有问题
2 如果修改路径,不能带中文,至于具体修改路径的解析,见下文
由于apache二进制包是第三方做的,先阅读下第三方的readme.txt
注意目录是/(正斜杠);不是反斜杠\
具体在:
httpd.exe -k install 安装apache,采用默认服务名
httpd.exe -k uninstall 卸载
httpd.exe -k install -n "apache24" 可以指定安装的服务名
httpd.exe -k uninstall -n "Apache24" 卸载指定名称的apache服务
net start apache24 启动windows服务
net stop apache24 停止服务
Httpd –k install –npipewelding
Httpd –k uninstall –npipewelding
Httpd –k start –npipewelding
Httpd –k stop –npipewelding
将下载好的mod_jk.so放到{apache_home}/modules /下
修改httpd.conf,在其末尾追加下面一句话
include conf/mod_jk.conf
如图:
http.conf 同目录下,创建 mod_jk.conf 文件,内容如下:
#加载 mod_jk.so 模块
LoadModule jk_module modules/mod_jk.so
#加载mod_jk.so 配置文件
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制#器 ( 比如制定 jsp 文件:JkMount/*.jspcontroller )
JkMount /* controller
http.conf 同目录下,创建workers.properties文件 ,内容如下:
#===server 列表
worker.list = controller,tomcat1,tomcat2
#========tomcat1 需要注意此名字对应tomcat中server.xml
#==ajp13端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.0.21
worker.tomcat1.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.tomcat1.lbfactor=1
#========tomcat2========
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.0.22
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#========负载均衡器controller========
worker.controller.type=lb
#指定分担请求的tomcat
worker.controller.balance_workers=tomcat1,tomcat2
worker.controller.sticky_session=1
(即:修改tomcat配置文件server.xml)
打开tomcat1/conf/server.xml文件
然后:
内容位置在tomcat安装包里的doc里如下:
和tomcat1配置相同,只是将
中的jvmRoute="tomcat1"改为jvmRoute="tomcat2"
创建目录test
创建目录test/WEB-INF
创建文件test/index.jsp
创建文件test/WEB-INF/web.xml
web.xml内容:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> 集群必须 --> index.jsp内容: <%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@pageimport="java.util.*"%>
<%
String sessionid = session.getId();
System.out.println("当前sessionid =" + sessionid);
// 如果有新的 Session 属性设置
String dataName = request.getParameter("dataName");
if(dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("Session 属性列表
");
System.out.println("============================");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"
");
System.out.println( name + " = " + value);
}
%>
将apache放置在ip=192.168.0.20机器上(这个放置时注意目录位置)
tomcat1在192.168.0.21(必须有JAVA_HOME才能启动)
tomcat2在192.168.0.22(必须有JAVA_HOME才能启动)
先启动apache,在启动tomcat1、tomcat2即可
在任意机器上打开浏览器,输入http://192.168.0.20/test/index.jsp
1负载均衡测试:
由于同一个浏览器的多个页签是session会话共享的,所以建议使用多个浏览器
我使用IE11、firefox、Ghrome、opera
针对http://192.168.0.20/test/index.jsp,在4个浏览器分别访问,通过tomcat1、tomcat2的黑窗口日志可看到,4个请求被分摊了,tomcat1有2个请求、tomcat2有2个
2 保持session会话
因为我们是管理系统,必然要求在同一个session会话时,会话里的用户数据、权限信息必须能保持住,即用户在同一个会话的jsp中所有ajax请求先后信息要能一致的
使用firefox测试
访问http://192.168.0.20/test/index.jsp,添加几个session属性后,发现属性都列了出来,信息的童鞋通过tomcat日志也会发现,同一个会话的请求必然在固定的tomcat下处理,不会被分配到其他tomcat处理,显然,这种机制必然能保证session会话信息
3 某个tomcat宕机,会话能维持吗?
在2基础上,经过测试,服务于同一个会话的tomcat1宕机后,如果客户端浏览器继续访问,会话中保存的数据会消失,重新开始记录新的数据!
显然,2和3符合粘性session的要求(定义参考上面的“区别:粘性session和复制session的”)
(待补充)
第一, 文件同步,
第二, 第二,磁盘共享,
第三, 第三,tomcat虚拟路径映射。
前两种都是靠操作系统和其他软件处理。
这里讲解第三种。
配置方法如下两种任选,这样就解决
1. 在.%TOMCAT_HOME%\conf\Catalina\localhost建立一个xml文件 里面写上
reloadable="true">
2.打开%TOMCAT_HOME%\conf\server.xml文件
在 debug="0"reloadable="true"/> 采用方案1 网上有如下几个思路: {{ 文件的上传只能由tomcat服务器做处理,包括创建缩略图,写入路径至数据库,所以无法采用nginx自带的文件上传模块; 文件需要能被接口直接访问,路径需要写入数据库 考虑到的几种解决方案; 1.采用负载均衡策略,文件上传动态的分配至tomcat服务器处理,数据库中文件路径填写nginx服务器上的文件文件路径,然后每台服务器定时和nginx服务器做文件同步,最终文件下载时使用nginx直接处理; 2.采用负载均衡策略,文件上传动态的分配至tomcat服务器处理,数据库中文件路径填写tomcat服务器文件路径,并加上特殊前缀(唯一对应此台tomcat服务器);文件下载时,nginx配置一个前缀转发规则,不同的前缀转发至具体tomcat服务器; 3.采用负载均衡策略,文件上传动态的分配至tomcat服务器处理,数据库中文件路径填写tomcat服务器上的文件文件路径,然后每台tomcat服务器定时互相文件同步,最终文件下载时使用nginx动态分配至tomcat直接处理; 4.文件的上传指定nginx服务器上的tomcat处理,下载使用nginx处理; 优劣暂时就不写了,理解下,后期再给出吧;最终采用的策略是4(最简单) }} !!!决定采用方法4,通过apache将和文件上传、下载(临时性的除外)有关的url使用同一个worker(tomcat),参考《方案1-第三步》形如JkMount /* controller,来指定特定url 例如:JkMount /* tomcat1,来专门处理特定url(和文件存储相关),而无需负载均衡 当然安全一点的话,且如果集群和小,比如只有2台的话,可以弄个定时器,让负责文件的tocmat启动定时器,晚上打包所有文件一起同步到其他tomcat下 转载地址: http://blog.csdn.net/qq_17612199/article/details/52517603 tomcat集群中的session管理,主要有两种方式: 粘性session 表示从同一窗口发来的请求都将有集群中的同一个tomcat进行处理 worker.lbcontroller.sticky_session=True 粘性session的好处在不会在不同的tomcat上来回跳动处理请求,但是坏处是如果处理该session的tomcat崩溃,那么之后的请求将由其他tomcat处理,原有session失效而重新新建一个新的session,这样如果继续从session取值,会抛出nullpointer的访问异常。 session复制 session复制是指tomcat彼此之间通过组播方式将session发到各个tomcat实例上,如果其中一个访问出错,则另外tomcat仍然具有有效的session内容,从而能正常接管其session。坏处是当tomcat实例很多,或者用户在session中有大量操作时,组播发送的信息量十分惊人。session复制配置则是在发布的web应用程序中的web.xml中添加 此外,session复制所需的JDK必须是JDK 5.0及其以上版本。 失败如图: 解决方法: 原文: https://blog.csdn.net/su749520/article/details/78984773 即缺少VC库,要安装VC14,这个apache官网提到的必要条件。必须装VC14或VC15;具体参考下文《V14安装成功的必要条件》 仅支持以下系统: 原文: http://www.iszip.com/post/VC14setupfailed.html v14安装失败,即 安装失败的原因在于,您当前的体统不符合上文的规定系统,点开“日志文件”,会发现 往右侧看看。。。 找到这个补丁,双击下, 原来是这个补丁安装失败,此更新不适合您的计算机。 我们百度下这个更新为什么装不上。。。 我查看下自己机器,是win7专业版,应该是少了个系统补丁sp1 其他方法: 若要安装此更新,您必须 2014 年 4 月累积更新 WindowsRT 8.1、 Windows 8.1 和 Windows Server 2012 R2 (2919355) 安装在 Windows 8.1 或 WindowsServer 2012 R2 上。 或者安装 Windows 7 的 WindowsServer 2008 R2 的 Service Pack 1. 或者安装 Service Pack 2 适用于 WindowsVista 和 Windows server 2008. 亲测 旗舰版额sp1 都没问题 但是专业版,没有sp1 ,测试也是不行的, 先将win7更新至最新 然后安装sp1 补丁包:windows6.1-KB976932-X64.exe 下载地址: https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=5842 解决方案如下: 先安装补丁 KB2919442 立即下载基于 x64 的 Windows Server 2012 R2 的KB2919442补丁。 下载地址 https://www.microsoft.com/zh-cn/download/details.aspx?id=42153 KB2919442 安装完成后,继续安装 Windows Server 2012 R2 Update (KB2919355) 所有补丁,如下 下载地址 立即下载基于 x64 的 WindowsServer 2012 R2 更新软件包。 KB2919442 is a prerequisite for WindowsServer 2012 R2 Update and should be installed before attempting to installKB2919355 方法1 文件同步
FAQ
区别:粘性session和复制session
apache测试启动失败的解决方案
V14安装成功的必要条件
此更新适用于以下操作系统:
Win7 sp1
Win7 升级sp1补丁
Win2012R2