Tomcat7 Cluster 集群
Tomcat7 自带的集群功能是通过session复制完成的,现有两个复制方式:
- DeltaManager:
将session复制到所有tomcat节点中,不管是否有相应的应用(it will replicate to all nodes, even nodes that don't have the application deployed.)。缺点是如果集群节点很多,此种方式的系统消耗太大。具体节点多少算多,官方没有给出数量级。
- BackupManager:
将session复制到一个备份节点中,并且只复制到有相应应用的节点。(This manager only replicates the session data to one backup node, and only to nodes that have the application deployed.)缺点是这种方式没有像DeltaManager一样经过大规模的应用测试。
一个简单的Tomcat集群结构
DNS Round Robin
|
Load Balancer
/ \
Cluster1 Cluster2
/ \ / \
Tomcat1 Tomcat2 Tomcat3 Tomcat4
Tomcat7中运行session复制,需要完成以下步骤(先有个印象,再看下面的实例):
- session中所有的属性(attributes)必须实现java.io.Serializable
- 去掉配置文件server.xml中cluster元素的注释
- 如果要自定义cluster valves,确认在Cluster元素里定义ReplicationValve。
- 如果Tomcat节点运行在同一台服务器上,确保tcpListenPort属性值唯一。在大多数情况下,Tomcat可以自动检测4000-4100范围内的端口
- 确保应用中web.xml文件有<distributable/>元素
- 如果使用mod_jk,确保设置jvmRoute属性<Engine name="Catalina" jvmRoute="node01">,并且这个属性要和workers.properties相同
- 确保所有节点都有相同的时间。
- 确保loadbalancer被设置为粘性session模式(sticky session)
注意:浏览器会在某些情况下创建新的Session。
配置:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<!--
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
-->
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
默认的manager。在Tomcat5.x以后每个webapp都可以配自己的manager,但是每个节点上相同的webapp要配置相同的manager。如果<Context>中没有manager的配置则使用上面的配置。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-manager.html
Channel元素是Tribes,该元素封装所有沟通和成员逻辑。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-channel.html
通过组播方式建立成员,通过address和port设置一个组播,在相同组播下为同一个集群。Tribes也支持静态成员,通过使用StaticMembershipInterceptor。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-membership.html
在Tribes中,发送(sender)和接收(receiver)是分开的两个组件。每个节点的address和port是不同的(如果节点有不同的IP地址,可以使用"auto",如果节点在同一个IP上,则port必须不同)。这个组件中有一个线程池,可以配置相关信息。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-receiver.html
发送(sender)组件,这个就这么配,没什么贴别特别说明的。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-sender.html
Tribes用堆栈发送信息,在堆栈中的每个元素都要通过interceptor。
过滤一些不会修改session的request。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-valve.html
- <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
- tempDir="/tmp/war-temp/"
- deployDir="/tmp/war-deploy/"
- watchDir="/tmp/war-listen/"
- watchEnabled="false"/>
默认的tomcat集群支持Farm部署,通过一个节点,可以部署和卸载应用到其他节点。集群中只设置一个主节点,将watchEnabled设为true,主节点将监听watchDir的变化,先更新本节点的deployDir,之后更新其他节点的deployDir。集群中其他节点的watchEnabled设为false。如果要执行此功能,Cluster必须是Host的子元素。
在项目中添加一个广泛使用的测试jsp:
启动两个Tomcat,用浏览器访问一个Tomcat,设置一些属性到Session中,用相同浏览器代开另一个窗口,访问另一个Tomcat,看到页面中的Session含有之前设置的属性就说明Session复制成功。


Tomcat7 Cluster 集群的更多相关文章
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis 3.0 Cluster集群配置
Redis 3.0 Cluster集群配置 安装环境依赖 安装gcc:yum install gcc 安装zlib:yum install zib 安装ruby:yum install ruby 安装 ...
- mysql galera cluster 集群的分裂与仲裁机制
集群的分裂 当集群由于网络原因分裂为几个单独的组时(一组可能是单节点,也可能是几个互联的节点),数据出现不一致,此时可能产生脑裂及数据不一致.这种情况 下,只有一组节点能够继续提供服务,这组节点的状态 ...
- MySQL Cluster 集群
本文转载 http://www.cnblogs.com/gomysql/p/3664783.html MySQL Cluster是一个基于NDB Cluster存储引擎的完整的分布式数据库系统.不仅仅 ...
- 【原】基于 HAproxy 1.6.3 Keeplived 在 Centos 7 中实现mysql mariadb galera cluster 集群分发读写 —— 上篇
前言 有一段时间没有写blogs,乘着周末开始整理下haproxy + keeplived 实现 mysql mariadb galera cluster 集群访问环境的搭建工作. 本文集中讲hapr ...
- cluster集群
http://zwfang09.blog.sohu.com/entry/ Cluster 集群 ,群集 --- 负载均衡 LB ,load-balance --- 高可用集群 HA ,High Ava ...
- Redis Cluster集群搭建与配置
Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...
- jedis处理redis cluster集群的密码问题
环境介绍:jedis:2.8.0 redis版本:3.2 首先说一下redis集群的方式,一种是cluster的 一种是sentinel的,cluster的是redis 3.0之后出来新的集群方式 本 ...
- 深入分析redis cluster 集群
深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...
随机推荐
- swiftSingleton模式
swift在几个方面Singleton模式: 1. 全局变量 private let _singleton = Singleton() class Singleton: NSObject { clas ...
- iterm2 快捷键大全 Mac item2常用快捷键
整理使用 iTerm 2 过程中得常用快捷键,Mac 原来自带的终端工具 Terminal 不好用是出了名的,虽然最近几个版本苹果稍微做了些优化,功能上,可用性方面增强不少,无奈有个更好用的 Iter ...
- 准备战争“软测试”之DB基础知识
"数据库"东西这个陌生和数据,进入提高班,从第二年开始接触,的项目还是自考的学习加起来也有3遍了.这仅仅是一个開始,软考又要对数据库进行全面的分析,那么如今就让我们再一次剖析它吧! ...
- UML九种图汇总
UML视频读,该文件开始起草.我不知道如何下手啊!我想先UML九图和总结的关系,然后开始用它的文件. 首先在地图上. UML的九种图各自是:用例图.类图.对象图.状态图.活动图.协作图.序列图.组件图 ...
- 了解了解你自己的话zookeeper(从那时起,纠正了一些说法在线)
1,先看看官方的定义吧: ZooKeeper is a distributed, open-source coordination service for distributed applicatio ...
- C_文件读写流
strcmp() 所在头文件:string.h 功能:比较俩个字符串 一般形式:strcmp(字符串1,字符串2) 说明: 当S1<S2时,返回为负数return result,result&l ...
- 脉冲神经网络Spiking neural network
(原文地址:维基百科) 简单介绍: 脉冲神经网络Spiking neuralnetworks (SNNs)是第三代神经网络模型,其模拟神经元更加接近实际,除此之外,把时间信息的影响也考虑当中.思路是这 ...
- Responsive Design in 3 Steps
Responsive web design is no doubt a big thing now. If you still not familiar with responsive design, ...
- linux下crontab的使用实现
1 crontab实现定时任务 1.1服务状态 /sbin/service crond status 查看定时任务的服务是否启动 参数:start 启动服务 Stop 停止服务 R ...
- yii性能调节
网络应用程序的性能受很多因素的影响.数据库存取,文件系统操作,网络带宽等都是潜在的影响因素. Yii 已在各个方面减少框架带来的性能影响.但是在用户的应用中仍有很多地方可以被改善来提高性能. 1. 开 ...