??xml version="1.0" encoding="utf-8" standalone="yes"?>电影午夜精品一区二区三区,欧美激情综合亚洲一二区,综合一区avhttp://www.aygfsteel.com/szhswl/articles/167052.html宋针q?/dc:creator>宋针q?/author>Tue, 11 Dec 2007 12:48:00 GMThttp://www.aygfsteel.com/szhswl/articles/167052.htmlhttp://www.aygfsteel.com/szhswl/comments/167052.htmlhttp://www.aygfsteel.com/szhswl/articles/167052.html#Feedback0http://www.aygfsteel.com/szhswl/comments/commentRss/167052.htmlhttp://www.aygfsteel.com/szhswl/services/trackbacks/167052.htmlTomcat 5服务器ؓ集群和SESSION复制提供了集成的支持。本pd的第一文章将为大家提供SESSION持久性以及TOMCAT集群中SESSION复制的内在工作机制一个概要认识。我会讨论SESSION复制在TOMCAT5中是怎样q行的以及跨多集群节点的SESSION持久性的复制机制。在W?部分Q我会详l讨Z个带有SESSION复制功能的TOMCAT集群的安装例子,q且比较不同的复制情形?
  
  集群
  
  传统独立服务器(非集的Q不提供M失效无缝转移以及负蝲q能力。当服务器失败的时候,无法获取整个网站的内容Q除非服务器被重新唤赗由于服务器失效QQ何存储在服务器内存中的SESSION都会丢失Q用户必重新登陆ƈ且输入所有由于服务器失效丢失的数据?
  
不同的是Q作为集一部分的服务器则提供了可测性以及失效无~{U能力。一个集就是一l同步运行ƈ且协同工作,能提供高可靠性,高稳定性以及高可测性的多服务器例程。服务端集群对客L表现出来g是一个单独的服务器例E。从客户端的视角来看Q集的客户端和单独的服务器没多大不同,但是他们通过提供实效无缝转移和SESSION复制做到了不间断服务以及SESSION数据持久性?
  
  集群中的服务器通讯
  
  集群中的应用E序服务器通过诸如IP多点传送(IP multicastQ和IP socketsq样的技术和其他服务器共享信?
  
  ●IP多点传送:主要用于1对多的服务器通讯Q通过q播服务?heartbeats消息的可用来昄服务器的有效
  
  ●IP socketsQ主要用于在集群的服务器例程中进行P2P服务器通讯
  
  使用IP多点传送进行一对多通讯
  
TOMCAT服务器用IP多点传送在集群中的服务器例E间q行一对多的通讯QIP多点传送是一U能够让多服务器向指定IP地址和端口号q行订阅q且监听消息的广播技术(多点传送IP地址范围?24.0.0.0 ?39.255.255.255Q。在集群中的每个服务器都使用多点传送广播特定的 heartbeat消息Q通过监视q些 heartbeat消息Q在集群中的服务器例E判断什么时候服务器例程失效。在服务器通讯中用IP多点传送的一个缺Ҏ他不能保证这些消息被实接收C。例如,一个应用持l的本地多点传送缓存满了,׃能写入新的多点传送消息,{消息过了之后该应用E序没有被通知到?
  
  使用IP Socketsq行服务器通讯
  
IP sockets 同样也通过了一套在集群中的服务器间q行发送消息和数据的机制。服务器例程使用IP sockets 在集节炚wq行HTTP SESSION状态的复制。正的SOKET配制对于集群的性能是至关重要的Q基于SOCKET的通讯的效率取决于SOCKET的实现类别(例如Q系l用本地的或者纯JAVA SOCKETd器实玎ͼQ如果服务器使用UJAVA SOCKETd器则要看服务器例E是否注册用了_的SOCKETd器线E?
  
  如果惌有最佳的SOCKET性能Q系l应该注册用本地的SOCEKT而不是纯JAVA实现。这是因为相对于ZJAVA的SOCKET实现Q本地SOCKET消耗更的pȝ资源。虽?SOCKETd器的JAVA实现是P2P通信中一U可靠而且可移动的ҎQ可是他不能为集中的重型SOCKET使用提供最好的性能。当判断?SOCKET是否有数据读取的时候本地SOCKETd器用了更有效率的方法。用本地SOCKETd器实玎ͼd器线E不需要去l计静止?SOCKETQ他们仅仅ؓzd的SOCKET服务Qƈ且在一个给定的SOCKET开始活跃v来时他们可以立刻捕捉到。而用纯JAVA SOCKETd器,U程必须动态的l计所有打开的SOCKETQ判断他们是否包含可d的数据。换句话_SOCKETd器L忙于l计 SOCKETQ即使这些SOCKET没有数据可读。这些本不应该的pȝ开销降低了性能?
  
  TOMCAT 5中的集群
  
虽然在TOMCAT5的早些版本中也有集群的功能,但是在稍后的版本中(5??9或者更高)Q集变的更加模块组件化。在 server.xml 中集元素已l被重构Q这h们可以替换集的不同部分而不会媄响其他元素。例如,当前配置中把成员服务讄为多点传送发现。这里可以轻易地把成员服务修Ҏ换ؓ使用TCP或?Unicast Q而不会改变集c逻辑的其他部分?
  
  其他一些集元素,例如SESSION理器,复制发送端Q复制接受端也可以被自定义的实现取代而不影响集群配置的其他部分。同P在TOMCAT集群中的M服务器组件可以用集cAPI向集中的所有成员发送消息?
  
  SESSION复制
  
服务器集通常操纵两种SESSIONQ?sticky sessions?replicated sessions 。sticky sessions是存在单机服务器中的接受网l请求的SESSIONQ其他集成员对该服务器的SESSION状态完全不清楚Q如果存有SESSION 的服务器p|的话Q用户必dơ登陆网站,重新输入所有存储在SESSION中的数据?
  
  另一USESSIONcd是,在一台服务器中SESSION状态被复制到集中的其他所有服务器上,无论何时Q只要SESSION 被改变,SESSION数据都要重新被复制。这是 replicated session ?sticky ?replicated sessions都有他们的优~点Q?Sticky sessions单而又Ҏ操作Q因为我们不必复制Q何SESSION数据到其他服务器上。这样就会减系l消耗,提高性能。但是如果服务器p|Q所有存储在该服务器内存中的SESSION数据也同样会消失。如果SESSION数据没有被复制到其他服务器,q些SESSION完全丢׃。当我们在进行一个查询事务当中的时候,丢失所有已l输入的数据Q就会导致很多问题?
  
  Z支持 JSP HTTP session 状态的自动失效无缝转移QTOMCAT服务器复制了在内存中的SESSION状态。这是通过复制存储在一台服务器上的SESSION数据到集中其他成员上防止数据丢׃及允许失效无~{UR?
  
  对象的状态管?
  
  通过在服务器上的保存状态可以区分出4U对象:
  
●无状态:一个无状态对象在调用的时候不会在内存中保存Q何状态,因ؓ客户端和服务器端没必要保存Q何有兛_方的信息。在q种情况下,客户端会在每ơ请求服务器旉会发送数据给服务器。SESSION状态被在客L和服务器端来回发送。这U方法不L可行和理想的Q特别是当传输的数据比较大或者一些安全信息我们不想保存在客户端的时候;
  
  ●会话:一个会话对象在一个SESSION中只被用于特定的某个客户端。在SESSION中,他可以ؓ所有来自该客户端的h服务Qƈ且仅仅是q个客户端的h。诏I一个SESSIONQ两个请求间的状态信息必M存。会话服务通常在内存中保存短暂的状态,当在服务器失败的时候可能会丢失。SESSION状态通常被保存在h间的服务器的内存中。ؓ了清I内存,SESSION状态也可以被从内存中释放(像在一个对象CACHEQ。在该对象中Q性能和可量测性都有待提高Q因为更新ƈ不是被单独的写到盘上,q且服务器失败的时候数据也没办法抢救?
  
  ●缓存:~存对象在内存中保存状态,q且使用q个d理从多客L来的h。缓存服务的实现可以扩展C们把~存的是数据备䆾保存在后端存储器中(通常是一个关pL据库Q?
  
●独立的Q一个独立的对象在一个时间内只活跃在集群中的一台服务器上,处理来自多客L的请求。他通常由那些私有的Q持久的Q在内存中缓寸的数据支持。他同样也在内存中保持短暂状态,在服务器p|的时候要重徏或者丢失。当p|的时候,独立对象必须在同一个服务器上重h者移植到另一台服务器上?
  
  (来源: "Using WebLogic Server Clusters")
  
  SESSION复制的设计考虑事项
  
  |络考虑事项
  
把集的多点传送地址和其他应用程序隔L臛_重要的。我们不希望集群配置或者网l布局q扰到多点传送服务器通信。和其他应用E序׃n集群多点传送地址迫佉K的服务器例E处理不应该的消息,消耗系l内存。共享多点传送地址可能也会使IP多点传送缓冲过载,延迟服务?heartbeat 消息传输。这L延迟可能D一个服务器例程被标识ؓMQ仅仅因Z?heartbeat 消息没有被及时接收?
  
  ~程考虑事项
  
  除了上面提到的网l相兛_素,q有些和我们?J2EE |络应用E序有关的设计考虑也会影响SESSION复制。以下列Z一些编E方面的考虑Q?
  
  ●SESSION数据必须被序列化Qؓ了支持HTTP session 状态的内存内复Ӟ所有的 servlet ?JSP session 数据必须被序列化Q对象中的每个域都必被序列化,q样对象被可靠的序列化?
  
●把应用E序设计为幂{的Q幂{的的意思就是一个操做不会修改状态信息,q且每次操作的时候都q回同样的结果(换句话说是Q做多次和做一ơ的效果是一LQ,通常QWEBhQ特别是 HTML forms 都被发送多ơ(当用Ld送按U两ơ,重蝲面多次Q,D多次HTTPh。设计SERVLET和其他WEB对象为幂{的Q可以容忍多ơ请求。详l可以去参考设计模?#8220;Synchronized Token ”?#8220;Idempotent Receiver ”关于怎样设计q等的的应用E序?
  
  ●在BUSINESS层存储状态:会话状态应该用有状态的SESSION BEANS存储在EJB层,而不是存储在WEB层的HttpSession。因Z业应用程序要支持各种cd客户端(WEB客户端,JAVA应用E序Q其他EJBQ,存储数据在WEB层会D在客L的双数据存储。因此,有状态的SESSION BEAN在这些情况下p用于存储SESSION状态。无状态的SESSION BEAN要ؓ每次的调用重构造会话状态。这些状态可能必M数据库中恢复的数据中重编译。这些缺点失M使用无状态SESSION BEANL高性能和可量性的目的Q严重的减低了性能?
  
  ●序列化pȝ消耗:序列化SESSION数据在复制SESSION状态的时候回会些pȝ消耗。随着序列化对象大的增长消耗也多。最好是保持SE

实践中整理出tomcat集群和负载均?
(一)环境说明
(1)服务器有4収ͼ一台安装apache,三台安装tomcat
(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2
(3)ip配置,一台安装apache的ip?92.168.0.88,三台安装tomcat的服务器ip分别?92.168.0.1/2/4
(?安装q程
(1)在三台要安装tomcat的服务器上先安装jdk
(2)配置jdk的安装\?在环境变量path中加入jdk的bin路径,新徏环境变量JAVA_HOME指向jdk的安装\?
(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启?
(4)tomcat的默认WEB服务端口?080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改?080/8888/9999
修改位置为tomcat的安装目录下的conf/server.xml
修改前的配置?
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
修改后的配置?
<Connector port="7080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
依次修改每个tomcat的监听端?7080/8888/9999)

(5)分别试每个tomcat的启动是否正?
http://192.168.0.1:7080
http://192.168.0.2:8888
http://192.168.0.4:9999
(?负蝲均衡配置q程
(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:\Program Files\Apache Group\Apache2
(2)安装后测试apache能否正常启动Q调试到能够正常启动http://192.168.0.88
(3)下蝲jk2.0.4后解压羃文g
(4)解压羃后的目录中的modules目录中的mod_jk2.so文g复制到apache的安装目录下的modules目录?我的为C:\Program Files\Apache Group\Apache2\modules
(5)修改apache的安装目录中的conf目录的配|文件httpd.confQ在文g中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so
(6)分别修改三个tomcat的配|文件conf/server.xmlQ修改内容如?
修改?
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host). -->

<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
-->

<!-- Define the top level container in our container hierarchy -->
<Engine name="Catalina" defaultHost="localhost">
修改?
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host). -->

<!-- You should set jvmRoute to support load-balancing via AJP ie :-->
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">


<!-- Define the top level container in our container hierarchy
<Engine name="Catalina" defaultHost="localhost">
-->
其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"

(7)然后重启三个tomcatQ调试能够正常启动?
(8)在apache的安装目录中的conf目录下创建文件workers2.propertieQ写入文件内容如?/p>

# fine the communication channel
[channel.socket:192.168.0.1:8009]
info=Ajp13 forwarding over socket
#配置W一个服务器
tomcatId=tomcat1 #要和tomcat的配|文件server.xml中的jvmRoute="tomcat1"名称一?
debug=0
lb_factor=1 #负蝲q因子Q数字越大请求被分配的几率越?/p>

# Define the communication channel
[channel.socket:192.168.0.2:8009]
info=Ajp13 forwarding over socket
tomcatId=tomcat2
debug=0
lb_factor=1

# Define the communication channel
[channel.socket:192.168.0.4:8009]
info=Ajp13 forwarding over socket
tomcatId=tomcat3
debug=0
lb_factor=1

[status:]
info=Status worker, displays runtime information.

[uri:/jkstatus.jsp]
info=Display status information and checks the config file for changes.
group=status:

[uri:/*]
info=Map the whole webapp
debug=0
(9)在三个tomcat的安装目录中的webapps建立相同的应?我和应用目录名ؓTomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如?
<%@ 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.print("<b>Session 列表</b>");

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="index.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>
(10)重启apache服务器和三个tomcat服务?到此负蝲 均衡已配|完成。测试负载均衡先试apache,讉Khttp://192.168.0.88/jkstatus.jsp
能否正常讉KQƈ查询其中的内容,有三个tomcat的相关配|信息和负蝲说明,讉Khttp://192.168.0.88/TomcatDemo/index.jsp看能够运?
能运行,则已建立负蝲均衡?
(?tomcat集群配置
(1)负蝲均衡配置的条件下配置tomcat集群
(2)分别修改三个tomcat的配|文件conf/server.xml,修改内容如下
修改?
<!--
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">

<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>

<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>

<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="5000"/>

<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
-->
修改?
<!-- modify by whh -->
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">

<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>

<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>

<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="5000"/>

<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
<!-- modify by whh -->
集配|选项的注释放开卛_Q如上?
(3)重启三个tomcat。到此tomcat的集已配置完成?/p>

 

(?应用配置
对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文g要添加如下一句配|?
<distributable/>
配置?
<?xml version="1.0" encoding="UTF-8"?>
<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>
</web-app>
配置?
<?xml version="1.0" encoding="UTF-8"?>
<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>

?tomcat集群是怎么处理session的阿

{?在tomcat做集之后,每个tomcat之间自动Ҏtomcat的配|文件中的参数进行session复制,
对于一个客L对说Q只要是同一个IPQ那它每ơ上传的sessionID是一L,



本文严重抄袭Qhttp://zym-nanako.javaeye.com/blog/147551

]]>
վ֩ģ壺 ƽ| | | | ½| | | | | | | | ɽ| ɽ| ֬| ĵ| Դ| | ͨ| | ²| ÷| ֹ| ʲ| | ˮ| ʳ| | ͨ| ʯׯ| ѷ| | ϳ| ÷| | «| | | Զ| ɽʡ| |