...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web/tomcat-2.0.1" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2"> <dep:environment> <dep:moduleId> <dep:groupId>org.mygroup</dep:groupId> <dep:artifactId>web-cluster-server1</dep:artifactId> <dep:version>2.1.1.2</dep:version> <dep:type>war</dep:type> </dep:moduleId> <dep:dependencies/> <dep:hidden-classes/> <dep:non-overridable-classes/> </dep:environment> <context-root>/servlet-examples-cluster</context-root> <security-realm-name>geronimo-properties-realm</security-realm-name> <security> <default-principal> <principal name="anonymous" class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"/> </default-principal> <role-mappings> <role role-name="tomcat"> <principal name="admin" class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"/> </role> </role-mappings> </security> <cluster>TomcatCluster</cluster> <gbean class="org.apache.geronimo.tomcat.cluster.CatalinaClusterGBean" name="TomcatCluster"> <attribute name="className">org.apache.catalina.ha.tcp.SimpleTcpCluster</attribute> <attribute name="initParams"/> <reference name="TomcatValveChain"> <name>ReplicationValve</name> </reference> <reference name="ClusterListenerChain"> <name>ClusterSessionListener</name> </reference> <reference name="Channel"> <name>TomcatGroupChannel</name> </reference> <reference name="ClusterManager"> <name>TomcatClusterManager</name> </reference> </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=somename expireSessionsOnShutdown=false useDirtyFlag=true notifyListenersOnReplication=true </attribute> </gbean> <gbean class="org.apache.geronimo.tomcat.cluster.ChannelGBean" name="TomcatGroupChannel"> <attribute name="className">org.apache.catalina.tribes.group.GroupChannel</attribute> <attribute name="initParams"/> <reference name="Membership"> <name>TomcatMembership</name> </reference> <reference name="Receiver"> <name>TomcatReceiver</name> </reference> <reference name="Sender"> <name>TomcatSender</name> </reference> <reference name="ChannelInterceptor"> <name>TomcatChannelInterceptor</name> </reference> </gbean> <gbean class="org.apache.geronimo.tomcat.cluster.MembershipServiceGBean" name="TomcatMembership"> <attribute name="className">org.apache.catalina.tribes.membership.McastService</attribute> <attribute name="initParams"> mcastAddr=228.0.0.4 mcastPort=45564 mcastFrequency=500 mcastDropTime=3000 </attribute> </gbean> <gbean class="org.apache.geronimo.tomcat.cluster.ReceiverGBean" name="TomcatReceiver"> <attribute name="className">org.apache.catalina.tribes.transport.nio.NioReceiver</attribute> <attribute name="initParams"> tcpListenAddress=IPAddressIn tcpListenPort=4001 tcpSelectorTimeout=100 tcpThreadCount=6 </attribute> </gbean> <gbean class="org.apache.geronimo.tomcat.cluster.SenderGBean" name="TomcatSender"> <attribute name="className">org.apache.catalina.tribes.transport.ReplicationTransmitter</attribute> <attribute name="initParams"> replicationMode=pooled waitForAck=true </attribute> </gbean> <gbean class="org.apache.geronimo.tomcat.ValveGBean" name="ReplicationValve"> <attribute name="className">org.apache.catalina.ha.tcp.ReplicationValve</attribute> <attribute name="initParams">filter=.*\.gif;.*\.js;.*\.css;.*\.png;.*\.jpeg;.*\.jpg;.*\.htm;.*\.html;.*\.txt;</attribute> <reference name="NextValve"> <name>JvmRouteBinderValve</name> </reference> </gbean> <gbean class="org.apache.geronimo.tomcat.ValveGBean" name="JvmRouteBinderValve"> <attribute name="className">org.apache.catalina.ha.session.JvmRouteBinderValve</attribute> <attribute name="initParams">enabled=true</attribute> </gbean> <gbean class="org.apache.geronimo.tomcat.cluster.ClusterListenerGBean" name="ClusterSessionListener"> <attribute name="className">org.apache.catalina.ha.session.ClusterSessionListener</attribute> <reference name="NextListener"> <name>JvmRouteSessionIDBinderListener</name> </reference> </gbean> <gbean class="org.apache.geronimo.tomcat.cluster.ClusterListenerGBean" name="JvmRouteSessionIDBinderListener"> <attribute name="className">org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener</attribute> </gbean> <gbean class="org.apache.geronimo.tomcat.cluster.ChannelInterceptorGBean" name="TomcatChannelInterceptor"> <attribute name="className">org.apache.catalina.tribes.group.interceptors.TcpFailureDetector</attribute> </gbean> </web-app> |
where
- web-cluster-server1 should match the WAR file name. It can be different for each node in the cluster.
On each node, deploy your Web application, either via admin console or deploy command, following this syntax:
Panel | ||
---|---|---|
| ||
|
where
- name is replaced with a user name authorized to manage the server. If you omit this option, you will be prompted to enter a user name.
- word is replaced with the password used to authenticate the user. If you omit this option, you will be prompted to enter a password.
- archive is replaced with a file specification to your Web application WAR file.
- plan is replaced with a file specification to your deployment plan.
Note: After server installation, the default user name is initially system, and the default password is manager.
Sample Tomcat clustering with unicast configuration
The following code snippet is part of a clustering example that uses unicast configuration. Static members are defined using org.apache.geronimo.tomcat.cluster.StaticMemberGBean
. You have to define each static member within your deployment plan to make sure your application is clustered successfully, and make sure that TCP ports for session replication are defined consistently on each node.
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=60</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>
...
|
Where
- 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".
This is an example of setting up unicast clustering with two nodes. If you want to set up unicast clustering with more than two nodes, use a reference "NextStaticMember" in each StaticMemberGBean to chain multiple static members. See the following deployment plan snippet as an example.
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.1
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=10300
securePort=-1
host=127.0.0.1
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=10100
securePort=-1
host=127.0.0.1
domain=test-domain
UniqueId={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
</attribute>
</gbean>
|
Note: Interval=240 in TcpPingInterceptor GBean. Customer confirmed that it is working fine with multiple nodes.