tomcat7集群配置BruceBob.doc_第1页
tomcat7集群配置BruceBob.doc_第2页
tomcat7集群配置BruceBob.doc_第3页
tomcat7集群配置BruceBob.doc_第4页
tomcat7集群配置BruceBob.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

tomcat7 集群配置edited by bruce bob该文档翻译自tomcat 帮助文档,下面主要说的是session的复制机制。1:在server.xml中的 或者中添加下面内容通过上面的配置,可以实现使用deltamanager来实现session的all-to-all的复制。所谓的all-to-all复制是一个节点的session将会被复制到所有的其他的节点其实这么做是效率很低的。这在小集群当中是相当有效的,但是当存在大集群的时候,也就是集群中有很多的tomcat节点的时候,我们不推荐这么做。当使用delta manager进行session复制的时候,即使节点中没有应用部署,session也会被复制。避免这种情况的办法,你可以使用backmanager。该管理器只会将session复制到备份节点中。并且只会复制到部署应用的节点中。下面是几个重要的默认值:1:组播地址为 2:组播端口是 45564(端口和地址一起决定了集群成员节点)3:ip广播是.inetaddress.getlocalhost().gethostaddress4: 集群基本要在tomcat7中实现集群,需要实现以下步骤:u session中的所有的属性都需要是可序列化的u 在你的server.xml中,注释掉cluster节点u 如果你已经定义了集群值,确保在server.xml下的cluster节点下的存在 replicationvalve值u 如果你的tomcat多个实例运行在同一个机器上,确保 tcplistenport 属性是不同的。通常,tomcat会智能检测在4000-4100之间的可用端口。u 如果你使用 mod_jk ,确保jvmroute属性设置了 并且,jvmroute 同你在 perties中的 worker name是一致的。u 确保所有的机器的时间都是一致的。并且用ntp进行时间同步其实时间可以允许不大的差异u 确保你的 loadbalancer (负载均衡)配置了 sticky session模式如果采用session复制,还需要sticky模式么?负载均衡可以通过很多的技术实现。注意:你的session是通过cookie 来进行关联的。所以,你的url从外部看一定是一致的,否则,将会生成一个新的session。集群的配置需要jdk1.5或更高版本的支持。集群模块采用的是tomcat的juli日志框架。所以,你可以通过 perties文件来配置日志。概述要在tomcat中实现 session的复制,可以通过三种不同的方式达到相同的效果。:u 使用session的持久化,并且将session存储在 共享文件系统中。u 使用session持久化,并将session存储到数据库中。u 使用内存复制机制。使用简单的 tcp集群在发布的session复制方案中,tomcat使用deltamanager 来实现 all-to-all的session复制或者使用backupmanager 将session复制到一个节点中。all-to-all复制算法只适用于小集群。对于大集群,采用主备session复制,这样,session只会复制到备用服务器中。当前,你使用 domain workerattribute(mod_jk1.2.8以上)来构建集群划分。这种构建方式可以解决潜在的系统构建的伸缩问题。为了确保网络通讯,你可以讲集群分成若干个组。他们可以通过不同的组播地址轻易的区分。这种结构简单来说就是如下这种情况:dns round robin | load balancer / cluster1 cluster2 / / tomcat1 tomcat2 tomcat3 tomcat4需要注意的是:session的复制只是集群开始。另一个实现集群的流行的概念是 farming。比如说,你在一个服务器上部署了应用,然后集群会把该应用分别部署在集群中的各个节点。这个能力可以通过 farmwardeployer 深入探究(server.xml中cluster的一种实现)。集群信息节点成员是通过组播的心跳来建立的。所以,如果你想拆分你的集群,你通过改变组播地址和端口来实现。心跳包括了ip地址和tomcat监听的session复制的tcp端口。所有信息的交互都是通过tcp协议实现的。replicationvalve 这个值用来找出 request是什么时候完成并开始session复制的。该值只有在session发生变化,也就是调用setattribute或者调用removeattribute方法时,才进行复制。一个性能最重要的考虑就是同步复制还是异步复制的问题。在同步复制中,request在session信息复制到其他的节点之后,才可用。是同步复制还是异步复制是通过 channelsendoptions( int 类型)来配置的。对于 simpletcpcluster/deltamanager来说,默认值是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。为了解决这个问题,我们使用 jvmroutebindervalve。在一个tomcat节点崩溃后,jvmroutrbindervalue重写session id来确保下一个请求将会粘滞(也就是说不会回到随意的节点因为之前的节点已经不可用了)。该阀会用同样的值重写在cookie中的jessionid。如果没有配置该阀,使用mod_jk实现sticky可能就比较难了。默认的,如果没有阀被配置,那么jvmroutebindervalve就会被加入。集群消息监听器(jvmroutesessionidbinderlinstener)也是被默认设置的,并且被用于一旦有节点崩溃,向其他节点重写sessionid。注意,如果你在server.xml中实现自己的阀或者实现自己的监听器,那么默认的则会失效。所以确保你加入正确的阀和监听器。配置demo: !- - 下面将会对上面的配置文件进行详细的讲解:cluster是主要的元素,在这个元素中,集群的配置的所有细节都在这里面。channelsendopentions 是通过simpletcpcluster发送的消息的标示,或者任何调用simpletcpcluster.send方法的对象。这个标记的说明在/tomcat-7.0-doc/api/org/apache/catalina/tribes/channel.htmldelatmanager 是通过simpletcpcluster.send方法发送消息,而backup manager则是通过通道,他自己直接发送到的。 !- -这个是manager 配置的模板,如果在context元素中,没有manager配置的话,默认就用这个了。在tomcat5.x中,每一个app应用必须用同一个manager,但在该版本的tomcat中,你可以为每一个webapp定义manager。所以,你可以在你的集群中混合配置manager。很显然,每一个节点中的manager需要同集群中的其他的节点的manager是一致的。如果没有为webapp配置manager,并且webapp被标记成,tomcat将会采用这个manager的配置并且生成一个manager的实例。关于manager的配置,参考下面链接:http:/localhost:8080/docs/config/cluster-manager.html这个channel元素是一个部落?,一个在tomcat中的组交流框架。该元素将所有和交流相关以及成员之间组织关系封装起来。详情参考:http:/localhost:8080/docs/config/cluster-channel.htmlmembership是通过组播完成的。注意如果你想扩展你的membership而超越组播,可以通过使用staticmembershipinterceptor来支持静态的membership。address属性是组播地址,端口为组播端口。地址和端口共同组成了集群的分割。如果你要一个qa(质量保证)集群和一个生产集群,最简单的配置方式是将qa集群做成一个独立的组播地址和端口然后和生产集群组合。membership组件广播tcp地址和端口到其他的节点然后节点之间就可以进行交流了。请注意,被广播的地址是 receiver.address 的属性。更多消息参考:http:/localhost:8080/docs/config/cluster-membership.html这部分配置的是发送和接收数据的被分成了两个独立的部分。上面负责的是接收数据。因为部落栈对线程比较有需求,所以,这需要配置一个线程池,该线程池中有最大和最小数量的设置。地址属性是需要向其他地址广播的地址。更多信息参考:http:/localhost:8080/docs/config/cluster-receiver.html sender组件,负责向其他节点发送的信息的。sender是一个shell组件:replicationtransmitter,但是真正完成这一工作的是他的子组件:transport。他支持一个sender池,所以,消息可以并行的发送,如果你使用了nio,那么消息可以并发的发送。并发意味着一个消息在同一时刻到多个sender,平行意味着多个消息在同一时刻到多个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 membership - valve | | - replicationvalve | - jvmroutebindervalve | - lifecyclelistener | - clusterlistener | | - clustersessionlistener | - jvmroutesessionidbinderlistener | - deployer - farmwardeployer集群是如何工作的为了简单的明白集群是如何工作的,将会设定几个情节,在情节中,我们只设定了两个tomcat:tomcata和tomcatb。我们将会进行如下的事件:1. tomcata启动2. tomcatb启动(等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对象和他关联。当contexts被解析,如果在web.xml中存在distrubutable元素,tomcat要求集群类(在该配置情况下,是simpletcpcluster)为复制的context创建一个manager。所以,如果采用集群,在web.xml中设置distributable,tomcat将会为context生成一个deltamanager,而不是标准的standardmanager。集群类将会启动一个membership服务(组播)和一个复制服务(tcp 单传)。2. tomcatb启动当tomcatb启动,他按照tomcata同样的顺序启动。但是有一个不一样的是集群被启动并且建立了membership(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收到一个请求,tomcata就像没有集群一样处理请求。当request完毕,才发生动作。 replicationvalve将会在response返回用户之前拦截请求。在这个时候,他发现session被修改了,于是使用tcp复制session传向tomcatb。一旦已经序列化的数据被操作系统的tcp处理,request将会通过阀管道返回用户。对于每一个请求,整个session都会被复制(属性没变化也复制?)这就允许代码修改session中的属性而不调用setattribute和removeattribute。所以,使用 userdirtyflag配置参数可以减少session被复制的次数。4. tomcata宕机当tomcata宕机,tomcatb收到收到一个tomcata从集群中失落的通知。tomcatb将tomcata从membership列表中移除。并且当tomcatb中的session发生变化,不再通知tomcata。负载均衡将指向tomcata的请求定向到tomcatb。5. tomcatb收到来自session s1的请求没什么特殊的处理,tomcatb就想处理其他请求一样处理该请求6. tomcata 启动在tomcata能够处理新的到自己的请求之前,他将会按照1,2步进行启动。他将会加入到集群中。联系tomcatb并同步所有的session。一旦他结束接受session 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因为静止而过期invalidate方法被调用时,被拦截,就像是用户要使session失效的过程一样。这时候,失效的session不会被复制到其他的节点。(有点不是特明白)membership :集群中的membership 的建立是通过简单的组播 ping。每一个tomcat定期的发送一个组播 ping,在ping的消息中,包含了该节点用于session复制的ip和tcp监听的端口。如果一个节点在给定的时间内没有收到任何的ping,那么认为这个节点是挂了的。当然,你需要在你的系统中建立组播的功能。tcp 复制:一旦一个组播消息被接受,该成员就被加入到集群中,并进行复制请求,发送的实例通过host和端口机那里tcp socket,通过该socket,发送经过序列化的数据。为什么选择tcp socket是因为有包顺序控制和可信任链接(udp相反)。这里简单说一下组播的概念:ip组播是指一个ip报文向一个“主机组”的传送,这个包含零个或多个主机的主机组由一个单独的ip地址标识。主机组地址也称为“组播地址”,或者d类地址。除了目的地址部分,组播报文与普通报文没有区别,网络尽力传送组播报文但是并不保证一定送达。主机组的成员可以动态变化,主机有权选择加入或者退出某个主机组。主机可以加入多个主机组,也可以向自己没有加入的主机组发送数据。主机组有两种:永久组和临时组。永久组的ip地址是周知的,由internet管理机构分配,是保留地址。临时组的地址则使用除永久组地址外的非保留d类地址。ip组播分组在互联网上的转发由支持组播的路由器来处理。主机发出的ip组播分组在本子网内被所有主机组成员接收,同时与该子网直接相连的组播路由器会把组播报文转发到所有包含该主机组成员的网络上。组播报文传递的范围由报文的生存期值(ttl, time-to-live)决定,如果ttl值等于或者小于设置的路由器端口ttl门限值(ttl threshold),路由器将不再转发该报文。通过jmx监控集群监控集群时很重要的。一些集群的对象是jmx beans集群中的各个元素的用意及配置集群元素简介集群中实现了session复制以及context属性的复制和war包的集群部署。因为集群配置是相当复杂的,默认配置对大多数人来说将会十分有用的。tomcat 集群的实现是可扩展的。因此,我们提供了很多的配置项,虽然配置项看起来很多,但是不要失去信心,你通过这些配置便有了很强大的配置。是在engine配置还是在host配置的问题你可以再server.xml中的 engine或者host元素中加入 cluster元素。将其放入engine中意味着你在tomcat中所有的host都将支持集群。并且将共享消息组件。当你将cluster放入 engine节点,那么集群会将每一个sessionmanager的host name放入 manager name,这样,两个context即使用同样的名字,但是只要在两个不同的host中,也会被区分出来。context属性复制要配置context属性复制,只需加入下面代码即可将app的context的context实现进行交换。配置内容attributedescriptionclassname集群类,目前只有一个是可用的 org.apache.catalina.ha.tcp.simpletcpcluster channelsendoptions组通讯框架(tribes)的发送配置,默认值为8该选项用于设置需要通过simpletcpcluster发送的消息的数量,他决定了信息是如何被发出的 int options= channel.send_options_asynchronous | channel.send_options_synchronized_ack | channel.send_options_use_ack; 这其中的一些值:channel.send_options_synchronized_ack = 0x0004channel.send_options_asynchronous = 0x0008channel.send_options_use_ack = 0x0002所以,如果使用ack和async,那么就是(8+2)。注意如果使用async,session更新消息的时候,接受消息的节点和发送的顺序有可能是不一样的。channelstartoptions设置该选项来启动和停止集群使用 对象。默认的 channel.default 是启用了所有的channel服务,包括sender,receiver,组播sender和组播receiver。 channel.default = channel.snd_rx_seq (1)| channel.snd_tx_seq (2)| channel.mbr_rx_seq (4)| channel.mbr_tx_seq (8); 如果你不想使用,组播技术,那可以使用channel.snd_rx_seq | channel.snd_tx_seq 也就是3.heartbeatbackgroundenabled启用该选项别忘了禁用channel的heartbeatdoclusterlogdeprecated since 6.0.0possible values are true or falsevalue is inherited from tomcat 5.5 and has no official meaning. to configure logging, use the standard tomcat logging configuration. clusterlognamedeprecated since 6.0.0value is inherited from tomcat 5.5 and has no official meaning. to configure logging, use the standard tomcat logging configuration. 嵌入组件manager集群中的manager是一个tomcat的session manager接口的一个实现。集群接口必须实现 org.apache.catalina.ha.clustermanager 并单独的负责session的复制。现在有两种manager:org.apache.catalina.ha.session.deltamanager复制集群中所有的session。这个实现被证明工作的很不错,但是有一个限制就是集群中的所有成员都是均匀的,所有的节点的配置都是一样的。还有一个manager就是org.apache.catalina.ha.session.backupmanager,他也可以进行session复制,但是只向备份节点进行复制。备份节点的位置是所有其他节点都知道的。他也支持不均匀部署。所以,manager知道所有web应用程序的位置。在cluster中定义的manager元素是所有在web.xml中标记的工程的模板。然后,你也可以在context.xml中或者server.xml中定义manager来重写每一个web应用的默认的实现。common attributesattributedescriptionclassnamenamecluster的名字,只要在container中是唯一的即可notifylistenersonreplication如果session中的属性发生变化,你需要让session listener知道并且复制到集群中的其他的节点,则设置为trueexpiresessionsonshutdown当一个app被关闭,tomcat使得每一个session过期,并通知所有的listener。如果你希望一个节点被关闭,在所有节点的所有的session都过期,设置该项为true,默认为falsesessionattributefilter一个对filter的正则表达式,该表达式的session的属性将会被复制,只有属性的名字符合表达式,该属性才会被复制。如果该属性没有被设置,则所有的属性都会被复制。比如说该值为(username|sessionhistory)$,那么,只有username和sessionhistory会被复制。org.apache.catalina.ha.session.deltamanager attributesattributedescriptionexpiresessionsonshutdown同上maxactivesessions该manager能生成的最大session数量。默认-1为没有限制。对该manager来说,所有的session都被认为是活动的,不管该节点是否是session的活动主机。notifysessionlistenersonreplication同上notifycontainerlistenersonreplication如果session中的属性发生变化,你需要让context listener知道并且复制到集群中的其他的节点,则设置为truestatetransfertimeout等待一个session state从另一个节点传输结束时间,默认限制为60秒 org.apache.catalina.ha.session.backupmanager attributesattributedescriptionmapsendoptionsbackupmanager使用了一个用于发送和接收消息的复制地图。你可以设置该配置来规定map是如何发送消息的。默认值是6(同步的)。注意如果你使用异步消息,发送消息的顺序同接收消息的顺序可能是不一样的。 maxactivesessions该manager能生成的最大session数量。默认-1为没有限制。对该manager来说,只有主服务的session才算是活动的session。rpctimeoutrpc超时时间,默认是15000毫秒(神马是rpc?)channelchannel是我们被称为 apache tribes的主要组件。他管理一系列的子组件来构成一组交互框架。这个框架被那些需要同其他to

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论