tomcat集群搭建及实现细节

文件下载地址:

https://download.csdn.net/download/rainyspring4540/10351699

背景

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即是)

 

确保安装过V15或V14

         上文中已经提到了,这里只是强调下

安装Apache2.4

解压后如图:

建议将Apache24直接copy到C盘根目录,如下图:

Apache默认即使c盘根目录,

关键词:ServerAdmin admin@example.com这是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路径(路径不能带中文!!!亲测

由于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 停止服务

注册window服务

 

Httpd –k install –npipewelding

Httpd –k uninstall –npipewelding

Httpd –k start –npipewelding

Httpd –k stop –npipewelding

方案1 使用mod_jk搭建apache2.4、tomcat8集群

第一步:停止apache服务;

 

第二步:配置mod_jk.so

将下载好的mod_jk.so放到{apache_home}/modules /下

修改httpd.conf,在其末尾追加下面一句话

include conf/mod_jk.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

 

 

第四步:配置workers.properties

http.conf 同目录下,创建workers.properties文件 ,内容如下:

 

 

#===server 列表

worker.list = controller,tomcat1,tomcat2

#========tomcat1 需要注意此名字对应tomcat中server.xml<Engine name="Catalina" #defaultHost="localhost"jvmRoute="tomcat1"> ========

#==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

 

 

第五步:配置tomcat1

(即:修改tomcat配置文件server.xml)

打开tomcat1/conf/server.xml文件

然后:

 

内容位置在tomcat安装包里的doc里如下:

第六步:配置tomcat2

和tomcat1配置相同,只是将

中的jvmRoute="tomcat1"改为jvmRoute="tomcat2"

第七步:创建测试项目

创建目录test

创建目录test/WEB-INF

创建文件test/index.jsp

创建文件test/WEB-INF/web.xml

 

 

web.xml内容:

<?xml version="1.0"encoding="UTF-8"?>

<web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"

 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">

 

         <display-name>test</display-name>

         <!—集群必须 --> 

   <distributable />  

</web-app>

 

index.jsp内容:

<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@pageimport="java.util.*"%>

 

 

<html>

 

 <head>

 

   <title>cluster test - share session</title>

 

 <meta http-equiv="pragma" content="no-cache">

 

 <meta http-equiv="cache-control"content="no-cache">

 

 </head>

 

 <body>

 

 <% 

 

 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("<b>Session 属性列表</b><br>");

 

 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+"<br>");

 

 System.out.println( name + " = " + value);

 

  }

 

 %>

 

 <form action="test.jsp"id="form_add" method="post">

 

  Key值:<inputid="dataName" name="dataName" type="text"/>

 

 Value:<input id="dataValue" name="dataValue"type="text"/>

 

    <input id="subBtn" name="subBtn"type="submit" value="提交" />

 

 </form>

 

 </body>

 

</html>

 

第八步:搭建

将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的”)

 

        

方案2 使用mod_proxy搭建apache2.4+tomcat8

(待补充)

 

 

 

关于Tocmat集群时文件同步          

第一,  文件同步,

第二,  第二,磁盘共享,

第三,  第三,tomcat虚拟路径映射。

前两种都是靠操作系统和其他软件处理。

这里讲解第三种。

配置方法如下两种任选,这样就解决

1. 在.%TOMCAT_HOME%\conf\Catalina\localhost建立一个xml文件 里面写上

<Context path="/web"docBase="D:/myweb" crossContext="false" debug="0"

reloadable="true"></Context>推荐方式

2.打开%TOMCAT_HOME%\conf\server.xml文件

 在 <host></host>之间加入如下代码: <Context path="/web" docBase="E:\myweb"

debug="0"reloadable="true"/>

 

采用方案1

 

方法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下

 

 

 

FAQ

区别:粘性session和复制session

转载地址:

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及其以上版本。

apache测试启动失败的解决方案

失败如图:

 

解决方法:

原文:

https://blog.csdn.net/su749520/article/details/78984773

即缺少VC库,要安装VC14,这个apache官网提到的必要条件。必须装VC14或VC15;具体参考下文《V14安装成功的必要条件》

V14安装成功的必要条件

仅支持以下系统:
此更新适用于以下操作系统:

  • Windows Server 2012 R2
  • Windows 8.1
  • Windows RT 8.1
  • Windows Server 2012
  • Windows 8
  • Windows RT
  • Windows Server 2008 R2 Service Pack 1 (SP1)
  • Windows 7 SP1
  • Windows Server 2008 Service Pack 2 (SP2)
  • Windows Vista SP2

 

 

 

原文:

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.

Win7 sp1

亲测  旗舰版额sp1  都没问题

但是专业版,没有sp1 ,测试也是不行的,

Win7 升级sp1补丁

先将win7更新至最新

然后安装sp1 补丁包:windows6.1-KB976932-X64.exe

下载地址:

https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=5842

Win2012R2

 

解决方案如下:

 

先安装补丁 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

 

 

阅读更多
个人分类: tomcat
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭