|
|
|
|
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<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;.*.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">
|
|
|
|
|
Cluster是主要的元素,所有集群相关的详细配置都包含在元素内部. SimpleTcpCluster类或调用 SimpleTcpCluster.send 方法发送的每个消息, 都会附加上 channelSendOptions
这么一个标志. 关于发送标志的详细描述信息可以参考 Tomcat
官方 javadoc . DeltaManager
调用 SimpleTcpCluster.send 方法来发送消息, 而 backup manager 则自己直接通过channel来发送.
想要了解更多信息, 请访问 集群配置参考文档
|
|
|
|
<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"/>
-->
|
|
|
|
|
这是一个用于 manager 配置的模板,当 <Context> 元素中没有定义 manager 时作为默认值. 在 Tomcat 5.x 中每个标记为 distributable 的 webapp 都需要使用同一个manager。 但从 Tomcat 6 开始就没有这样的限制了, 可以为每个 webapp 指定一个 manager 类, 因此在 cluster 中可以存在多种 managers. 显然, 在一个节点中某个应用程序的 管理器 必须同集群中其他节点同一个应用的管理器保持一致。 如果 webapp
被标记为 <distributable/> , 而webapp又没有自定义 manager, Tomcat 就会使用此模板克隆一个 manager 实例.
想要了解更多信息, 请访问 集群manager配置参考文档
|
|
|
|
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
|
|
|
|
|
channel 元素是 Apache Tribes(Tribes,一群的), Tomcat 内部使用的 group 通讯框架. 该元素封装了通讯和成员关系需要用到的一切.
想要了解更多信息, 请访问 集群channel配置参考文档
|
|
|
|
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
|
|
|
|
|
Membership 是通过 组播(multicasting) 建立的. 请注意 Tribes 也支持使用 StaticMembershipInterceptor
来设置静态的成员关系, 如果你想要不使用组播来扩展成员关系的话。 address 属性是要使用的广播地址, port 属性是广播的端口号. 两者组合在一起创建了集群区分(cluster separation). 如果你想要一个可靠(QA cluster) 的生产集群(production cluster), the
easiest config is to have the QA cluster be on a separate multicast address/port combination the the production cluster. 最简单的配置是使 QA集群在 一个分开的多播地址/端口组合成生产集群
membership 组件 广播其自身的 TCP adress/port 到其他节点 以 在 TCP 上完成 节点间的通信. 请注意被广播的地址是Receiver.address
属性 中的一个.
想要了解更多信息, 请访问 reference documentation
|
|
|
|
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
|
|
|
|
|
在 tribes 中,发送与接收数据的逻辑已经被分解到两个功能组件中. Receiver, 顾名思义, 负责接收消息. 因为 Tribes stack 是线程无关的(thread less), (这是一个很受欢迎的改进,其他框架也在使用), 所以在此组件中有一个线程池,并且可以设置 maxThreads 和 minThreads 参数.
address 属性是将要通过membership 组件广播给其他节点的 host 地址.
想要了解更多信息, 请访问 集群 receiver 配置参考文档
|
|
|
|
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
|
|
|
|
|
sender 组件, 见名知意,负责发送消息给其他节点. sender 有一个 shell 组件, 即 ReplicationTransmitter
, 但是真正干活的是其子组件Transport
. Tribes 支持 sender 池, 所以消息可以并行(Parallel)发送, 如果使用 NIO sender,还可以并发地(Concurrently)发送消息.
并发(Concurrently) 的意思是同一时间一条消息对于多个 sender; 而并行(Parallel) 的意思是同一时间多条消息对应多个 sender.
想要了解更多信息, 请访问 集群 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>
|
|
|
|
|
Tribes 发送消息要经过一个栈(stack). 栈中的元素被叫做拦截器(interceptor), 工作机制类似于 Tomcat servlet container中的valve阀门. 使用拦截器, 运算逻辑可以分解成可管理的多个代码片断. 上面配置的 interceptors 是:
TcpFailureDetector - 通过TCP验证崩溃的节点, 如果组播数据包丢失, 这个拦截器防止假活跃(false positives), 即便节点仍然是存活的,但被标记为崩溃状态的情况.
MessageDispatch15Interceptor - 分派消息到线程(池)来异步地(asynchrously)发送消息。
ThroughputInterceptor - 打印出简单的信息统计流量.
请注意 interceptors 的顺序是很重要的. 他们定义在 server.xml 中的顺序决定了他们在 channel stack 中的表现方式. 可以把他看成一个 linked list, head 是第一个拦截器,而 tail 是最后一个.
想要了解更多信息, 请访问 集群 interceptor 配置参考文档
|
|
|
|
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/>
|
|
|
|
|
集群使用阀门(valve)来根据requests 找到 web applications, 我们在上面提到过 ReplicationValve 和 JvmRouteBinderValve. <Cluster> 元素本身并不是Tomcat管道的一部分, 而是cluster 将 valve 添加到其父容器中. 假如 <Cluster> 元素被配置到 <Engine> 元素中, 那么 valves 就会被加到 engine 里,诸如此类.
想要了解更多信息, 请访问 集群 valve 配置参考文档
|
|
|
|
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
|
|
|
|
|
默认的tomcat集群支持 farmed 部署,即集群可以部署和卸载在其他节点上的应用程序。该组件目前的状态在不断变化,但很快就会得到解决。 在 Tomcat 5.0 和5.5 之间的部署算法发生了变化, 在这一点上,该组件的逻辑改变为 部署目录必须匹配 webapps目录。
想要了解更多信息, 请访问 集群 deployer 配置参考文档
|
|
|
|
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
|
|
|
|
|
因为 SimpleTcpCluster 自身是 Channel object 的一个 sender 和 receiver, 所以其他组件可以注册成为 SimpleTcpCluster 的监听器(listener). 上面的 ClusterSessionListener
监听着 DeltaManager 的 复制消息(replication messages) 并应用 manager 的增量已经 反过来应用到 session中..
想要了解更多信息, 请访问 集群 listener 配置参考文档