tomcat7集群配置BruceBob.doc

上传人:仙人指路1688 文档编号:2397242 上传时间:2023-02-17 格式:DOC 页数:19 大小:216KB
返回 下载 相关 举报
tomcat7集群配置BruceBob.doc_第1页
第1页 / 共19页
tomcat7集群配置BruceBob.doc_第2页
第2页 / 共19页
tomcat7集群配置BruceBob.doc_第3页
第3页 / 共19页
tomcat7集群配置BruceBob.doc_第4页
第4页 / 共19页
tomcat7集群配置BruceBob.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《tomcat7集群配置BruceBob.doc》由会员分享,可在线阅读,更多相关《tomcat7集群配置BruceBob.doc(19页珍藏版)》请在三一办公上搜索。

1、Tomcat7 集群配置Edited by Bruce Bob该文档翻译自tomcat 帮助文档,下面主要说的是session的复制机制。1:在server.xml中的 或者中添加下面内容通过上面的配置,可以实现使用DeltaManager来实现session的all-to-all的复制。所谓的all-to-all复制是一个节点的session将会被复制到所有的其他的节点其实这么做是效率很低的。这在小集群当中是相当有效的,但是当存在大集群的时候,也就是集群中有很多的tomcat节点的时候,我们不推荐这么做。当使用delta manager进行session复制的时候,即使节点中没有应用部署,s

2、ession也会被复制。避免这种情况的办法,你可以使用BackManager。该管理器只会将session复制到备份节点中。并且只会复制到部署应用的节点中。下面是几个重要的默认值:1:组播地址为 222.0.0.42:组播端口是 45564(端口和地址一起决定了集群成员节点)3:IP广播是.InetAddress.getLocalHost().getHostAddress4: 集群基本要在tomcat7中实现集群,需要实现以下步骤:u Session中的所有的属性都需要是可序列化的u 在你的server.xml中,注释掉Cluster节点u 如果你已经定义了集群值,确保在server.xml下

3、的cluster节点下的存在 ReplicationValve值u 如果你的tomcat多个实例运行在同一个机器上,确保 tcpListenPort 属性是不同的。通常,tomcat会智能检测在4000-4100之间的可用端口。u 如果你使用 mod_jk ,确保jvmRoute属性设置了 并且,jvmRoute 同你在 workers.properties中的 worker name是一致的。u 确保所有的机器的时间都是一致的。并且用NTP进行时间同步其实时间可以允许不大的差异u 确保你的 loadbalancer (负载均衡)配置了 sticky session模式如果采用session复

4、制,还需要sticky模式么?负载均衡可以通过很多的技术实现。注意:你的session是通过cookie 来进行关联的。所以,你的URL从外部看一定是一致的,否则,将会生成一个新的session。集群的配置需要jdk1.5或更高版本的支持。集群模块采用的是Tomcat的JULI日志框架。所以,你可以通过 logging.properties文件来配置日志。概述要在tomcat中实现 session的复制,可以通过三种不同的方式达到相同的效果。:u 使用session的持久化,并且将session存储在 共享文件系统中。u 使用session持久化,并将session存储到数据库中。u 使用内存

5、复制机制。使用简单的 tcp集群在发布的session复制方案中,tomcat使用DeltaManager 来实现 all-to-all的session复制或者使用BackupManager 将session复制到一个节点中。All-to-all复制算法只适用于小集群。对于大集群,采用主备session复制,这样,session只会复制到备用服务器中。当前,你使用 domain workerattribute(mod_jk1.2.8以上)来构建集群划分。这种构建方式可以解决潜在的系统构建的伸缩问题。为了确保网络通讯,你可以讲集群分成若干个组。他们可以通过不同的组播地址轻易的区分。这种结构简单来

6、说就是如下这种情况:DNS Round Robin | Load Balancer / Cluster1 Cluster2 / / Tomcat1 Tomcat2 Tomcat3 Tomcat4需要注意的是:session的复制只是集群开始。另一个实现集群的流行的概念是 farming。比如说,你在一个服务器上部署了应用,然后集群会把该应用分别部署在集群中的各个节点。这个能力可以通过 FarmWarDeployer 深入探究(server.xml中cluster的一种实现)。集群信息节点成员是通过组播的心跳来建立的。所以,如果你想拆分你的集群,你通过改变组播地址和端口来实现。心跳包括了ip地址

7、和tomcat监听的session复制的TCP端口。所有信息的交互都是通过tcp协议实现的。ReplicationValve 这个值用来找出 request是什么时候完成并开始session复制的。该值只有在session发生变化,也就是调用setAttribute或者调用removeAttribute方法时,才进行复制。一个性能最重要的考虑就是同步复制还是异步复制的问题。在同步复制中,request在session信息复制到其他的节点之后,才可用。是同步复制还是异步复制是通过 channelSendOptions( int 类型)来配置的。对于 SimpleTcpCluster/DeltaM

8、anager来说,默认值是8,他是异步的。具体配置你可以通过下面两个连接,获得更多信息。send flag(overview) or thesend flag(javadoc)在异步复制过程中,request在session同步完成之前就可用。异步可以缩短处理请求的时间。同步处理保证request返回前,session已经同步完成。节点崩溃后,绑定session如果你使用mod_jk 但是没有使用sticky session或者因为某些原因,sitcky没有起作用,或者你的tomcat崩溃了,session的id需要被修改因为他之前包含了worker 的ID,也就是之前tomcat的ID。为了

9、解决这个问题,我们使用 JvmRouteBinderValve。在一个tomcat节点崩溃后,JvmRoutrBinderValue重写session ID来确保下一个请求将会粘滞(也就是说不会回到随意的节点因为之前的节点已经不可用了)。该阀会用同样的值重写在cookie中的jessionID。如果没有配置该阀,使用mod_jk实现sticky可能就比较难了。默认的,如果没有阀被配置,那么JvmRouteBinderValve就会被加入。集群消息监听器(jvmRouteSessionIDBinderLinstener)也是被默认设置的,并且被用于一旦有节点崩溃,向其他节点重写sessionID

10、。注意,如果你在server.xml中实现自己的阀或者实现自己的监听器,那么默认的则会失效。所以确保你加入正确的阀和监听器。配置demo: !- - 下面将会对上面的配置文件进行详细的讲解:Cluster是主要的元素,在这个元素中,集群的配置的所有细节都在这里面。channelSendOpentions 是通过SimpleTcpCluster发送的消息的标示,或者任何调用SimpleTcpCluster.send方法的对象。这个标记的说明在http:/tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/tribes/Channel.

11、htmlDelatManager 是通过SimpleTcpCluster.send方法发送消息,而backup manager则是通过通道,他自己直接发送到的。 !- -这个是manager 配置的模板,如果在context元素中,没有manager配置的话,默认就用这个了。在tomcat5.x中,每一个app应用必须用同一个manager,但在该版本的tomcat中,你可以为每一个webapp定义manager。所以,你可以在你的集群中混合配置manager。很显然,每一个节点中的manager需要同集群中的其他的节点的manager是一致的。如果没有为webapp配置manager,并且w

12、ebapp被标记成,tomcat将会采用这个manager的配置并且生成一个manager的实例。关于manager的配置,参考下面链接:http:/localhost:8080/docs/config/cluster-manager.html这个channel元素是一个部落?,一个在tomcat中的组交流框架。该元素将所有和交流相关以及成员之间组织关系封装起来。详情参考:http:/localhost:8080/docs/config/cluster-channel.htmlmembership是通过组播完成的。注意如果你想扩展你的membership而超越组播,可以通过使用StaticMe

13、mbershipInterceptor来支持静态的membership。Address属性是组播地址,端口为组播端口。地址和端口共同组成了集群的分割。如果你要一个QA(质量保证)集群和一个生产集群,最简单的配置方式是将QA集群做成一个独立的组播地址和端口然后和生产集群组合。Membership组件广播TCP地址和端口到其他的节点然后节点之间就可以进行交流了。请注意,被广播的地址是 Receiver.address 的属性。更多消息参考:http:/localhost:8080/docs/config/cluster-membership.html这部分配置的是发送和接收数据的被分成了两个独立的

14、部分。上面负责的是接收数据。因为部落栈对线程比较有需求,所以,这需要配置一个线程池,该线程池中有最大和最小数量的设置。地址属性是需要向其他地址广播的地址。更多信息参考:http:/localhost:8080/docs/config/cluster-receiver.html Sender组件,负责向其他节点发送的信息的。Sender是一个shell组件:ReplicationTransmitter,但是真正完成这一工作的是他的子组件:Transport。他支持一个sender池,所以,消息可以并行的发送,如果你使用了NIO,那么消息可以并发的发送。并发意味着一个消息在同一时刻到多个sende

15、r,平行意味着多个消息在同一时刻到多个sender。跟多消息参考:http:/localhost:8080/docs/config/cluster-sender.html集群的结构: Server | Service | Engine | | - Cluster -* | Host | - / Cluster Context(1-N) | | - Manager | | - DeltaManager | - BackupManager | - | Channel - | Interceptor_1 . | Interceptor_N - | | | Receiver Sender Member

16、ship - Valve | | - ReplicationValve | - JvmRouteBinderValve | - LifecycleListener | - ClusterListener | | - ClusterSessionListener | - JvmRouteSessionIDBinderListener | - Deployer - FarmWarDeployer集群是如何工作的为了简单的明白集群是如何工作的,将会设定几个情节,在情节中,我们只设定了两个tomcat:tomcatA和tomcatB。我们将会进行如下的事件:1. TomcatA启动2. tomcatB

17、启动(等TomcatA启动完毕后)3. tomcatA收到一个请求,session S1生成。4. tomcatA宕机5. tomcatB收到一个来自S1的请求。6. tomcatA启动。7. tomcatA收到一个请求,session被调用Invalidate(S1)8. tomcatB收到一个请求,生成session S29. tomcatA session S2因为静止,所以被过期。好了,我们已经有一个剧情发展的序列了,我们将会见识一下啊session复制的过程。1. tomcatA启动tomcat 按照标准的正常配置启动。当Host对象被构建,一个cluster对象和他关联。当cont

18、exts被解析,如果在web.xml中存在distrubutable元素,tomcat要求集群类(在该配置情况下,是SimpleTcpCluster)为复制的context创建一个manager。所以,如果采用集群,在web.xml中设置distributable,tomcat将会为context生成一个DeltaManager,而不是标准的StandardManager。集群类将会启动一个membership服务(组播)和一个复制服务(TCP 单传)。2. tomcatB启动当tomcatB启动,他按照tomcatA同样的顺序启动。但是有一个不一样的是集群被启动并且建立了membership

19、(tomcatA和tomcatB),tomcatB将会请求已经在集群中存在的服务器(也就是tomcatA)的session情况。tomcatA对请求响应,并且在tomcatB江亭HTTP请求之前,将tomcatA中的session传送到tomcatB中。为防止tomcatA不响应,tomcatB将会在60秒之后超时,并生成一个日志记录。Session state将会为每一个在web.xml中配置distrubutable的web工程传输。注意,为了是session复制更有效率,你所有的tomcat实例配置应该是一样的。3. tomcatA收到一个请求,生成session S1当tomcat收到

20、一个请求,tomcatA就像没有集群一样处理请求。当request完毕,才发生动作。 ReplicationValve将会在response返回用户之前拦截请求。在这个时候,他发现session被修改了,于是使用TCP复制session传向tomcatB。一旦已经序列化的数据被操作系统的TCP处理,request将会通过阀管道返回用户。对于每一个请求,整个session都会被复制(属性没变化也复制?)这就允许代码修改session中的属性而不调用setAttribute和removeAttribute。所以,使用 userDirtyFlag配置参数可以减少session被复制的次数。4. to

21、mcatA宕机当tomcatA宕机,tomcatB收到收到一个tomcatA从集群中失落的通知。TomcatB将tomcatA从membership列表中移除。并且当tomcatB中的session发生变化,不再通知tomcatA。负载均衡将指向tomcatA的请求定向到tomcatB。5. tomcatB收到来自session S1的请求没什么特殊的处理,tomcatB就想处理其他请求一样处理该请求6. tomcatA 启动在tomcatA能够处理新的到自己的请求之前,他将会按照1,2步进行启动。他将会加入到集群中。联系TomcatB并同步所有的session。一旦他结束接受session

22、state,他就停止加载并打开 http/mod_jk端口。所以不会有请求被发送到tomcatA直到他接收到了所有tomcatB的session。7. tomcatA收到请求,session调用invalidate(S1)调用invalidate被拦截,session和invalidated session进行排队。当请求被处理完毕,不是向外发送session已经被改变了,而是向tomcatB发送“session过期”消息。tomcatB将会是session失效。8. tomcatB收到一个请求,生成一个新的session(S2)过程和3 是一样的9. TomcatA中,session S2因

23、为静止而过期Invalidate方法被调用时,被拦截,就像是用户要使session失效的过程一样。这时候,失效的session不会被复制到其他的节点。(有点不是特明白)Membership :集群中的membership 的建立是通过简单的组播 ping。每一个tomcat定期的发送一个组播 ping,在ping的消息中,包含了该节点用于session复制的IP和TCP监听的端口。如果一个节点在给定的时间内没有收到任何的ping,那么认为这个节点是挂了的。当然,你需要在你的系统中建立组播的功能。TCP 复制:一旦一个组播消息被接受,该成员就被加入到集群中,并进行复制请求,发送的实例通过host

24、和端口机那里TCP socket,通过该socket,发送经过序列化的数据。为什么选择TCP socket是因为有包顺序控制和可信任链接(UDP相反)。这里简单说一下组播的概念:IP组播是指一个IP报文向一个“主机组”的传送,这个包含零个或多个主机的主机组由一个单独的IP地址标识。主机组地址也称为“组播地址”,或者D类地址。除了目的地址部分,组播报文与普通报文没有区别,网络尽力传送组播报文但是并不保证一定送达。主机组的成员可以动态变化,主机有权选择加入或者退出某个主机组。主机可以加入多个主机组,也可以向自己没有加入的主机组发送数据。主机组有两种:永久组和临时组。永久组的IP地址是周知的,由In

25、ternet管理机构分配,是保留地址。临时组的地址则使用除永久组地址外的非保留D类地址。IP组播分组在互联网上的转发由支持组播的路由器来处理。主机发出的IP组播分组在本子网内被所有主机组成员接收,同时与该子网直接相连的组播路由器会把组播报文转发到所有包含该主机组成员的网络上。组播报文传递的范围由报文的生存期值(TTL, Time-to-Live)决定,如果TTL值等于或者小于设置的路由器端口TTL门限值(TTL Threshold),路由器将不再转发该报文。通过JMX监控集群监控集群时很重要的。一些集群的对象是JMX beans集群中的各个元素的用意及配置集群元素简介集群中实现了session复制以及context属性的复制和war包的集群部署。因为集群配置是相当复杂

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号