转载 Tomcat集群配置学习篇-----分布式应用
Tomcat集群配置学习篇-----分布式应用
现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量;大家知道如果服务器访问量过大,就会出现服应用务器崩溃的情况,这个时候怎么办,难道就只能去重启服务器吗?好,如果是一般的小型公益网站到也无所谓,但如果是比如像大型航空公司售票等电子商务网站,每天每小时都有大量的订单业务,如果这些售票系统一旦崩溃后,再去重启,这些时间和客户的损失就直接会影响到航空公司的利益,这些损失如何去避免呢。
别担心,不管是目前IBM的webSphere还是大众化的tomcat服务器,都为我们提供了一种通用的解决方式,就是多台服务器来分担访问量,这样在一个服务器上的压力就会减小很多,你可以根据自己的需求去配置任意多的服务器来支撑你的应用系统,如果一台服务崩溃了,那么另外的应用服务器依然可以继续支持应用继续服务。多应用服务器的简单流程图大致如下:
为了实现这个原理我们就需要解决两个问题:
1:如何实现多应用服务器间的session共享:(一台服务器崩溃,另外一台服务器可以继续支持)
2:如何分发请求到各个应用服务器实现压力分解:(这里的解决方案是用apache做 web服务器)
下面我们就是实际行动来看看如何实现这种实现。
环境配置:
App应用服务器apache-tomcat-7.0.52-1
web服务器:apache的apache 2.0.55
java环境:jdk1.6
系统环境:winxp系统
1) web服务器配置
首先安装apache的web服务器:
apache服务器和tomcat的连接方法其实有三种:mod_JK、http_proxy和ajp_proxy。
一:软件环境
1. Apache: apache 2.0.55 (由http://httpd.apache.org/进入下载)(点击下载apache 2.0.55)
2. Tomcat: apache-tomcat-7.0.52-1
3. mod_jk: 在页面 http://tomcat.apache.org/ Download 标题下找到 Tomcat Connectors 链接进入(点击下载mod_jk-apache-2.0.55.so),看起来像是个Unix/Linux下的动态库,实际应是个Win32 的 DLL 动态库,大概是为保持不同平台配置的一致性,才用了这个扩展名。
二:负载均衡
用Apache进行分流,把请求按照权重以及当时负荷分tomcat1,tomcat2...去处理
1. 安装apache,tomcat
我把Apache安装在D:/Apache Group/Apache2
解压两分Tomcat, 分别在 D:/Apache Group/apache-tomcat-7.0.52-1,D:/Apache Group/apache-tomcat-7.0.52-1
2.修改Apache配置文件http.conf
在apache安装目录下conf目录中找到http.conf,在文件最后加上下面一句话就可以了
include conf/mod_jk.conf
3. http.conf 同目录下新建mod_jk.conf文件,内容如下
- #加载mod_jk Module
- LoadModule jk_module modules/mod_jk-apache-2.0.55.so
- #指定 workers.properties文件路径
- JkWorkersFile conf/workers.properties
- #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
- JkMount /*.jsp controller
如果还要指定*.do也进行分流就再加一行
JkMount /*.do controller
如果你想对所有的请求进行分流只需要写成
JkMount /* controller
4. 在http.conf同目录下新建 workers.properties文件
- worker.list = controller,tomcat1,tomcat2 #server 列表
- #========tomcat1========
- worker.tomcat1.port=8019 #ajp13 端口号,在tomcat下server.xml配置,默认8009
- worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
- worker.tomcat1.type=ajp13
- worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
- #========tomcat2========
- worker.tomcat2.port=8029 #ajp13 端口号,在tomcat下server.xml配置,默认8009
- worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
- worker.tomcat2.type=ajp13
- worker.tomcat2.lbfactor = 2 #server的加权比重,值越高,分得的请求越多
- #========controller,负载均衡控制器========
- worker.controller.type=lb
- worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
- worker.controller.sticky_session=1
5. 修改tomcat配置文件server.xml
如果你是水平集群,即在不同电脑上安装tomcat,tomcat的安装数量为一个,可以不必修改tomcat配置文件.我这里是在同一台电脑上安装两个tomcat,实现的是垂直集群方式,所以必须修改其中一个的设置,以避免端口冲突,按照参考文章是把原来以9开头的端口号改为以9开头端口号,但是在我机器上如果以9开头的端口号,例如9080、9082会与我的WebSphere Application Server配置冲突,所以我这里采取的策略是把原来端口号的第三位改为1,如8080改为8180。
打开tomcat2/conf/server.xml文件
1) 将关闭Tomcat的监听端口改成由8005改为8105
即把
<Server port="8005" shutdown="SHUTDOWN">
改为
<Server port="8105" shutdown="SHUTDOWN">
2) 把http服务端口号由8080改为8180
找到
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<CONNECTOR port="8080"
把这里的8080改为8180
3) 把AJP端口号由8009改为8109
找到
<!-- Define an AJP 1.3 Connector on port 8009 -->
<CONNECTOR port="8009"
把这里的8009改为8109
4) 把 HTTP 代理端口从8082改为8182(这个配置默认是被注释掉的,可跳过这一步)
找到
<CONNECTOR port="8082"
把这里的8082改为8182
5) 编写一个测试 jsp
建立一个目录TestCluster,里面新建一个test.jsp,内容为
把TestCluster放到tomcat1,tomcat2的webapps下
6) 启动apache,tomcat1,tomcat2,进行测试
通过 http://localhost/TestCluster/test.jsp 访问,多刷新几次页面,查看Tomcat1和Tomcat2的窗口,你将可以看到打印了一行行"===========================",并且从统计上来说,大约在tomcat2打印的数量是在Tomcat1中的两倍,可以看到请求会被tomcat1,tomcat2按照不同的权重分流处理,实现了负载均衡。
作下面的集群配置,请在workers.properties把tomcat1和tomcat2的权重改为一样的,使请求较平均分配,将有便于看到实验的效果。
首先配置web应用服务器配置tomcat-A配置
1:修改tomcat的server.xml文件增加如下内容
贴出代码,方便复制:
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
- channelSendOptions="6">
- <Manager className="org.apache.catalina.ha.session.BackupManager"
- expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"
- mapSendOptions="6"/>
- <Manager className="org.apache.catalina.ha.session.DeltaManager"
- expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"/>
- <Channel className="org.apache.catalina.tribes.group.GroupChannel">
- <Membership className="org.apache.catalina.tribes.membership.McastService"
- bind="127.0.0.1"
- address="228.0.0.4"
- port="45564"
- frequency="500"
- dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="127.0.0.1"
- port="4001"
- selectorTimeout="100"
- maxThreads="6"/>
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
- </Sender>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
- </Channel>
- <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
- filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
备注:
1) App应用服务器tomcat-B配置和tomcat-A基本相同,但需要注意的是两台服务器如果在一个电脑上就需要注意端口的冲突问题,比如:tomcat-A的端口是8080,那么tomcat-B就是8081或者其他,其他的以此类推
我这里这里的端口配置如下:
tomcat-1:serverport:8081 ajp/1.3connector:8019 <Server port="8015" shutdown="SHUTDOWN">
tomcat-2:serverport:8082 ajp/1.3connector:8029 <Server port="8025" shutdown="SHUTDOWN">
2) 然后就是新建一个web应用测试一下,在新建应用的web.xml里面需要加上
<distributable/>
3) 到这里就可以测试你的配置了,先启动tomcat-1,然后启动tomcat-2,如果你在两个控制台里面看到类似的如下信息
证明两台应用服务器已经配置完成了。
4) 新建web应用,web.xml配置文件里面需要添加如下内容来配合实现session共享:
<distrbutable/>
然后将应用分别部署到两台服务器,启动两台应用服务器进行测试:
注:由于jsp自带session对象,所以在测试的时候最好把页面自带的session对象关闭后再测试,关闭代码<%@ page session="false"%>
Tomcat-A index.jsp代码:
<body>
This is my JSP page.tomcat-A <br>
<%
HttpSession mysession = request.getSession(false);
if(mysession==null){
mysession = request.getSession(true);
mysession.setAttribute("appname","value-A");
out.println("new session:"+mysession.getId());
}else{
out.println("old session:"+mysession.getId());
}
out.println("appname="+mysession.getAttribute("appname"));
%>
</body>
Tomcat-B index.jsp代码:
<body>
This is my JSP page.tomcat-B<br>
<%
HttpSession mysession = request.getSession(false);
if(mysession==null){
mysession = request.getSession(true);
mysession.setAttribute("appname","value-A");
out.println("new session:"+mysession.getId());
}else{
out.println("old session:"+mysession.getId());
}
out.println("appname="+mysession.getAttribute("appname"));
%>
</body>
5) 分别访问两台服务器:http://172.23.1.46:8081/mycluster
和http://172.23.1.46:8082/mycluster分别访问得到结果如下就证明配置可以了。
访问8081服务器:
页面刷新后结果如下:
访问8082服务器:
页面刷新后结果如下:
到这里tomcat服务器就配置完成了,接下来就需要配置统一入口的负载均衡的web服务器,这里用的是apache 2.2.19(官网上可以直接下载)
转载 Tomcat集群配置学习篇-----分布式应用的更多相关文章
- Tomcat集群配置学习篇-----分布式应用
Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...
- Apache负载均衡与Tomcat集群配置学习(Windows环境)
本文主要参考自http://www.iteye.com/topic/985404?dhcc,经由实际操作配置操并记录而成. 由于最近的一个Java开发项目用到了Tomcat中间件作为web服务器,刚开 ...
- window xp Apache与Tomcat集群配置--转载
转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...
- Apache + Tomcat集群配置详解 (1)
一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...
- (转)Apache+Tomcat集群配置
本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是ht ...
- nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路
前言: nginx中有一块很重要的概念, 就是rewrite规则. 它会对URL进行修改, 然后进行内部的重定向. rewrite授予了nginx更多的自由, 使得后级服务的接入更加地方便. 本文将简 ...
- nginx+tomcat集群配置(1)---根目录设定和多后端分发配置
前言: 对于javaer而言, nginx+tomcat集群配置, 已然成了web应用部署的主流. 大公司如此, 小公司亦然. 对于个人开发者而言, 资源有限, 往往多个web应用混部于一台服务器(云 ...
- Linux+Apache+Tomcat集群配置
参考: http://blog.csdn.net/bluishglc/article/details/6867358# http://andashu.blog.51cto.com/8673810/13 ...
- Nginx+Tomcat集群配置
Nginx+Tomcat集群配置 一台虚拟机作为Nginx服务 两太虚拟机配置Tomcat+jdk环境 Nginx测试 启动: cd usr/local/nginx/sbin ./nginx ---& ...
随机推荐
- CentOS7 安装xen(在虚拟机上成功,实体机测试死机!)
此文章只做操作记录,其中有些地方可能漏了!!我只贴出自己的操作过程!其它有差别的地方请自己网上查找参考! 只有在全虚拟化下才能安装Windows,这就需要有硬件支持,并在BIOS中开启Virtuali ...
- Vue学习笔记-组件通信-子传父(自定义事件)
props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...
- MySQL执行计划示例
以上示例来自尚硅谷!
- php is_file()函数 语法
php is_file()函数 语法 is_file()函数怎么用? php is_file()函数用于判断给定文件名是否为一个正常的文件,语法是bool is_file ( string $file ...
- E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unavailable)
1. 问题详细提示如下: E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unava ...
- BUUCTF | easy_tornado
第一次遇到模板注入的题,赶紧记笔记,此篇相当于对大佬的做法的复现Orz,师傅太强了https://blog.csdn.net/weixin_44255856/article/details/97687 ...
- 转载:VScode 好用插件集合
--------------------- 作者:JayveeWong 来源:CSDN 原文:https://blog.csdn.net/weixin_42776111/article/details ...
- ROM、RAM、DRAM、SRAM、FLASH的区别?
在学习单片机的时候经常会被这些东西搞晕掉,什么ROM RAM FLASH EEPROM 等等......为了不被搞晕,做个笔记,不记得的时候过来看看. 下面是我在网上找的资料: ROM和RAM指的都是 ...
- shell脚本——注释(单行注释 多行注释)
参考 : https://blog.csdn.net/weixin_42167759/article/details/80703570 单行注释 以"#"开头的行就是注释,会被解释 ...
- Asp.Net Core 第06局:中间件
总目录 前言 本文介绍Asp.Net Core 中间件. 环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 第一手:中间件概述 1.中间件:添加到应用 ...