blob: 0712ef5c4bb3b9bd48874f93f873b59aad241612 [file] [log] [blame]
Cheng Tang07b30872014-04-27 16:37:18 +08001<html><head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Apache Tomcat 7 (7.0.42) - Clustering/Session Replication HOW-TO</title><meta name="author" content="Filip Hanik"><meta name="author" content="Peter Rossbach"><style type="text/css" media="print">
2 .noPrint {display: none;}
3 td#mainBody {width: 100%;}
4 </style><style type="text/css">
5 code {background-color:rgb(224,255,255);padding:0 0.1em;}
6 code.attributeName, code.propertyName {background-color:transparent;}
7 </style><style type="text/css">
8 .wrapped-source code { display: block; background-color: transparent; }
9 .wrapped-source div { margin: 0 0 0 1.25em; }
10 .wrapped-source p { margin: 0 0 0 1.25em; text-indent: -1.25em; }
11 </style><style type="text/css">
12 p.notice {
13 border: 1px solid rgb(255, 0, 0);
14 background-color: rgb(238, 238, 238);
15 color: rgb(0, 51, 102);
16 padding: 0.5em;
17 margin: 1em 2em 1em 1em;
18 }
19 </style></head><body bgcolor="#ffffff" text="#000000" link="#525D76" alink="#525D76" vlink="#525D76"><table border="0" width="100%" cellspacing="0"><!--PAGE HEADER--><tr><td><!--PROJECT LOGO--><a href="http://tomcat.apache.org/"><img src="./images/tomcat.gif" align="right" alt="
20 The Apache Tomcat Servlet/JSP Container
21 " border="0"></a></td><td><h1><font face="arial,helvetica,sanserif">Apache Tomcat 7</font></h1><font face="arial,helvetica,sanserif">Version 7.0.42, Jul 2 2013</font></td><td><!--APACHE LOGO--><a href="http://www.apache.org/"><img src="./images/asf-logo.gif" align="right" alt="Apache Logo" border="0"></a></td></tr></table><table border="0" width="100%" cellspacing="4"><!--HEADER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><tr><!--LEFT SIDE NAVIGATION--><td width="20%" valign="top" nowrap class="noPrint"><p><strong>Links</strong></p><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul><p><strong>User Guide</strong></p><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="realm-howto.html">6) Realms and AAA</a></li><li><a href="security-manager-howto.html">7) Security Manager</a></li><li><a href="jndi-resources-howto.html">8) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">9) JDBC DataSources</a></li><li><a href="class-loader-howto.html">10) Classloading</a></li><li><a href="jasper-howto.html">11) JSPs</a></li><li><a href="ssl-howto.html">12) SSL</a></li><li><a href="ssi-howto.html">13) SSI</a></li><li><a href="cgi-howto.html">14) CGI</a></li><li><a href="proxy-howto.html">15) Proxy Support</a></li><li><a href="mbeans-descriptor-howto.html">16) MBean Descriptor</a></li><li><a href="default-servlet.html">17) Default Servlet</a></li><li><a href="cluster-howto.html">18) Clustering</a></li><li><a href="balancer-howto.html">19) Load Balancer</a></li><li><a href="connectors.html">20) Connectors</a></li><li><a href="monitoring.html">21) Monitoring and Management</a></li><li><a href="logging.html">22) Logging</a></li><li><a href="apr.html">23) APR/Native</a></li><li><a href="virtual-hosting-howto.html">24) Virtual Hosting</a></li><li><a href="aio.html">25) Advanced IO</a></li><li><a href="extras.html">26) Additional Components</a></li><li><a href="maven-jars.html">27) Mavenized</a></li><li><a href="security-howto.html">28) Security Considerations</a></li><li><a href="windows-service-howto.html">29) Windows Service</a></li><li><a href="windows-auth-howto.html">30) Windows Authentication</a></li><li><a href="jdbc-pool.html">31) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">32) WebSocket</a></li></ul><p><strong>Reference</strong></p><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.2 Javadocs</a></li><li><a href="elapi/index.html">EL 2.2 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul><p><strong>Apache Tomcat Development</strong></p><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></td><!--RIGHT SIDE MAIN BODY--><td width="80%" valign="top" align="left" id="mainBody"><h1>Clustering/Session Replication HOW-TO</h1><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Important Note"><!--()--></a><a name="Important_Note"><strong>Important Note</strong></a></font></td></tr><tr><td><blockquote>
22<p><b>You can also check the <a href="config/cluster.html">configuration reference documentation.</a></b>
23</p>
24</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Table of Contents"><!--()--></a><a name="Table_of_Contents"><strong>Table of Contents</strong></a></font></td></tr><tr><td><blockquote>
25<ul><li><a href="#For_the_impatient">For the impatient</a></li><li><a href="#Cluster_Basics">Cluster Basics</a></li><li><a href="#Overview">Overview</a></li><li><a href="#Cluster_Information">Cluster Information</a></li><li><a href="#Bind_session_after_crash_to_failover_node">Bind session after crash to failover node</a></li><li><a href="#Configuration_Example">Configuration Example</a></li><li><a href="#Cluster_Architecture">Cluster Architecture</a></li><li><a href="#How_it_Works">How it Works</a></li><li><a href="#Monitoring_your_Cluster_with_JMX">Monitoring your Cluster with JMX</a></li><li><a href="#FAQ">FAQ</a></li></ul>
26</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="For the impatient"><!--()--></a><a name="For_the_impatient"><strong>For the impatient</strong></a></font></td></tr><tr><td><blockquote>
27 <p>
28 Simply add <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>&lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/&gt;</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
29 to your <code>&lt;Engine&gt;</code> or your <code>&lt;Host&gt;</code> element to enable clustering.
30 </p>
31 <p>
32 Using the above configuration will enable all-to-all session replication
33 using the <code>DeltaManager</code> to replicate session deltas. By all-to-all we mean that the session gets replicated to all the other
34 nodes in the cluster. This works great for smaller cluster but we don't recommend it for larger clusters(a lot of Tomcat nodes).
35 Also when using the delta manager it will replicate to all nodes, even nodes that don't have the application deployed.<br>
36 To get around this problem, you'll want to use the BackupManager. This manager only replicates the session data to one backup
37 node, and only to nodes that have the application deployed. Downside of the BackupManager: not quite as battle tested as the delta manager.
38 <br>
39 Here are some of the important default values:<br>
40 1. Multicast address is 228.0.0.4<br>
41 2. Multicast port is 45564 (the port and the address together determine cluster membership.<br>
42 3. The IP broadcasted is <code>java.net.InetAddress.getLocalHost().getHostAddress()</code> (make sure you don't broadcast 127.0.0.1, this is a common error)<br>
43 4. The TCP port listening for replication messages is the first available server socket in range <code>4000-4100</code><br>
44 5. Two listeners are configured <code>ClusterSessionListener</code> and <code>JvmRouteSessionIDBinderListener</code><br>
45 6. Two interceptors are configured <code>TcpFailureDetector</code> and <code>MessageDispatch15Interceptor</code><br>
46 The following is the default cluster configuration:<br>
47 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
48 &lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
49 channelSendOptions="8"&gt;
50
51 &lt;Manager className="org.apache.catalina.ha.session.DeltaManager"
52 expireSessionsOnShutdown="false"
53 notifyListenersOnReplication="true"/&gt;
54
55 &lt;Channel className="org.apache.catalina.tribes.group.GroupChannel"&gt;
56 &lt;Membership className="org.apache.catalina.tribes.membership.McastService"
57 address="228.0.0.4"
58 port="45564"
59 frequency="500"
60 dropTime="3000"/&gt;
61 &lt;Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
62 address="auto"
63 port="4000"
64 autoBind="100"
65 selectorTimeout="5000"
66 maxThreads="6"/&gt;
67
68 &lt;Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"&gt;
69 &lt;Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/&gt;
70 &lt;/Sender&gt;
71 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/&gt;
72 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/&gt;
73 &lt;/Channel&gt;
74
75 &lt;Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
76 filter=""/&gt;
77 &lt;Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/&gt;
78
79 &lt;Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
80 tempDir="/tmp/war-temp/"
81 deployDir="/tmp/war-deploy/"
82 watchDir="/tmp/war-listen/"
83 watchEnabled="false"/&gt;
84
85 &lt;ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/&gt;
86 &lt;ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/&gt;
87 &lt;/Cluster&gt;
88 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
89 </p>
90 <p>Will cover this section in more detail later in this document.</p>
91</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Cluster Basics"><!--()--></a><a name="Cluster_Basics"><strong>Cluster Basics</strong></a></font></td></tr><tr><td><blockquote>
92
93<p>To run session replication in your Tomcat 7.0 container, the following steps
94should be completed:</p>
95<ul>
96 <li>All your session attributes must implement <code>java.io.Serializable</code></li>
97 <li>Uncomment the <code>Cluster</code> element in server.xml</li>
98 <li>If you have defined custom cluster valves, make sure you have the <code>ReplicationValve</code> defined as well under the Cluster element in server.xml</li>
99 <li>If your Tomcat instances are running on the same machine, make sure the <code>tcpListenPort</code>
100 attribute is unique for each instance, in most cases Tomcat is smart enough to resolve this on it's own by autodetecting available ports in the range 4000-4100</li>
101 <li>Make sure your <code>web.xml</code> has the
102 <code>&lt;distributable/&gt;</code> element</li>
103 <li>If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine <code>&lt;Engine name="Catalina" jvmRoute="node01" &gt;</code>
104 and that the jvmRoute attribute value matches your worker name in workers.properties</li>
105 <li>Make sure that all nodes have the same time and sync with NTP service!</li>
106 <li>Make sure that your loadbalancer is configured for sticky session mode.</li>
107</ul>
108<p>Load balancing can be achieved through many techniques, as seen in the
109<a href="balancer-howto.html">Load Balancing</a> chapter.</p>
110<p>Note: Remember that your session state is tracked by a cookie, so your URL must look the same from the out
111 side otherwise, a new session will be created.</p>
112<p>Note: Clustering support currently requires the JDK version 1.5 or later.</p>
113<p>The Cluster module uses the Tomcat JULI logging framework, so you can configure logging
114 through the regular logging.properties file. To track messages, you can enable logging on the key:<code>org.apache.catalina.tribes.MESSAGES</code></p>
115</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Overview"><strong>Overview</strong></a></font></td></tr><tr><td><blockquote>
116
117<p>To enable session replication in Tomcat, three different paths can be followed to achieve the exact same thing:</p>
118<ol>
119 <li>Using session persistence, and saving the session to a shared file system (PersistenceManager + FileStore)</li>
120 <li>Using session persistence, and saving the session to a shared database (PersistenceManager + JDBCStore)</li>
121 <li>Using in-memory-replication, using the SimpleTcpCluster that ships with Tomcat (lib/catalina-tribes.jar + lib/catalina-ha.jar)</li>
122</ol>
123
124<p>In this release of session replication, Tomcat can perform an all-to-all replication of session state using the <code>DeltaManager</code> or
125 perform backup replication to only one node using the <code>BackupManager</code>.
126 The all-to-all replication is an algorithm that is only efficient when the clusters are small. For larger clusters, to use
127 a primary-secondary session replication where the session will only be stored at one backup server simply setup the BackupManager. <br>
128 Currently you can use the domain worker attribute (mod_jk &gt; 1.2.8) to build cluster partitions
129 with the potential of having a more scalable cluster solution with the DeltaManager(you'll need to configure the domain interceptor for this).
130 In order to keep the network traffic down in an all-to-all environment, you can split your cluster
131 into smaller groups. This can be easily achieved by using different multicast addresses for the different groups.
132 A very simple setup would look like this:
133 </p>
134
135<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
136 DNS Round Robin
137 |
138 Load Balancer
139 / \
140 Cluster1 Cluster2
141 / \ / \
142 Tomcat1 Tomcat2 Tomcat3 Tomcat4
143</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
144
145<p>What is important to mention here, is that session replication is only the beginning of clustering.
146 Another popular concept used to implement clusters is farming, i.e., you deploy your apps only to one
147 server, and the cluster will distribute the deployments across the entire cluster.
148 This is all capabilities that can go into with the FarmWarDeployer (s. cluster example at <code>server.xml</code>)</p>
149<p>In the next section will go deeper into how session replication works and how to configure it.</p>
150
151</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Cluster Information"><!--()--></a><a name="Cluster_Information"><strong>Cluster Information</strong></a></font></td></tr><tr><td><blockquote>
152<p>Membership is established using multicast heartbeats.
153 Hence, if you wish to subdivide your clusters, you can do this by
154 changing the multicast IP address or port in the <code>&lt;Membership&gt;</code> element.
155</p>
156<p>
157 The heartbeat contains the IP address of the Tomcat node and the TCP port that
158 Tomcat listens to for replication traffic. All data communication happens over TCP.
159</p>
160<p>
161 The <code>ReplicationValve</code> is used to find out when the request has been completed and initiate the
162 replication, if any. Data is only replicated if the session has changed (by calling setAttribute or removeAttribute
163 on the session).
164</p>
165<p>
166 One of the most important performance considerations is the synchronous versus asynchronous replication.
167 In a synchronous replication mode the request doesn't return until the replicated session has been
168 sent over the wire and reinstantiated on all the other cluster nodes.
169 Synchronous vs. asynchronous is configured using the <code>channelSendOptions</code>
170 flag and is an integer value. The default value for the <code>SimpleTcpCluster/DeltaManager</code> combo is
171 8, which is asynchronous. You can read more on the <a href="tribes/introduction.html">send flag(overview)</a> or the
172 <a href="http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/tribes/Channel.html">send flag(javadoc)</a>.
173 During async replication, the request is returned before the data has been replicated. async replication yields shorter
174 request times, and synchronous replication guarantees the session to be replicated before the request returns.
175</p>
176</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Bind session after crash to failover node"><!--()--></a><a name="Bind_session_after_crash_to_failover_node"><strong>Bind session after crash to failover node</strong></a></font></td></tr><tr><td><blockquote>
177<p>
178 If you are using mod_jk and not using sticky sessions or for some reasons sticky session don't
179 work, or you are simply failing over, the session id will need to be modified as it previously contained
180 the worker id of the previous tomcat (as defined by jvmRoute in the Engine element).
181 To solve this, we will use the JvmRouteBinderValve.
182</p>
183<p>
184 The JvmRouteBinderValve rewrites the session id to ensure that the next request will remain sticky
185 (and not fall back to go to random nodes since the worker is no longer available) after a fail over.
186 The valve rewrites the JSESSIONID value in the cookie with the same name.
187 Not having this valve in place, will make it harder to ensure stickiness in case of a failure for the mod_jk module.
188</p>
189<p>
190 By default, if no valves are configured, the JvmRouteBinderValve is added on.
191 The cluster message listener called JvmRouteSessionIDBinderListener is also defined by default and is used to actually rewrite the
192 session id on the other nodes in the cluster once a fail over has occurred.
193 Remember, if you are adding your own valves or cluster listeners in server.xml then the defaults are no longer valid,
194 make sure that you add in all the appropriate valves and listeners as defined by the default.
195</p>
196<p>
197 <b>Hint:</b><br>
198 With attribute <i>sessionIdAttribute</i> you can change the request attribute name that included the old session id.
199 Default attribute name is <i>org.apache.catalina.cluster.session.JvmRouteOrignalSessionID</i>.
200</p>
201<p>
202 <b>Trick:</b><br>
203 You can enable this mod_jk turnover mode via JMX before you drop a node to all backup nodes!
204 Set enable true on all JvmRouteBinderValve backups, disable worker at mod_jk
205 and then drop node and restart it! Then enable mod_jk Worker and disable JvmRouteBinderValves again.
206 This use case means that only requested session are migrated.
207</p>
208
209
210</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Configuration Example"><!--()--></a><a name="Configuration_Example"><strong>Configuration Example</strong></a></font></td></tr><tr><td><blockquote>
211 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
212 &lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
213 channelSendOptions="6"&gt;
214
215 &lt;Manager className="org.apache.catalina.ha.session.BackupManager"
216 expireSessionsOnShutdown="false"
217 notifyListenersOnReplication="true"
218 mapSendOptions="6"/&gt;
219 &lt;!--
220 &lt;Manager className="org.apache.catalina.ha.session.DeltaManager"
221 expireSessionsOnShutdown="false"
222 notifyListenersOnReplication="true"/&gt;
223 --&gt;
224 &lt;Channel className="org.apache.catalina.tribes.group.GroupChannel"&gt;
225 &lt;Membership className="org.apache.catalina.tribes.membership.McastService"
226 address="228.0.0.4"
227 port="45564"
228 frequency="500"
229 dropTime="3000"/&gt;
230 &lt;Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
231 address="auto"
232 port="5000"
233 selectorTimeout="100"
234 maxThreads="6"/&gt;
235
236 &lt;Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"&gt;
237 &lt;Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/&gt;
238 &lt;/Sender&gt;
239 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/&gt;
240 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/&gt;
241 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/&gt;
242 &lt;/Channel&gt;
243
244 &lt;Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
245 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/&gt;
246
247 &lt;Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
248 tempDir="/tmp/war-temp/"
249 deployDir="/tmp/war-deploy/"
250 watchDir="/tmp/war-listen/"
251 watchEnabled="false"/&gt;
252
253 &lt;ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/&gt;
254 &lt;/Cluster&gt;
255 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
256 <p>
257 Break it down!!
258 </p>
259 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
260 &lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
261 channelSendOptions="6"&gt;
262 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
263 <p>
264 The main element, inside this element all cluster details can be configured.
265 The <code>channelSendOptions</code> is the flag that is attached to each message sent by the
266 SimpleTcpCluster class or any objects that are invoking the SimpleTcpCluster.send method.
267 The description of the send flags is available at <a href="http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/tribes/Channel.html">
268 our javadoc site</a>
269 The <code>DeltaManager</code> sends information using the SimpleTcpCluster.send method, while the backup manager
270 sends it itself directly through the channel.
271 <br>For more info, Please visit the <a href="config/cluster.html">reference documentation</a>
272 </p>
273 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
274 &lt;Manager className="org.apache.catalina.ha.session.BackupManager"
275 expireSessionsOnShutdown="false"
276 notifyListenersOnReplication="true"
277 mapSendOptions="6"/&gt;
278 &lt;!--
279 &lt;Manager className="org.apache.catalina.ha.session.DeltaManager"
280 expireSessionsOnShutdown="false"
281 notifyListenersOnReplication="true"/&gt;
282 --&gt;
283 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
284 <p>
285 This is a template for the manager configuration that will be used if no manager is defined in the &lt;Context&gt;
286 element. In Tomcat 5.x each webapp marked distributable had to use the same manager, this is no longer the case
287 since Tomcat you can define a manager class for each webapp, so that you can mix managers in your cluster.
288 Obviously the managers on one node's application has to correspond with the same manager on the same application on the other node.
289 If no manager has been specified for the webapp, and the webapp is marked &lt;distributable/&gt; Tomcat will take this manager configuration
290 and create a manager instance cloning this configuration.
291 <br>For more info, Please visit the <a href="config/cluster-manager.html">reference documentation</a>
292 </p>
293 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
294 &lt;Channel className="org.apache.catalina.tribes.group.GroupChannel"&gt;
295 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
296 <p>
297 The channel element is <a href="tribes/introduction.html">Tribes</a>, the group communication framework
298 used inside Tomcat. This element encapsulates everything that has to do with communication and membership logic.
299 <br>For more info, Please visit the <a href="config/cluster-channel.html">reference documentation</a>
300 </p>
301 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
302 &lt;Membership className="org.apache.catalina.tribes.membership.McastService"
303 address="228.0.0.4"
304 port="45564"
305 frequency="500"
306 dropTime="3000"/&gt;
307 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
308 <p>
309 Membership is done using multicasting. Please note that Tribes also supports static memberships using the
310 <code>StaticMembershipInterceptor</code> if you want to extend your membership to points beyond multicasting.
311 The address attribute is the multicast address used and the port is the multicast port. These two together
312 create the cluster separation. If you want a QA cluster and a production cluster, the easiest config is to
313 have the QA cluster be on a separate multicast address/port combination than the production cluster.<br>
314 The membership component broadcasts TCP address/port of itself to the other nodes so that communication between
315 nodes can be done over TCP. Please note that the address being broadcasted is the one of the
316 <code>Receiver.address</code> attribute.
317 <br>For more info, Please visit the <a href="config/cluster-membership.html">reference documentation</a>
318 </p>
319 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
320 &lt;Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
321 address="auto"
322 port="5000"
323 selectorTimeout="100"
324 maxThreads="6"/&gt;
325 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
326 <p>
327 In tribes the logic of sending and receiving data has been broken into two functional components. The Receiver, as the name suggests
328 is responsible for receiving messages. Since the Tribes stack is thread less, (a popular improvement now adopted by other frameworks as well),
329 there is a thread pool in this component that has a maxThreads and minThreads setting.<br>
330 The address attribute is the host address that will be broadcasted by the membership component to the other nodes.
331 <br>For more info, Please visit the <a href="config/cluster-receiver.html">reference documentation</a>
332 </p>
333 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
334
335 &lt;Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"&gt;
336 &lt;Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/&gt;
337 &lt;/Sender&gt;
338 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
339 <p>
340 The sender component, as the name indicates is responsible for sending messages to other nodes.
341 The sender has a shell component, the <code>ReplicationTransmitter</code> but the real stuff done is done in the
342 sub component, <code>Transport</code>.
343 Tribes support having a pool of senders, so that messages can be sent in parallel and if using the NIO sender,
344 you can send messages concurrently as well.<br>
345 Concurrently means one message to multiple senders at the same time and Parallel means multiple messages to multiple senders
346 at the same time.
347 <br>For more info, Please visit the <a href="config/cluster-sender.html">reference documentation</a>
348 </p>
349 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
350 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/&gt;
351 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/&gt;
352 &lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/&gt;
353 &lt;/Channel&gt;
354 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
355 <p>
356 Tribes uses a stack to send messages through. Each element in the stack is called an interceptor, and works much like the valves do
357 in the Tomcat servlet container.
358 Using interceptors, logic can be broken into more manageable pieces of code. The interceptors configured above are:<br>
359 TcpFailureDetector - verifies crashed members through TCP, if multicast packets get dropped, this interceptor protects against false positives,
360 ie the node marked as crashed even though it still is alive and running.<br>
361 MessageDispatch15Interceptor - dispatches messages to a thread (thread pool) to send message asynchrously.<br>
362 ThroughputInterceptor - prints out simple stats on message traffic.<br>
363 Please note that the order of interceptors is important. the way they are defined in server.xml is the way they are represented in the
364 channel stack. Think of it as a linked list, with the head being the first most interceptor and the tail the last.
365 <br>For more info, Please visit the <a href="config/cluster-interceptor.html">reference documentation</a>
366 </p>
367 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
368 &lt;Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
369 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/&gt;
370 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
371 <p>
372 The cluster uses valves to track requests to web applications, we've mentioned the ReplicationValve and the JvmRouteBinderValve above.
373 The &lt;Cluster&gt; element itself is not part of the pipeline in Tomcat, instead the cluster adds the valve to its parent container.
374 If the &lt;Cluster&gt; elements is configured in the &lt;Engine&gt; element, the valves get added to the engine and so on.
375 <br>For more info, Please visit the <a href="config/cluster-valve.html">reference documentation</a>
376 </p>
377 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
378 &lt;Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
379 tempDir="/tmp/war-temp/"
380 deployDir="/tmp/war-deploy/"
381 watchDir="/tmp/war-listen/"
382 watchEnabled="false"/&gt;
383 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
384 <p>
385 The default tomcat cluster supports farmed deployment, ie, the cluster can deploy and undeploy applications on the other nodes.
386 The state of this component is currently in flux but will be addressed soon. There was a change in the deployment algorithm
387 between Tomcat 5.0 and 5.5 and at that point, the logic of this component changed to where the deploy dir has to match the
388 webapps directory.
389 <br>For more info, Please visit the <a href="config/cluster-deployer.html">reference documentation</a>
390 </p>
391 <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
392 &lt;ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/&gt;
393 &lt;/Cluster&gt;
394 </pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
395 <p>
396 Since the SimpleTcpCluster itself is a sender and receiver of the Channel object, components can register themselves as listeners to
397 the SimpleTcpCluster. The listener above <code>ClusterSessionListener</code> listens for DeltaManager replication messages
398 and applies the deltas to the manager that in turn applies it to the session.
399 <br>For more info, Please visit the <a href="config/cluster-listener.html">reference documentation</a>
400 </p>
401
402</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Cluster Architecture"><!--()--></a><a name="Cluster_Architecture"><strong>Cluster Architecture</strong></a></font></td></tr><tr><td><blockquote>
403
404<p><b>Component Levels:</b>
405<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
406 Server
407 |
408 Service
409 |
410 Engine
411 | \
412 | --- Cluster --*
413 |
414 Host
415 |
416 ------
417 / \
418 Cluster Context(1-N)
419 | \
420 | -- Manager
421 | \
422 | -- DeltaManager
423 | -- BackupManager
424 |
425 ---------------------------
426 | \
427 Channel \
428 ----------------------------- \
429 | \
430 Interceptor_1 .. \
431 | \
432 Interceptor_N \
433 ----------------------------- \
434 | | | \
435 Receiver Sender Membership \
436 -- Valve
437 | \
438 | -- ReplicationValve
439 | -- JvmRouteBinderValve
440 |
441 -- LifecycleListener
442 |
443 -- ClusterListener
444 | \
445 | -- ClusterSessionListener
446 | -- JvmRouteSessionIDBinderListener
447 |
448 -- Deployer
449 \
450 -- FarmWarDeployer
451
452
453</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
454</p>
455
456</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="How it Works"><!--()--></a><a name="How_it_Works"><strong>How it Works</strong></a></font></td></tr><tr><td><blockquote>
457<p>To make it easy to understand how clustering works, We are gonna take you through a series of scenarios.
458 In the scenario we only plan to use two tomcat instances <code>TomcatA</code> and <code>TomcatB</code>.
459 We will cover the following sequence of events:</p>
460
461<ol>
462<li><code>TomcatA</code> starts up</li>
463<li><code>TomcatB</code> starts up (Wait that TomcatA start is complete)</li>
464<li><code>TomcatA</code> receives a request, a session <code>S1</code> is created.</li>
465<li><code>TomcatA</code> crashes</li>
466<li><code>TomcatB</code> receives a request for session <code>S1</code></li>
467<li><code>TomcatA</code> starts up</li>
468<li><code>TomcatA</code> receives a request, invalidate is called on the session (<code>S1</code>)</li>
469<li><code>TomcatB</code> receives a request, for a new session (<code>S2</code>)</li>
470<li><code>TomcatA</code> The session <code>S2</code> expires due to inactivity.</li>
471</ol>
472
473<p>Ok, now that we have a good sequence, we will take you through exactly what happens in the session repliction code</p>
474
475<ol>
476<li><b><code>TomcatA</code> starts up</b>
477 <p>
478 Tomcat starts up using the standard start up sequence. When the Host object is created, a cluster object is associated with it.
479 When the contexts are parsed, if the distributable element is in place in web.xml
480 Tomcat asks the Cluster class (in this case <code>SimpleTcpCluster</code>) to create a manager
481 for the replicated context. So with clustering enabled, distributable set in web.xml
482 Tomcat will create a <code>DeltaManager</code> for that context instead of a <code>StandardManager</code>.
483 The cluster class will start up a membership service (multicast) and a replication service (tcp unicast).
484 More on the architecture further down in this document.
485 </p><p></p>
486</li>
487<li><b><code>TomcatB</code> starts up</b>
488 <p>
489 When TomcatB starts up, it follows the same sequence as TomcatA did with one exception.
490 The cluster is started and will establish a membership (TomcatA,TomcatB).
491 TomcatB will now request the session state from a server that already exists in the cluster,
492 in this case TomcatA. TomcatA responds to the request, and before TomcatB starts listening
493 for HTTP requests, the state has been transferred from TomcatA to TomcatB.
494 In case TomcatA doesn't respond, TomcatB will time out after 60 seconds, and issue a log
495 entry. The session state gets transferred for each web application that has distributable in
496 its web.xml. Note: To use session replication efficiently, all your tomcat instances should be
497 configured the same.
498 </p><p></p>
499</li>
500<li><B><code>TomcatA</code> receives a request, a session <code>S1</code> is created.</B>
501 <p>
502 The request coming in to TomcatA is treated exactly the same way as without session replication.
503 The action happens when the request is completed, the <code>ReplicationValve</code> will intercept
504 the request before the response is returned to the user.
505 At this point it finds that the session has been modified, and it uses TCP to replicata the
506 session to TomcatB. Once the serialized data has been handed off to the operating systems TCP logic,
507 the request returns to the user, back through the valve pipeline.
508 For each request the entire session is replicated, this allows code that modifies attributes
509 in the session without calling setAttribute or removeAttribute to be replicated.
510 a useDirtyFlag configuration parameter can be used to optimize the number of times
511 a session is replicated.
512 </p><p></p>
513
514</li>
515<li><b><code>TomcatA</code> crashes</b>
516 <p>
517 When TomcatA crashes, TomcatB receives a notification that TomcatA has dropped out
518 of the cluster. TomcatB removes TomcatA from its membership list, and TomcatA will no longer
519 be notified of any changes that occurs in TomcatB.
520 The load balancer will redirect the requests from TomcatA to TomcatB and all the sessions
521 are current.
522 </p><p></p>
523</li>
524<li><b><code>TomcatB</code> receives a request for session <code>S1</code></b>
525 <p>Nothing exciting, TomcatB will process the request as any other request.
526 </p><p></p>
527</li>
528<li><b><code>TomcatA</code> starts up</b>
529 <p>Upon start up, before TomcatA starts taking new request and making itself
530 available to it will follow the start up sequence described above 1) 2).
531 It will join the cluster, contact TomcatB for the current state of all the sessions.
532 And once it receives the session state, it finishes loading and opens its HTTP/mod_jk ports.
533 So no requests will make it to TomcatA until it has received the session state from TomcatB.
534 </p><p></p>
535</li>
536<li><b><code>TomcatA</code> receives a request, invalidate is called on the session (<code>S1</code>)</b>
537 <p>The invalidate is call is intercepted, and the session is queued with invalidated sessions.
538 When the request is complete, instead of sending out the session that has changed, it sends out
539 an "expire" message to TomcatB and TomcatB will invalidate the session as well.
540 </p><p></p>
541
542</li>
543<li><b><code>TomcatB</code> receives a request, for a new session (<code>S2</code>)</b>
544 <p>Same scenario as in step 3)
545 </p><p></p>
546
547
548</li>
549<li><code>TomcatA</code> The session <code>S2</code> expires due to inactivity.
550 <p>The invalidate is call is intercepted the same was as when a session is invalidated by the user,
551 and the session is queued with invalidated sessions.
552 At this point, the invalidet session will not be replicated across until
553 another request comes through the system and checks the invalid queue.
554 </p><p></p>
555</li>
556</ol>
557
558<p>Phuuuhh! :)</p>
559
560<p><b>Membership</b>
561 Clustering membership is established using very simple multicast pings.
562 Each Tomcat instance will periodically send out a multicast ping,
563 in the ping message the instance will broad cast its IP and TCP listen port
564 for replication.
565 If an instance has not received such a ping within a given timeframe, the
566 member is considered dead. Very simple, and very effective!
567 Of course, you need to enable multicasting on your system.
568</p>
569
570<p><b>TCP Replication</b>
571 Once a multicast ping has been received, the member is added to the cluster
572 Upon the next replication request, the sending instance will use the host and
573 port info and establish a TCP socket. Using this socket it sends over the serialized data.
574 The reason I choose TCP sockets is because it has built in flow control and guaranteed delivery.
575 So I know, when I send some data, it will make it there :)
576</p>
577
578<p><b>Distributed locking and pages using frames</b>
579 Tomcat does not keep session instances in sync across the cluster.
580 The implementation of such logic would be to much overhead and cause all
581 kinds of problems. If your client accesses the same session
582 simultanously using multiple requests, then the last request
583 will override the other sessions in the cluster.
584</p>
585
586</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Monitoring your Cluster with JMX"><!--()--></a><a name="Monitoring_your_Cluster_with_JMX"><strong>Monitoring your Cluster with JMX</strong></a></font></td></tr><tr><td><blockquote>
587<p>Monitoring is a very important question when you use a cluster. Some of the cluster objects are JMX MBeans </p>
588<p>Add the following parameter to your startup script with Java 5:
589<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
590set CATALINA_OPTS=\
591-Dcom.sun.management.jmxremote \
592-Dcom.sun.management.jmxremote.port=%my.jmx.port% \
593-Dcom.sun.management.jmxremote.ssl=false \
594-Dcom.sun.management.jmxremote.authenticate=false
595</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" alt="" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
596</p>
597<p>
598List of Cluster Mbeans<br>
599<table border="1" cellpadding="5">
600
601 <tr>
602 <th align="center" bgcolor="aqua">Name</th>
603 <th align="center" bgcolor="aqua">Description</th>
604 <th align="center" bgcolor="aqua">MBean ObjectName - Engine</th>
605 <th align="center" bgcolor="aqua">MBean ObjectName - Host</th>
606 </tr>
607
608 <tr>
609 <td>Cluster</td>
610 <td>The complete cluster element</td>
611 <td><code>type=Cluster</code></td>
612 <td><code>type=Cluster,host=${HOST}</code></td>
613 </tr>
614
615 <tr>
616 <td>DeltaManager</td>
617 <td>This manager control the sessions and handle session replication </td>
618 <td><code>type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST}</code></td>
619 <td><code>type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST}</code></td>
620 </tr>
621
622 <tr>
623 <td>FarmWarDeployer</td>
624 <td>Manages the process of deploying an application to all nodes in the cluster</td>
625 <td>Not supported</td>
626 <td><code>type=Cluster, host=${HOST}, component=deployer</code></td>
627 </tr>
628
629 <tr>
630 <td>Member</td>
631 <td>Represents a node in the cluster</td>
632 <td>type=Cluster, component=member, name=${NODE_NAME}</td>
633 <td><code>type=Cluster, host=${HOST}, component=member, name=${NODE_NAME}</code></td>
634 </tr>
635
636 <tr>
637 <td>ReplicationValve</td>
638 <td>This valve control the replication to the backup nodes</td>
639 <td><code>type=Valve,name=ReplicationValve</code></td>
640 <td><code>type=Valve,name=ReplicationValve,host=${HOST}</code></td>
641 </tr>
642
643 <tr>
644 <td>JvmRouteBinderValve</td>
645 <td>This is a cluster fallback valve to change the Session ID to the current tomcat jvmroute.</td>
646 <td><code>type=Valve,name=JvmRouteBinderValve,
647 context=${APP.CONTEXT.PATH}</code></td>
648 <td><code>type=Valve,name=JvmRouteBinderValve,host=${HOST},
649 context=${APP.CONTEXT.PATH}</code></td>
650 </tr>
651
652</table>
653</p>
654</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="FAQ"><strong>FAQ</strong></a></font></td></tr><tr><td><blockquote>
655<p>Please see <a href="http://wiki.apache.org/tomcat/FAQ/Clustering">the clustering section of the FAQ</a>.</p>
656</blockquote></td></tr></table></td></tr><tr class="noPrint"><td width="20%" valign="top" nowrap class="noPrint"></td><td width="80%" valign="top" align="left"><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="comments_section" id="comments_section"><strong>Comments</strong></a></font></td></tr><tr><td><blockquote><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions
657 on improving documentation for Apache Tomcat.<br><br>
658 If you have trouble and need help, read
659 <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page
660 and ask your question on the tomcat-users
661 <a href="http://tomcat.apache.org/lists.html">mailing list</a>.
662 Do not ask such questions here. This is not a Q&amp;A section.<br><br>
663 The Apache Comments System is explained <a href="/tomcat-7.0-doc/comments.html">here</a>.
664 Comments may be removed by our moderators if they are either
665 implemented or considered invalid/off-topic.</p><script type="text/javascript"><!--//--><![CDATA[//><!--
666 var comments_shortname = 'tomcat';
667 var comments_identifier = 'http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html';
668 (function(w, d) {
669 if (w.location.hostname.toLowerCase() == "tomcat.apache.org") {
670 d.write('<div id="comments_thread"><\/div>');
671 var s = d.createElement('script');
672 s.type = 'text/javascript';
673 s.async = true;
674 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
675 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
676 }
677 else {
678 d.write('<div id="comments_thread"><strong>Comments are disabled for this page at the moment.<\/strong><\/div>');
679 }
680 })(window, document);
681 //--><!]]></script></blockquote></td></tr></table></td></tr><!--FOOTER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><!--PAGE FOOTER--><tr><td colspan="2"><div align="center"><font color="#525D76" size="-1"><em>
682 Copyright &copy; 1999-2013, Apache Software Foundation
683 </em></font></div></td></tr></table></body></html>