- 浏览: 90492 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
hairongtian:
我想问一下在GC中的gc roots是什么?教科书的看不懂,能 ...
JVM-GC实践总结(纠正并发线程数 转载)
使用Tomcat的童鞋们注意了。为了增加tomcat的性能和稳定性,我们一般采用balance和session同步机制。 下图列出了我们常用也是最简单的解决方案。
说明
1 balance
- 负载均衡我们一般采用Apache proxy和Apache+mod_jk方式
- 所使用软件:Apache2.2.19
http://httpd.apache.org/download.cgi#apache22
;
Tomcat7 http://tomcat.apache.org/download-70.cgi
1.1 mod_proxy方式
mod_proxy是一种分工合作的的形式,通过主服务器跳转到各台主机负责不同的任务而实现任务分工,这种形式不能实现负载均衡,只能提供主服务器的访问跳转
修改apache的httpd.conf文件配置
打开httpd.conf文件,取消下面四行的注释,用以打开代理所需的.so支持模块。
2 #LoadModule proxy_connect_module modules/mod_proxy_connect.so
3 #LoadModule proxy_module modules/mod_proxy.so
4 #Include conf/extra/httpd-vhosts.conf
打开文件conf\extra\httpd-vhosts.conf,可以看到如下代码:
View Code # # Use name-based virtual hosting. # NameVirtualHost *:80 # # VirtualHost example: # Almost any Apache directive may go into a VirtualHost container. # The first VirtualHost section is used for all requests that do not # match a ServerName or ServerAlias in any <VirtualHost> block. # <VirtualHost *:80> ServerAdmin webmaster@dummy-host.leader89 DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host.leader89" ServerName dummy-host.leader89 ServerAlias www.dummy-host.leader89 ErrorLog "logs/dummy-host.leader89-error.log" CustomLog "logs/dummy-host.leader89-access.log" common </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@dummy-host2.leader89 DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host2.leader89" ServerName dummy-host2.leader89 ErrorLog "logs/dummy-host2.leader89-error.log" CustomLog "logs/dummy-host2.leader89-access.log" common </VirtualHost>
根据需要更改<VirtualHost>节点内的参数。
注:
如果访问域名出现403权限错误,且对应的文件夹everyone的权限都是全部控制,则问题出在httpd.conf上。
编辑
httpd.conf,找到DocumentRoot "C:/Program Files/Apache Software
Foundation/Apache2.2/htdocs"这项,这是默认根目录路径,但是要更改的不是这个,一直往下找,找
到<Directory />节点,然后在节点结束后加上:
View Code <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host.leader89"> Options Indexes FollowSymLinks AllowOverride all Order Allow,Deny Allow from all </Directory> <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host2.leader89"> Options Indexes FollowSymLinks AllowOverride all Order Allow,Deny Allow from all </Directory>
这里的"C:/Program Files/Apache Software
Foundation/Apache2.2/docs/dummy-host.leader89"和"C:/Program Files/Apache
Software
Foundation/Apache2.2/docs/dummy-host2.leader89"为前面VirtualHost里的路径。
保存httpd.conf和httpd-vhosts.conf,然后重启Apache。
然 后访问dummy-host.leader89打开的是C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host.leader89目录,
访问dummy-host2.leader89的是C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host2.leader89目录,
实现了单IP多域名多站点的功能。
1.2 mod_proxy_blancer方式
mod_proxy_balancer是mod_proxy的扩展,提供负载平衡支持,通过mod_proxy_balancer.so包实现负载平衡,公司生产服务器暂时就采用这种方式。
修改apache的httpd.conf文件配置
打开httpd.conf文件,取消下面四行的注释,用以打开代理所需的.so支持模块。
#LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so #LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_module modules/mod_proxy_blancer.so在httpd.conf文件最后添加以下代码:
ProxyPass / balancer://proxy/ #注意这里以"/"结尾 <Proxy balancer://proxy> BalancerMember http://127.0.0.1:8080/ loadfactor=3 #BalancerMember 及其后面的URL表示要配置的后台服务器、test表示该服务器下的项目名称 BalancerMember http://127.0.0.1:8081/ loadfactor=1 #参数”loadfactor”表示后台服务器负载到由Apache发送请求的权值,该值默认为1 </Proxy>
将下载的tomcat压缩包解压两份,分别命名为tomcat1、tomcat2。修改tomcat2中conf/server.xml中部分端口 号(因为我在本机做测试,所以为了解决端口号被占用的问题修改tomcat2的端口号,使tomcat1与tomcat2能够同时启动,实现多服务器;如 果有多台PC服务器可不必修改),修改内容如下:
………… <Server port="9005" shutdown="SHUTDOWN"> #此处修改为9005,避免与tomcat1的8005冲突 ………… ………… <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> #此处修改为8081,避免与tomcat1的8080冲突 ………… <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" /> #此处修改为9009,避免与tomcat1的8009冲突。如果使用的是mod_proxy_blancer方式此处可以注释掉,如果使用的是mod_jk方式则此处必须存在 ………… <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> #去掉该行注释即可实现session复制功能 …………
1)轮询均衡策略的配置
ProxyPass / balancer://proxy/
<Proxy balancer://proxy> BalancerMember http://127.0.0.1:8080/ BalancerMember http://127.0.0.1:8081/ </Proxy>
实现负载均衡的原理如下:
假设Apache接收到http://localhost/test请求,由于该请求满足ProxyPass条件(其URL前缀为“/"),该请求会 被分发到后台某一个BalancerMember,譬如,该请求可能会转发到http://127.0.0.1:8080/ 进行处理?当第二 个满足条件的URL请求过来时,该请求可能会被分发到另外一台BalancerMember,譬如,可能会转发到 http://127.0.0.1:8081/ 如此循环反复,便实现了负载均衡的机制?
假设Apache接收到http://localhost/test请求,由于该请求满足ProxyPass条件(其URL前缀为“/"),该请求会 被分发到后台某一个BalancerMember,譬如,该请求可能会转发到http://127.0.0.1:8080/ 进行处理?当第二 个满足条件的URL请求过来时,该请求可能会被分发到另外一台BalancerMember,譬如,可能会转发到 http://127.0.0.1:8081/ 如此循环反复,便实现了负载均衡的机制?
2)按权重分配均衡策略的配置
ProxyPass / balancer://proxy/
<Proxy balancer://proxy> BalancerMember http://127.0.0.1:8080/ loadfactor=3 BalancerMember http://127.0.0.1:8081/ loadfactor=1 </Proxy>
2) 参数"loadfactor"表示后台服务器负载到由Apache发送请 求的权值,该值默认为1,可以将该值设置为1到100之间的任何值?以上面 的配置为例,介绍如何实现按权重分配的负载均衡,现假设Apache收到http://myserver/test 4次这样的请求,该请求分别被负载到后台 服务器,则有3次连续的这样请求被负载到BalancerMember为http://127.0.0.1:8080/ 的服务器,有1次这样的请求被 负载BalancerMember为http://127.0.0.1:8081/ 后台服务器?实现了按照权重连续分配的均衡策略?
3)权重请求响应负载均衡策略的配置
ProxyPass / balancer://proxy/ lbmethod=bytraffic
<Proxy balancer://proxy> BalancerMember http://127.0.0.1:8080/ loadfactor=3 BalancerMember http://127.0.0.1:8081/ loadfactor=1 </Proxy>
参数“lbmethod=bytraffic"表示后台服务器负载请求和 响应的字节数,处理字节数的多少是以权值的方式来表示的? “loadfactor"表示后台服务器处理负载请求和响应字节数的权值,该值默认为1,可以将该值设置在1到100的任何值?根据以上配置是这么进行均 衡负载的,假设Apache接收到http://myserver/test请求,将请求转发给后台服务器,如果BalancerMember为http://127.0.0.1:8080/ 后台服务器负载到这个请求,那么它处理请求和响应的字节数是BalancerMember为http://127.0.0.1:8081/ 服务器的3倍(回想(2)均衡配置,(2)是以请求数作为权重负载均衡的,(3)是以流量为权重负载均衡的,这是 最大的区别)?
至此配置以完成
在tomcat1中webapps文件夹下新建test项目文件夹,test目录下新建如下页面
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.*" %> <html><head><title>Cluster App Test</title></head> <body> Server Info: <% out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> <% out.println("<br> ID " + session.getId()+"<br>"); // 如果有新的 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" method="POST"> 名称:<input type=text size=20 name="dataName"> <br> 值:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body> </html>
如需session复制功能此步骤为必须操作
打开项目的WEB-INF下的web.xml在</web-app>内添加<distributable/>标签,如果没有则手动建立目录结构
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>TomcatDemo</display-name> <distributable/> #一般均放在web-app结束节点上一行 </web-app>
将tomcat1下的test项目复制一份到tomcat2的webapps目录下
至此所有操作已完成
启动tomcat1、tomcat2、apache。打开浏览器,输入http://localhost/test/test.jsp回车,刷新几次即可从tomcat1与tomcat2的控制台看到负载效果。输入session即可看到session复制效果
1.3 mod_jk方案
mod_jk是比较专门针对Tomcat的方法,通过AJP协议连接Tomcat
1)需要下载mod_jk-1.2.31-httpd-2.2.3.so
http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/mod_jk-1.2.31-httpd- 2.2.3.so
包并放到Apache安装目录下的modules子目录中
2)然后配置mod_jk.conf
3)配置workers2.properties
注意:因为mod_jk2方式不被推荐,mod_jk2已经不再被更新了。因此,此处不予列举,如有需要参考者请留言,将随后贴出。
proxy、proxy_blancer和mod_jk的比较
- proxy的缺点是,当其中一台tomcat停止运行的时候,apache仍然会转发请求过去,导致502网关错误。但是只要服务器再启动就不存在这个问题。
-
mod_jk方式的优点是,Apache 会自动检测到停止掉的tomcat,然后不再发请求过去。
缺点就是,当停止掉的tomcat服务器再次启动的时候,Apache检测不到,仍然不会转发请求过去。
-
proxy和mod_jk的共同优点是.可以只将Apache置于公网,节省公网IP地址资源。
可以通过设置来实现Apache专门负责处理静态网页,让Tomcat专门负责处理jsp和servlet等动态请求。
共同缺点是:如果前置Apache代理服务器停止运行,所有集群服务将无法对外提供。 -
proxy和mod_jk对静态页面请求的处理,都可以通设置来选取一个尽可能优化的效果。
mod_proxy_balancer和mod_jk都需要修改tomcat的配置文件配合
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> - 这三种Tomcat集群方式对实现最佳负载均衡都有一定不足,mod_proxy_balancer和mod_jk相对好些,mod_jk的设置能力更强些。lbfactor参数来分配请求任务。
- apache自带mod_proxy功能模块中目前只可以实现两种不同的负载均衡集群实现方式,第一种是分工合作的的形式,通过各台主机负责不同 的任务而实 现任务分工。第二种是不同的机器在担任同样的任务,某台机器出现故障主机可以自动检测到将不会影响到客户端,而第一种却不能实现但第一种实现方式的优点在 于他是主服务器负担相应没第二种大因为台只是提供跳转指路功能,形象的说他不给你带路只是告诉你有条路可以到,但到了那是否可以看到你见的人他已经不会去 管你了。相比之下第二种性能要比第一种会好很多;但他们都有个共同点都是一托N形式来完成任务的所以你的主机性能一定要好。
2 session同步
- 对于tomcat的集群有两种方式,这个主要是针对session而言的。一种就是sticky模式,即黏性会话模式;另外一种就是session复制模式了。
2.1 sticky模式
- 利 用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群 中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢 失;
- 这种方式其实是由前端balancer实现的,基本不需要webServer做任何改动(只需要修改jvmRoute="tomcat1")
- 同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用
2.2 复制模式
- 利 用Tomcat session复制的机制使得所有session在所有Tomcat节点中保持一致。当一个节点修改一个session数据的时候,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点。这样当下一个用户请求被负载均衡器分配到另外一个节点的时候,那个节点上有完备的 session信息可以用来服务该请求。这种做法的问题是对session哪怕有一点点修改,也要把整个sessions数据全部序列化 (serialize),还要广播给集群中所有节点,不管该节点到底需不需要这个session。这样很容易会造成大量的网络通信,导致网络阻塞。一般采 用这种方式,当Tomcat节点超过4个时候,整个集群的吞吐量就不能再上升了;
- 此方式是通过tomcat本身提供的功能,只需要修改server.xml文件
(1)修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
(2)去掉<Cluster> <\Cluster> 的注释符
(3)web.xml中增加 <distributable/>
2.3 Terracotta模式
- 另 一种方式就是利用开源软件Terracotta。Terracotta的基本原理是对于集群间共享的数据,当在一个节点发生变化的时 候,Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点。这样对网络的压力就非常小, 各个节点也不必浪费CPU时间和内存进行大量的序列化操作。把这种集群间数据共享的机制应用在session同步上,相当于对tomcat第二种集群实现 机制进行了优化,既避免了对数据库的依赖,又能达到负载均衡和灾难恢复的效果。在对比测试中,采用Terracotta搭建Tomcat集群,节点达到8 个时候,整个集群的吞吐量还一直是线性增长的。
2.4 三种模式比较
- sticky模式最大的缺点就是不支持failover,一旦某一个webServer发生故障则此节点上的session就会丢失,因此不建议使用。
- 复制模式可以保证个别节点发生故障不丢失session,但是复制时需要序列化数据这会影响到系统的性能。
另外性能随着服务器增加急剧下降,而且容易引起广播风暴。经测试当Tomcat节点超过4个时候,整个集群的吞吐量就不能再上升了。
需要修改server.xml和web.xml文件 - 使用第三方软件Terracotta进行session同步,配置对原来的web应用完全透明,原有程序不用做任何修改。。
数据不需要序列化,也不占用webServer的内存,执行效率高。 - terracotta本身支持HA,增加了系统的稳定性。
- Terracotta是开源的,并且可以集成在很多主流的开源软件中,如Jetty、Tomcat、Spring、Geronimo和EHCache等。
发表评论
-
JVM 运行时数据区(转)
2012-07-11 23:02 1057运行时数据区 java虚拟机定义了若干种程序运行时使用 ... -
图解JVM 内存分配
2012-07-10 23:57 12201.简介 现摘录一段Java5 ... -
JVM-GC实践总结(纠正并发线程数 转载)
2012-07-10 16:27 3546首先感谢阿宝同学的帮 ... -
深入Java虚拟机:JVM中的Stack和Heap
2012-07-10 14:26 1092在JVM中,内存分为两个部分,Stack(栈)和He ... -
JVM分代垃圾回收策略的基础概念
2012-07-10 13:50 1358由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中 ... -
Java虚拟机(JVM)中的内存设置详解(转载)
2012-07-09 17:13 1135在一些规模稍大的应用 ... -
JVM原理_内存篇(转载)
2012-07-09 16:56 2160一、JVM简介 ... -
JVM参数调优的八条经验(转载)
2012-07-09 14:35 954要想配置好JVM参数,需要对年轻代、年老代、救助空间和永久代有 ... -
Tomcat和Terracotta服务器将普通的Web应用部署到集群中,实现跨Tomcat节点的session复 制
2012-06-30 11:31 1352本文介绍如何配置Tomcat和Terracotta服务器将普通 ... -
tomcat session 持久化会话
2012-06-30 11:29 1601tomcat6 中关闭服务 会自动把session持久化 ... -
Tomcat集群Session丢失解决方案
2012-06-29 01:38 4406这几天单服务器整合项目很正常,集群的时候问题就来了,配 ... -
nginx+tomcat集群+session复制
2012-06-29 01:34 1238ulimit -SHn 65535 echo " ... -
linux下的并发数量
2012-06-26 21:32 967在部署系统后,为了增加系统并发量,系统响应速度,做了一些 ... -
网站的静态化处理
2012-06-26 21:10 872urlrewritefilter 下载: htt ... -
linux+nginx+tomcat负载均衡,实现session同步
2012-06-21 15:18 3898花了一个上午的时间研究nginx+tomcat的负载均衡测试, ... -
tomcat6_apache2.2_ajp负载均衡加集群实战 [转]
2012-04-26 16:07 935秀脱linux笔记之tomcat6_apa ... -
JVM内存最大能调多大分析-转帖
2012-02-18 12:48 1388JVM内存最大能调多大分析【经典】 上次用webl ... -
nginx for windows之负载均衡
2011-05-06 17:53 9641.编辑c:\nginx\conf\nginx.conf ... -
Tomcat6性能调优 出现java.lang.OutOfMemoryError: PermGen space
2010-08-03 13:51 1379Tomcat6在部署应用中,Server报错:java.lan ... -
APACHE 2.2.8+TOMCAT6.0.14配置负载均衡
2010-01-21 02:11 0目标: 使用 apache 和 tomcat ...
相关推荐
本配置指南将详细讲解如何在Apache 2.2.19版本上集成Tomcat 6.0.26,并使用mod_jk模块实现Apache与Tomcat之间的通信。 首先,了解Apache和Tomcat集群的基础概念。集群是一种将多台服务器连接在一起,以提供更高可用...
在本文中,我们将详细讨论如何在特定版本环境下——Apache 2.2.19、PHP 5.3.2 和 MySQL 5.5.13 下安装并配置Symfony框架。 首先,让我们了解这三个核心组件: 1. **Apache 2.2.19**:Apache HTTP Server 2.2.19 是...
Apache2.2与Tomcat6集群配置是一种常见的Web服务架构,用于提高网站的可用性和可扩展性。在Windows环境下,这种配置可以实现负载均衡,确保即使单个服务器出现故障,整个系统仍然能继续运行,同时分散请求以降低单一...
当你遇到"vagrant 2.2.19+virtualbox7.0 启动报错处理"的问题时,这通常意味着在尝试启动 Vagrant 配合 VirtualBox 创建的虚拟机时遇到了问题。以下是一些可能的错误原因和解决方法: 1. **版本兼容性**:Vagrant ...
### Apache2.2.19 和 PHP5.3.6 的配置详解 #### 一、引言 在 Web 开发领域,Apache 和 PHP 组合是构建动态网站和 Web 应用程序的一种常见且强大的解决方案。Apache 作为一款免费、开源的 Web 服务器软件,而 PHP ...
4. `docs`: 包含详细的文档,如用户指南、管理员手册和开发者文档,有助于理解Apache的工作原理和配置选项。 5. `config`和`configure`: 配置脚本,用于检测系统环境并生成Makefile,使得编译和安装过程更加自动化...
总的来说,Apache与Tomcat的整合和负载均衡配置是一个复杂的过程,涉及到多个组件的安装、配置和协调。通过这样的设置,我们可以构建一个高可用、高性能的Web应用程序环境,能够处理大量并发请求,同时确保在单个...
Linux平台下搭建Apache+Tomcat服务器是指在Linux操作系统下安装和配置Apache和Tomcat服务器的过程,以便实现Web服务器的搭建和网站的发布。下面将详细讲解这个过程中涉及的知识点。 一、JDK安装 1. JDK(Java ...
### WAMP(windows+apache+mysql+php)安装与配置详解 #### 一、WAMP简介及应用场景 WAMP(Windows + Apache + MySQL + PHP)是一种常用的Web开发环境配置组合,它可以在Windows操作系统上搭建一个完整的Web服务器...
redhat5+jboss4.2.3+apache2.2.19+mod_jk.so集群配置 文档中包括了jkd jboss apache mod_jk 的分别安装步骤,对linux不熟悉的人绝对有所帮助。 我把他搞定中途遇到了很多问题才写了这个文档,相对来说比较完善了,...
### Apache + PHP + MySQL 手动配置详解 #### 一、引言 本文将详细介绍如何手动配置Apache、PHP以及MySQL,构建一个稳定的Web开发环境。该文档基于作者在实际工作中的经验总结,适用于64位操作系统,并且所使用的...
**目标概述:** 本文档旨在指导如何在RHEL6.2 x64操作系统上搭建一个基于Tomcat 6.0.24的应用服务器集群,并通过Apache Httpd 2.2.15实现负载均衡。此架构能够提高系统的可用性和扩展性。 **系统环境信息:** - **...
这个配置的主要目的是通过Apache HTTP Server(通常称为Apache)作为前端负载均衡器,将用户请求分发到多个在同一台服务器上的Tomcat实例,从而提高系统处理能力和可用性。以下是对这个配置过程的详细解释: 首先,...
5. 配置Apache方案一(个人推荐方案二):打开D:\apache\conf\httpd.conf,找到DocumentRoot和都把后面的值改为项目存放的路径,默认为D:\apache\htdocs,然后找到#LoadModule ssl_module modules/mod_ssl.so,在其...
安装完成后,你可以通过修改`/etc/httpd/conf/httpd.conf`(在Unix-like系统中)或`C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf`(在Windows中)来配置服务器。 **Readme文件** "**...
1. 安装Apache:解压httpd-2.2.19-win64.rar,按照安装指南配置并启动服务。 2. 配置Apache与PHP:将PHP解释器(php-cgi.exe)添加到Apache的配置文件中,设置CGI处理模块,确保Apache能识别.php文件并交给PHP处理。...
### WAMP(windows+apache+mysql+php)安装与配置详解 #### 一、WAMP简介及重要性 WAMP(Windows + Apache + MySQL + PHP)是一种常用的开发环境配置组合,它允许开发者在Windows操作系统上搭建一个完整的Web服务器...