finereport 9.0 Tomcat 集群-来自帆软

Tomcat服务器集群

目录:

  • 1. 描述
  • 3. 配置过程
  • 4. 结果测试

1. 描述

在单一的服务器上执行WEB应用程序有一些问题,当网站成功建成并开始接受大量请求时,单一服务器无法满足需要处理的负荷量。

另外一个常见的问题是会产生单点故障,如果该服务器坏掉,那么网站就立刻无法运作了。

不论是因为要有较佳的扩充性还是容错能力,我们都会想在一台以上的服务器计算机上执行WEB应用程序。

所以,这时候我们就需要用到集群这一门技术了。

1.1 集群(Cluster)

集群是一组协同工作的服务实体(可理解为服务器),用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是一个服务实体,但事实上集群由一组服务实体组成。

1.2 负载均衡(Load Balance)

负载均衡实现了并发数的分流从而有效的实现减少单机服务器的压力,使高并发的情况下集群整体依然能够拥有较好的性能。同时负载均衡后的集群具有一定的容错率,当某一单机服务器down掉后,负载均衡使用分发机制将其分配到其他正在运行的服务器上,继续操作。

1.3 反向代理负载均衡 

常用的负载均衡技术有很多种,本文使用反向代理Apache+JK2实现Tomcat集群与负载均衡。

使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之上,从而达到负载均衡的目的。

1.4 实现原理

2. 环境准备

测试环境为win8.1+jdk1.8.0

版本   下载 作用  
  Apache2.4  Download - The Apache HTTP Server Project  用于分发请求
  Tomcat8.5.15  Apache Tomcat® - Welcome!  web服务器
  Mod_jk  Index of /dist/tomcat/tomcat-connectors/jk/binaries/windows  建立Apahce和Tomcat直接的连接

本文采用上述的版本进行演示,其他版本操作可能略有不同,请自行处理。

2.1 Apache
下载完成之后,直接安装apache,安装完成之后,在浏览器中输入http://localhost/,能够看到下图则说明安装成功:

2.2 Tomcat

解压下载好的tomcat压缩包,复制三分解压好的tomca文件夹,分别重命名为tomcat1,tomcat2,tomcat3。

3. 配置过程

后面使用的文件功能说明:

(a) mod_jk.conf:主要定义 mod_jk 模块的位置以及 mod_jk 模块的连接日志设置,还有定义 worker.properties 文件的位置。

(b) worker.properties:定义 worker 的参数,主要是连接 tomcat 主机的地址和端口信息。如果 Tomcat 与 apache 不在同一台机器上,或者需要做多台机器上 tomcat 的负载均衡只需要更改 workers.properties 文件中的相应定义即可。% APACHE_HOME %为你的安装目录。
3.1 Apache配置修改
(1)修改httpd.conf
我的Apache安装在C:\cluster\Apache24找到conf目录下的httpd.conf,在文件的最后一行添加:
  1. Include "C:\cluster\Apache24\conf\mod_jk.conf"  

注:以上表示将 mod_jk.conf 配置文件包含进来

(2)新建mod_jk.conf文件
在conf目录下新建mod_jk.conf文件,内容如下:
  1. LoadModule jk_module modules/mod_jk.so    
  2. JkWorkersFile conf/workers.properties    
  3. JkMount /*.jsp controller   
第一行最后的文件名为jk的文件名,根据下载的jk的名字不同而不同。
第二行表示指定哪些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名。
第三行表示可以进行集群的文件类型,这里写*.jsp表示集群的文件只能是jsp文件,如果不区分文件类型,则直接写成JkMount /* controller即可。
(3)Mod_jk
在bin目录下输入.\httpd -v查看apache版本号,下载对应的文件

解压下载的Mod_jk文件,将里面的so文件复制到Apache安装目录的modules目录下,这里下载的Mod_jk文件名为mod_jk.so。
(4)新建并编辑workers.properties文件
在conf文件夹下新建workers.properties,内容如下:
  1. #server    
  2. worker.list = controller    
  3. #========tomcat1========    
  4. worker.tomcat1.port=11009    
  5. worker.tomcat1.host=localhost    
  6. worker.tomcat1.type=ajp13    
  7. worker.tomcat1.lbfactor = 1    
  8. #========tomcat2========    
  9. worker.tomcat2.port=12009    
  10. worker.tomcat2.host=localhost    
  11. worker.tomcat2.type=ajp13    
  12. worker.tomcat2.lbfactor = 1    
  13. #========tomcat3========    
  14. worker.tomcat3.port=13009    
  15. worker.tomcat3.host=localhost    
  16. worker.tomcat3.type=ajp13    
  17. worker.tomcat3.lbfactor = 1    
  18.      
  19. #========controller,负载均衡控制器========    
  20. worker.controller.type=lb    
  21. worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3    
  22. worker.controller.sticky_session=false    
  23. worker.controller.sticky_session_force=1    
  24. #worker.controller.sticky_session=1    
worker.controller.sticky_session=false,提交页面,将按照负载均衡的规则切换服务器,实现“完全的负载均衡”,代价是Tomcat不停交换session数据,慢;
worker.controller.sticky_session_force=true,始终转发到session创建的服务器上。
注:其中1代表true,0代表false 
上面最后的代码中使用到的参数详细解释如下:
sticky_session    sticky_session_force含义  
  true   false  SESSION不复制,有粘性
  true   true   SESSION复制,有粘性
  false  false  SESSION不复制,无粘性 
  false  true   SESSION复制,无粘性
如果需要配置远程的tomcat服务器的话,只需要将worker.tomcat3.host=localhost中的localhost改为远程服务器的IP地址即可。
本次配置都是本地的tomcat,并且在一台机器上,所以端口号都不相同,如果在不同机器上,http和shutdown端口号则不需要更改。
3.2 Tomcat集群配置
分别打开tomcat1/tomcat2/tomcat3目录下的conf/server.xml文件,进行修改
(1)修改tomcat端口
由于这里是同一台机器上使用三个tomcat,为了避免端口冲突,需要修改tomcat服务器的http/shutdown/ajp端口号。
(2)修改集群设置
对于tomcat8.5.15要做集群的话,只需要将<Engine>元素下的
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
的注释符号去掉,启用这句配制就可以正常使用集群。
(3)Engine 增加 jvmRoute 属性设置
 jvmRoute 的值来自于 workers.properties 文件所设置的服务器名称,3个tomcat里,jvmRoute分别配置成tomcat1/tomcat2/tomcat3。
修改完成后如下图:

 注:由于这里三个tomcat全在一台机器上,所以需要修改三种类型的端口号,如果是在不同的机器上,则只需要修改AJP13的connector的port,其他端口号不需要修改。

另:jvmRoute里的名称和workers.properties中配置都必须对应。

4. 结果测试

在tomcat下面的项目文件夹中修改web.xml,如这里使用自带的examples项目,则修改三个tomcat下面的examples项目中的web.xml,在每个web.xml的<web-app>节点里添加新的节点<distributable/>,此应用将与集群服务器复制Session,如下图:
注:这里是用来测试此种情况演示效果的,实际部署我们工程的时候,web.xml可以不添加

在每个examples项目文件夹下新建test.jsp,内容如下:
  1. <%@ page contentType="text/html; charset=GBK" %>  
  2. <%@ page import="java.util.*" %>  
  3. <html><head><title>Cluster App Test</title></head>  
  4. <body>  
  5. Server Info:  
  6. <%  
  7. out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>  
  8. <%  
  9.   out.println("<br> ID " + session.getId()+"<br>");  
  10.   // 如果有新的 Session 属性设置  
  11.   String dataName = request.getParameter("dataName");  
  12.   if (dataName != null && dataName.length() > 0) {  
  13.      String dataValue = request.getParameter("dataValue");  
  14.      session.setAttribute(dataName, dataValue);  
  15.   }  
  16.   out.println("<b>Session 列表</b><br>");  
  17.   System.out.println("============================");  
  18.   Enumeration e = session.getAttributeNames();  
  19.   while (e.hasMoreElements()) {  
  20.      String name = (String)e.nextElement();  
  21.      String value = session.getAttribute(name).toString();  
  22.      out.println( name + " = " + value+"<br>");  
  23.          System.out.println( name + " = " + value);  
  24.    }  
  25. %>  
  26.   <form action="test.jsp" method="POST">  
  27.     名称:<input type=text size=20 name="dataName">  
  28.      <br>  
  29.     值:<input type=text size=20 name="dataValue">  
  30.      <br>  
  31.     <input type=submit>  
  32.    </form>  
  33. </body>  
  34. </html>  
4.1 节点插拔测试
项目部署好之后,启动三个tomcat以及Apache,启动顺序随意,然后再浏览器中输入http://localhost/examples/test.jsp
(1)关闭Tomcat
关闭tomcat3,刷新页面,可以不断访问tomcat1和tomcat2,再关闭tomcat2,只能够访问tomcat1,说明节点关闭时运行正常。
(2)启动tomcat

如果重启Tomcat2,无论怎么刷新,始终访问Tomcat3,无法访问tomcat2,这时利用另外台机器访问页面,发现Tomcat2正常,然后在刷本地页面,又可以访问Tomcat2了。
对于每个新来的session,Apache按照节点配置中的lbfactor比重选择访问节点,如果某节点node1不能访问,则寻找下一可访问节点,并且将此node1就在该访问session的访问黑名单中,以后该session的访问直接不考虑node1,即使node1又可以访问了。
而新来的session是无黑名单的,如果新的session能够访问到node1了,则会将node1在其他所有session访问的黑名单删除,这样其他session就又能访问node1节点了。
经过以上测试,说明Tomcat集群和负载均衡已经实现了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/23818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java桥接模式

桥接模式 最重要的是 将 抽象 与 实现 解耦 , 通过组合 在 抽象 与 实现 之间搭建桥梁 ; 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )-CSDN博客 桥接模式&#xff08;Bridge Pattern&#xff09;-&#xff08;最通俗易懂的案例&#xff09;_桥接模式 例子-…

高效学习LabVIEW的方法

学习LabVIEW可以通过系统化课程、在线资源、自学实验、参与论坛、结合实际项目等多角度进行。系统课程提供全面基础&#xff0c;在线资源便于查漏补缺&#xff0c;自学实验强化理解&#xff0c;论坛互动解决疑难&#xff0c;结合实际项目应用提高实践技能。结合项目学习是最高效…

python3 -m http.server 检查打包前端的项目

python3 -m http.server这是 Python 提供的一个内置的简单 HTTP 服务器。当你在终端中运行 python3 -m http.server 命令时(在对应的打包目录比如dist目录)&#xff0c;Python 会启动一个 HTTP 服务器&#xff0c;它会将当前工作目录下的文件作为静态文件提供给浏览器。这个服务…

LabVIEW软件开发人员的核心能力是什么

LabVIEW软件开发人员的核心能力包括以下几个方面&#xff1a; 1. LabVIEW编程技能 熟练掌握LabVIEW编程语言&#xff1a;包括虚拟仪器&#xff08;VI&#xff09;的创建、数据流编程、图形化编程技巧等。 模块化编程&#xff1a;能够设计和实现模块化的代码结构&#xff0c;便…

数据结构与算法之计数排序

目录 前言 计数排序 定义 优缺点 策略 图解 代码实现 结束语 前言 今天是坚持写博客的第20天&#xff0c;时光飞逝&#xff0c;第二个10天即将过去&#xff0c;希望可以继续坚持&#xff0c;光明的未来也在未来等着我们。今天也恰逢高考&#xff0c;祝所有学子一帆风顺…

echarts的toolbox自定义feature标签及事件

1. 需求 在使用echarts图时希望toolbox扩展一些自定义icon和点击事件&#xff0c;而不只是图中这些echarts提供的事件。 2. 文档 属性名类型描述toolbox.featureObject各工具配置项。 feature中除了echarts提供的各个内置的工具按钮外&#xff0c;可以自定义工具按钮。 除…

电脑ip地址查询:快速定位你的网络位置(4种方法)

在互联网的浩瀚海洋中&#xff0c;每台联网的电脑都有一个独特的身份标识&#xff0c;那就是IP地址。无论是进行网络通信、定位问题还是安全防护&#xff0c;了解自己或他人的电脑IP地址都是非常关键的。那么&#xff0c;电脑ip地址查询怎么操作呢&#xff1f;本文将为你提供一…

学习笔记——路由网络基础——缺省(默认)路由

3、缺省(默认)路由 1、定义 缺省路由(默认路由)&#xff1a;是目的地址和掩码都为全0的特殊路由。全0代表任意网络。缺省路由在路由表中的形式为&#xff1a;0.0.0.0/0缺省路由也被叫默认路由。缺省路由优先级比直连路由低 缺省路由是一种特殊的路由&#xff0c;当报文没有在…

Redis系列之淘汰策略介绍

Redis系列之淘汰策略介绍 文章目录 为什么需要Redis淘汰策略&#xff1f;Redis淘汰策略分类Redis数据淘汰流程源码验证淘汰流程Redis中的LRU算法Redis中的LFU算法 为什么需要Redis淘汰策略&#xff1f; 由于Redis内存是有大小的&#xff0c;当内存快满的时候&#xff0c;又没有…

【Qt】TreeWidget中Item的UserCheckable注意事项,没有出现多选框

1. 异常 开启 ItemIsUserCheckable以后&#xff0c;界面上没有出现多选框。 QTreeWidgetItem *item new QTreeWidgetItem();item->setText(0, "hello");item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable |Qt::ItemIsEnabled | Qt::ItemIsAuto…

AIGC 介绍与典型应用与亚马逊科技AIGC方案

1、AIGC ( 生成式人工智能 ) 是指可生成全新内容的人工智能技术 从字面意思来看&#xff0c;AIGC 是继 PGC&#xff0c;UGC 之后的新型内容创作方式&#xff0c;可以在创意、表现力、迭代、传播、个性化等方面&#xff0c;充分发挥技术优势&#xff0c;打造新的数字内容生成与…

AXI Quad SPI IP核AXI4接口下的三种操作模式

当选择Enable Performance Mode选项时&#xff0c;AXI4接口包括在内。在该模式下&#xff0c;IP核可以在增强模式下操作&#xff08;未选择启用XIP模式&#xff09;或XIP模式&#xff08;选择启用XIP模式&#xff09;。在性能模式下&#xff0c;AXI4接口用于在DTR和DRR位置的突…

ActiveMQ 介绍、下载、安装和控制台

ActiveMQ 介绍 Apache ActiveMQ 是一款非常成熟且功能全面的开源消息中间件&#xff0c;由Apache软件基金会维护。它遵循 Java Message Service (JMS) 规范&#xff0c;这意味着它提供了一组标准的 API&#xff0c;允许 Java 应用程序以一种标准化的方式发送和接收消息。 以下…

游戏研发(策略+sass+回调模式)

前言 由于这边需要对接游戏研发后台,基本就是开服,封禁.角色日志等,但是每个游戏提供的接口都是不一样的,所以为了统一处理提前进行sass封装,以便后续可以更好的兼容 同时还涉及了多数据源的问题,因为有些日志太大不可能直接去http调用,会使用直接查询游戏研发的数据库方式这一…

前端修改接口返回测试工具 Inssman使用教程

之前用的requestly现在要登录才能用了&#xff0c;然后我又登录不上去&#xff0c;同事又推荐了个谷歌插件&#xff0c;试了下&#xff0c;挺好用&#xff0c;还不用登录&#xff0c;用法和之前差不多 下载网站&#xff1a;https://chromewebstore.google.com/detail/inssman-…

从入门到精通:Java Lambda运算符详解!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

力扣 503. 下一个更大元素 II

题目来源&#xff1a;https://leetcode.cn/problems/next-greater-element-ii/description/ C题解&#xff1a;因为是循环数组&#xff0c;所以对数组进行了两次遍历&#xff0c;相当于循环。使用了栈&#xff0c;一个存放元素&#xff0c;一个存放索引&#xff0c;用来更新res…

【C++ | 析构函数】类的析构函数详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-06 1…

使用MFC DLL

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 应用程序与DLL链接后&#xff0c;DLL才能通过应用程序调用运行。应用程序与DLL链接的方式主要有如下两种&#xff1a;隐式链接和显式链接。 隐式链接又称为静态加载&…

Linux常见故障处理之df命令卡住不输出

一、背景说明 朋友咨询Linux系统下输入df -h命令后没有任何输出结果&#xff0c;博主的第一反应是/根分区磁盘空间满了&#xff0c;朋友说cd等其他命令可以执行。博主又猜测可能是有人误定义了命令别名&#xff0c;进一步确认命令卡住在等待输出页面。事后博主想起来可能是共享…