《2022年tomcat集群的配置 .pdf》由会员分享,可在线阅读,更多相关《2022年tomcat集群的配置 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、对于 WEB 应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块。要实现这一点,大体上有两种方式,一种是把所有 Session 数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session 服务器来获取数据;另一种就是在集群中的所有节点间进行Session 数据的同步拷贝,任何一个节点均保存了所有的Session 数据。两种方式都各有优点,第一种方式简单、易于实现,但是存在着Session 服务器发生故障会导致全系统不能正常工作的风险;第二种方式可靠性更高,任一节点的故障不会对整个系统对客户访问
2、的响应产生影响,但是技术实现上更复杂一些。常见的平台或中间件如microsoft 和 IBM WAS 都会提供对两种共享方式的支持,tomcat 也是这样,但是一般采用第二种方式。当采用 tomcat 默认集群配置()时,配置的细节实际上被省略了,对于大多数应用而言,使用默认配置已经足够,完整的默认配置应该是这样:名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 7 页 -下面笔者对这里的配置项作详细解释,以下内容均是笔者阅读了tomcat官方文档后自己的理解,有些可能不对,希望读者能带着批判的眼光阅读,并欢迎指正笔者错误。tomcat集群各节点通过建立tcp 链接来完成 Sess
3、ion 的拷贝,拷贝有同步和异步两种模式。在同步模式下,对客户端的响应必须在Session 拷贝到其他节名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 7 页 -点完成后进行;异步模式无需等待Session 拷贝完成就可响应。异步模式更高效,但是同步模式可靠性更高。同步异步模式由channelSendOptions 参数控制,默认值是 8,为异步模式,4 是同步模式。在异步模式下,可以通过加上拷贝确认(Acknowledge)来提高可靠性,此时channelSendOptions 设为 10。Manager用来在节点间拷贝Session,默认使用 DeltaManager,Del
4、taManager 采用的一种 all-to-all的工作方式,即集群中的节点会把 Session数据向所有其他节点拷贝,而不管其他节点是否部署了当前应用。当集群中的节点数量很多并且部署着不同应用时,可以使用BackupManager,BackManager仅向部署了当前应用的节点拷贝Session。但是到目前为止 BackupManager并未经过大规模测试,可靠性不及DeltaManager。Channel负责对 tomcat 集群的 IO 层进行配置。Membership用于发现集群中的其他节点,这里的address 用的是组播地址(Multicast address,了解更多组播地址详
5、情请参见http:/ tomcat 集群分成多个子集群。Receiver 用于各个节点接收其他节点发送的数据,在默认配置下tomcat 会从 4000-4100 间依次选取一个可用的端口进行接收,自定义配置时,如果多个tomcat 节点在一台物理服务器上注意要使用不同的端口。Sender 用于向其他节点发送数据,具体实现通过Transport 配置,PooledParallelSender是从 tcp 连接池中获取连接,可以实现并行发送,即集群中的多个节点可以同时向其他所有节点发送数据而互不影响。Interceptor有点类似下面将要解释的Valve,起到一个阀门的作用,在数据到达目的节点前进
6、行检测或其他操作,如TcpFailureDetector用于检测在数据的传输过程中是否发生了 tcp 错误。关于 Channel 的编程模型,请参见http:/tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/tribes/Channel.html。Valve用于在节点向客户端响应前进行检测或进行某些操作,ReplicationValve就是用于用于检测当前的响应是否涉及Session 数据的更新,如果是则启动 Session 拷贝操作,filter用于过滤请求,如客户端对图片,css,js 的请求就不会涉及Session,因此不
7、需检测,默认状态下不进行过滤,监测所有的响应。JvmRouteBinderValve 会在前端的 Apache mod_jk 发生错误时保证同一客户端的请求发送到集群的同一个节点,tomcat 官方文档并未解释如何实现这一点,而且笔者认为这一设置似乎并无多大实用性。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 7 页 -Deployer用于集群的 farm 功能,监控应用中文件的更新,以保证集群中所有节点应用的一致性,如某个用户上传文件到集群中某个节点的应用程序目录下,Deployer 会监测到这一操作并把这一文件拷贝到集群中其他节点相同应用的对应目录下以保持所有应用的一致。这
8、是一个相当强大的功能,不过很遗憾,tomcat 集群目前并不能做到这一点,开发人员正在努力实现它,这里的配置只是预留了一个接口。Listener用于跟踪集群中节点发出和收到的数据,也有点类似Valve 的功能。在大体了解了 tomcat 集群实现模型后,就可以对集群作出更优化的配置了,tomcat 推荐了一套配置,使用了比DeltaManager 更高效的 BackupManager,并且对 ReplicationValve设置了请求过滤,注意在一台服务器部署多个节点时需要修改 Receiver 的侦听端口,另外,为了更高效的在节点间拷贝数据,所有tomcat 节点最好采用相同的配置,具体配置
9、如下:Tomcat集群除了可以进行Session 数据的拷贝,还可进行 Context 属性的拷贝,通过修改 context.xml的 Context 配置可以实现,使用 替换默认 Context 即可,当然也可再加上distributable=true属性。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 7 页 -下面通过假想的一组场景来描述tomcat 集群如何工作,集群采用默认配置,由 t1 和 t2 两个 tomcat 例程组成,场景按照时间顺序排列。1.t1启动 t1按照标准的 tomcat 启动,当 Host 对象被创建时,一个 Cluster对象(默认配置下是 Si
10、mpleTcpCluster)也同时被关联到这个Host 对象。当某个应用在web.xml 中设置了 distributable时,Tomcat将为此应用的上下文环境创建一个DeltaManager。SimpleTcpCluster启动 membership服务和 Replication服务(用于建立 tcp 连接)。2.t2启动(待 t1 启动完成后)首先 t2 会执行和 t1 一样的操作,然后SimpleTcpCluster会建立一个由t1 和 t2 组成的 membership。接着 t2 向集群中已启动的服务器即t1 请求 Session数据,如果 t1 没有响应 t2 的拷贝请求,t
11、2 会在 60秒后 time out。在 Session数据拷贝完成之前t2 不会接收客户端的http 或 mod_jk/ajp请求。3.t1接收 http 请求,创建 Session s1 t1正常响应客户请求,但是在t1 把结果发送回客户端时,ReplicationValve会拦截当前请求(如果 filter中配置了不需拦截的请求类型,这一步就不会进行,默认配置下拦截所有请求),如果发现当前请求更新了Session,调用 Replication服务建立 tcp 连接把 Session 拷贝到 membership列表中的其他节点即t2,返回结果给客户端(注意,如果采用同步拷贝,必须等拷贝完
12、成后才会返回结果,异步拷贝在数据发送到tcp 连接就返回结果,不等待拷贝完成)。在拷贝时,所有保存在当前 Session 中的可序列化的对象都会被拷贝,而不仅仅是发生更新的部分。4.t1崩溃当 t1 崩溃时,t2 会被告知 t1 已从集群中退出,然后t2 就会把 t1 从自己的 membership列表中删除,发生在t2 的 Session 更新不再往 t1 拷贝,同时负载均衡器会把后续的http 请求全部转发给 t2。在此过程中所有的Session 数据不会丢失。5.t2接收 s1 的请求 t2正常响应 s1 的请求,因为 t2 保存着 s1 的所有数据。6.t1重新启动按步骤 1、2 一样
13、的操作启动,加入集群,从t2 拷贝所有 Session 数据,拷贝完成后开放自己的http 和 mod_jk/ajp端口接收请求。名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 7 页 -7.t1接收请求,s1 失效 t1继续接收来自 s1 的请求,把 s1 设置为过期。这里的过期并非因为s1处于非活动状态超过设置的时间,而是执行类似注销的操作而引起的Session失效。这时 t1 并非发送 s1 的所有数据而是一个类似s1 expired 的消息,t2 收到消息后也会把 s1 设为过期。8.t2接收请求,创建 Session s2 和步骤 3 一样。9.t1 s2过期对于因超时引起的 Session 失效 t1 无需通知 t2,因为 t2 同样知道 s2 已经超时。因此对于tomcat 集群有一点非常重要,所有节点的操作系统时间必须一致!不然会出现某个节点Session 已过期而在另一节点此Session 仍处于活动状态的现象。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 7 页 -