...
Sample Tomcat clustering with unicast configuration
The following code snippet is part of a clustering example that uses unicast configuration. Static members in a cluster are defined using org.apache.geronimo.tomcat.cluster.StaticMemberGBean in the deployment plan. You have to define each specify all static member members within your the deployment plan to make sure your the application is clustered successfully, and make sure that TCP ports for session replication are defined consistently on each node.. Refer to the sample code below for a application-scoped unicast clustering configuration on one node. The sample assumes there are only two static members in a cluster environment.
A few notes for better understanding of the sample deployment plan:
- Use ReceiverGBean to specify the information of the current node and port number used for communication.
- Use DisableMcastInterceptor to disable the multicast cluster configurations.
- Use ChannelInterceptorGBeans to specify how the static member are chained together as you can see the configurations of StaticMember1Interceptor and StaticMember2Interceptor.
- Use StaticMemberGBean to specify the information of the second static member and port number used for communication.
- To convert this example to a multicast configuration, the DisableMCastInterceptor, StaticMemberInterceptor, and StaticMember definitions need to be removed. Also, the value for the "address" attribute for the TomcatReceiver definition should be changed to "auto".
Code Block | ||||||
---|---|---|---|---|---|---|
Code Block | ||||||
| ||||||
| ||||||
... <cluster>TomcatCluster</cluster> <gbean name="TomcatCluster" class="org.apache.geronimo.tomcat.cluster.CatalinaClusterGBean"> <attribute name="className">org.apache.catalina.ha.tcp.SimpleTcpCluster</attribute> <attribute name="initParams"/> <reference name="ClusterListenerChain"> <name>TomcatClusterListenerChain</name> </reference> <reference name="TomcatValveChain"> <name>ReplicationValve</name> </reference> <reference name="Channel"> <name>TomcatChannel</name> </reference> <reference name="ClusterManager"> <name>TomcatClusterManager</name> </reference> </gbean> <gbean name="TomcatClusterListenerChain" class="org.apache.geronimo.tomcat.cluster.ClusterListenerGBean"> <attribute name="className">org.apache.catalina.ha.session.ClusterSessionListener</attribute> <attribute name="initParams"/> </gbean> <gbean name="ReplicationValve" class="org.apache.geronimo.tomcat.ValveGBean"> <attribute name="className">org.apache.catalina.ha.tcp.ReplicationValve</attribute> <attribute name="initParams">.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;</attribute> <reference name="NextValve"> <type>TomcatValve</type> <name>JvmRouteBinderValve</name> </reference> </gbean> <gbean name="JvmRouteBinderValve" class="org.apache.geronimo.tomcat.ValveGBean"> <attribute name="className">org.apache.catalina.ha.session.JvmRouteBinderValve</attribute> <attribute name="initParams">enabled=true</attribute> </gbean> <gbean name="TomcatClusterManager" class="org.apache.geronimo.tomcat.cluster.ClusterManagerGBean"> <attribute name="className">org.apache.catalina.ha.session.DeltaManager</attribute> <attribute name="initParams">name=${clusterName} channelSendOptions=6 expireSessionsOnShutdown=false notifyListenersOnReplication=true mapSendOptions=6 </attribute> </gbean> <gbean name="TomcatChannel" class="org.apache.geronimo.tomcat.cluster.ChannelGBean"> <attribute name="className">org.apache.catalina.tribes.group.GroupChannel</attribute> <attribute name="initParams"/> <reference name="Membership"> <name>ClusterMembership</name> </reference> <reference name="Receiver"> <name>ClusterReceiver</name> </reference> <reference name="Sender"> <name>ClusterSender</name> </reference> <reference name="ChannelInterceptor"> <name>DisableMcastInterceptor</name> </reference> </gbean> <gbean name="ClusterMembership" class="org.apache.geronimo.tomcat.cluster.MembershipServiceGBean"> <attribute name="className">org.apache.catalina.tribes.membership.McastService</attribute> <attribute name="initParams">address=228.0.0.4 port=45564 frequency=500 dropTime=3000 </attribute> </gbean> <gbean name="ClusterReceiver" class="org.apache.geronimo.tomcat.cluster.ReceiverGBean"> <attribute name="className">org.apache.catalina.tribes.transport.nio.NioReceiver</attribute> <attribute name="initParams">address=IPAddress1 port=TCP_port1 selectorTimeout=100 maxThreads=6 </attribute> </gbean> <gbean name="ClusterSender" class="org.apache.geronimo.tomcat.cluster.SenderGBean"> <attribute name="className">org.apache.catalina.tribes.transport.ReplicationTransmitter</attribute> </gbean> <gbean name="DisableMcastInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.geronimo.tomcat.interceptor.DisableMcastInterceptor</attribute> <attribute name="initParams"/> <reference name="NextInterceptor"> <name>TcpPingInterceptor</name> </reference> </gbean> <gbean name="TcpPingInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor</attribute> <attribute name="initParams">Interval=240</attribute> <reference name="NextInterceptor"> <name>TcpFailureDetector</name> </reference> </gbean> <gbean name="TcpFailureDetector" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.TcpFailureDetector</attribute> <attribute name="initParams"/> <reference name="NextInterceptor"> <name>StaticMember1Interceptor</name> </reference> </gbean> <gbean name="StaticMember1Interceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor</attribute> <attribute name="initParams"/> <reference name="StaticMember"> <name>StaticMember2</name> </reference> <reference name="NextInterceptor"> <name>MessageDispatch15Interceptor</name> </reference> </gbean> <gbean name="MessageDispatch15Interceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor</attribute> <attribute name="initParams"/> <reference name="NextInterceptor"> <name>ThroughputInterceptor</name> </reference> </gbean> <gbean name="ThroughputInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor</attribute> <attribute name="initParams"/> </gbean> <gbean name="StaticMember2" class="org.apache.geronimo.tomcat.cluster.StaticMemberGBean"> <attribute name="className">org.apache.catalina.tribes.membership.StaticMember</attribute> <attribute name="initParams">port=TCP_port2 securePort=-1 host=IPAddress2 domain=test-domain UniqueId={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} </attribute> </gbean> ... |
...
- IPAddress1 is the IP address or host name of current static member.
- TCP_port1 is the TCP port on the current node to listen for session replication data from other static members.
- IPAddress2 is the IP address or host name of the second static member.
- TCP_port2 is the TCP port on the second static member to listen for session replication data from other static members
- DisableMcastInterceptor disables the multicast cluster configurations.
To convert this example to a multicast configuration, the DisableMCastInterceptor, StaticMemberInterceptor, and StaticMember definitions need to be removed. Also, the value for the "address" attribute for the TomcatReceiver definition should be changed to "auto".
Configuration for unicast clustering with more than two nodes
To set up application-scoped The above example shows how to set up applicaiton-level unicast clustering with two nodes. If you want to set up applicaiton-level unicast clustering with more than two nodes, use a reference "NextStaticMember" in the second and subsequent StaticMember definitions, but not the last, to chain multiple static members. ensure that you have done following steps.
- Define all the static members in each node.
- Use a reference "NextInterceptor" in interceptor configurations to chain interceptor together as you can see the configurations of DisableMcastInterceptor and TcpPingInterceptor. You can control how the client requests are processed by arranging the order of the interceptor chain.
Code Block XML XML borderStyle solid title interceptor chain ... <gbean name="DisableMcastInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.geronimo.tomcat.interceptor.DisableMcastInterceptor</attribute> <attribute name="initParams"/> <reference name="NextInterceptor"> <name>TcpPingInterceptor</name> </reference> </gbean> <gbean name="TcpPingInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor</attribute> <attribute name="initParams">Interval=240</attribute> <reference name="NextInterceptor"> <name>TcpFailureDetector</name> </reference> </gbean> ...
- Use a reference "NextStaticMember" in the second and subsequent StaticMember definitions, but not the last, to chain multiple static members.
Code Block XML XML borderStyle solid title static member chain <gbean name="StaticMember2" class="org.apache.geronimo.tomcat.cluster.StaticMemberGBean"> <attribute name="className">org.apache.catalina.tribes.membership.StaticMember</attribute> <attribute name="initParams">port=TCP_port2 securePort=-1 host=IPAddress2 domain=test-domain UniqueId={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} </attribute> <reference name="NextStaticMember"> <name>StaticMember3</name> </reference> </gbean>
See the following deployment plan snippet as an complete example of setting up application-scoped unicast clustering with more than two nodes.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
... <cluster>TomcatCluster</cluster> <gbean name="TomcatCluster" class="org.apache.geronimo.tomcat.cluster.CatalinaClusterGBean"> <attribute name="className">org.apache.catalina.ha.tcp.SimpleTcpCluster</attribute> <attribute name="initParams">managerClassName=org.apache.catalina.ha.session.DeltaManager expireSessionsOnShutdown=false useDirtyFlag=true notifyListenersOnReplication=true </attribute> <reference name="ClusterListenerChain"> <name>TomcatClusterListenerChain</name> </reference> <reference name="TomcatValveChain"> <name>ReplicationValve</name> </reference> <reference name="Channel"> <name>TomcatChannel</name> </reference> </gbean> <gbean name="TomcatClusterListenerChain" class="org.apache.geronimo.tomcat.cluster.ClusterListenerGBean"> <attribute name="className">org.apache.catalina.ha.session.ClusterSessionListener</attribute> <attribute name="initParams"/> </gbean> <gbean name="ReplicationValve" class="org.apache.geronimo.tomcat.ValveGBean"> <attribute name="className">org.apache.catalina.ha.tcp.ReplicationValve</attribute> <attribute name="initParams">.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;</attribute> <reference name="NextValve"> <type>TomcatValve</type> <name>JvmRouteBinderValve</name> </reference> </gbean> <gbean name="JvmRouteBinderValve" class="org.apache.geronimo.tomcat.ValveGBean"> <attribute name="className">org.apache.catalina.ha.session.JvmRouteBinderValve</attribute> <attribute name="initParams">enabled=true</attribute> </gbean> <gbean name="TomcatChannel" class="org.apache.geronimo.tomcat.cluster.ChannelGBean"> <attribute name="className">org.apache.catalina.tribes.group.GroupChannel</attribute> <attribute name="initParams"/> <reference name="Membership"> <name>ClusterMembership</name> </reference> <reference name="Receiver"> <name>ClusterReceiver</name> </reference> <reference name="Sender"> <name>ClusterSender</name> </reference> <reference name="ChannelInterceptor"> <name>DisableMcastInterceptor</name> </reference> </gbean> <gbean name="ClusterMembership" class="org.apache.geronimo.tomcat.cluster.MembershipServiceGBean"> <attribute name="className">org.apache.catalina.tribes.membership.McastService</attribute> <attribute name="initParams">address=228.0.0.4 port=45564 frequency=500 dropTime=3000 </attribute> </gbean> <gbean name="ClusterReceiver" class="org.apache.geronimo.tomcat.cluster.ReceiverGBean"> <attribute name="className">org.apache.catalina.tribes.transport.nio.NioReceiver</attribute> <attribute name="initParams">address=127.0.0.1IPAddress1 port=10200 selectorTimeout=100 maxThreads=6 </attribute> </gbean> <gbean name="ClusterSender" class="org.apache.geronimo.tomcat.cluster.SenderGBean"> <attribute name="className">org.apache.catalina.tribes.transport.ReplicationTransmitter</attribute> </gbean> <gbean name="DisableMcastInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.geronimo.tomcat.interceptor.DisableMcastInterceptor</attribute> <attribute name="initParams"/> <reference name="NextInterceptor"> <name>TcpPingInterceptor</name> </reference> </gbean> <gbean name="TcpPingInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor</attribute> <attribute name="initParams">Interval=240</attribute> <reference name="NextInterceptor"> <name>TcpFailureDetector</name> </reference> </gbean> <gbean name="TcpFailureDetector" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.TcpFailureDetector</attribute> <attribute name="initParams"/> <reference name="NextInterceptor"> <name>StaticMember1Interceptor</name> </reference> </gbean> <gbean name="StaticMember1Interceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor</attribute> <attribute name="initParams"/> <reference name="StaticMember"> <name>StaticMember2</name> </reference> <reference name="NextInterceptor"> <name>MessageDispatch15Interceptor</name> </reference> </gbean> <gbean name="MessageDispatch15Interceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor</attribute> <attribute name="initParams"/> <reference name="NextInterceptor"> <name>ThroughputInterceptor</name> </reference> </gbean> <gbean name="ThroughputInterceptor" class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor</attribute> <attribute name="initParams"/> </gbean> <gbean name="StaticMember2" class="org.apache.geronimo.tomcat.cluster.StaticMemberGBean"> <attribute name="className">org.apache.catalina.tribes.membership.StaticMember</attribute> <attribute name="initParams">port=10300TCP_port2 securePort=-1 host=127.0.0.1IPAddress2 domain=test-domain UniqueId={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} </attribute> <reference name="NextStaticMember"> <name>StaticMember3</name> </reference> </gbean> <gbean name="StaticMember3" class="org.apache.geronimo.tomcat.cluster.StaticMemberGBean"> <attribute name="className">org.apache.catalina.tribes.membership.StaticMember</attribute> <attribute name="initParams">port=10100TCP_port3 securePort=-1 host=127.0.0.1IPAddress3 domain=test-domain UniqueId={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} </attribute> </gbean> ... |