Author: rjung
Date: Mon Mar  7 18:04:44 2011
New Revision: 1078872

URL: http://svn.apache.org/viewvc?rev=1078872&view=rev
Log:
Improve load balancer documentation.

Modified:
    tomcat/jk/trunk/xdocs/generic_howto/loadbalancers.xml
    tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml

Modified: tomcat/jk/trunk/xdocs/generic_howto/loadbalancers.xml
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/generic_howto/loadbalancers.xml?rev=1078872&r1=1078871&r2=1078872&view=diff
==============================================================================
--- tomcat/jk/trunk/xdocs/generic_howto/loadbalancers.xml (original)
+++ tomcat/jk/trunk/xdocs/generic_howto/loadbalancers.xml Mon Mar  7 18:04:44 
2011
@@ -29,121 +29,181 @@
 <body>
 <section name="Introduction"> 
 <br/>
-<p>A Load balancer is a virtual worker that does not really communicate with 
Tomcat workers.
-Instead it is responsible for the management of several "real" workers.
-The worker is supposed to be a load balancer if its worker type is <b>lb</b>.
-See workers <b>type</b> directive. For a complete reference of all load 
balancer configuration
-items, please consult the worker <a 
href="../reference/workers.html">reference</a>.
-The comprehensive status management features of the load balancer together 
with the status worker,
-makes its use an interesting option, even if only combined with a single 
"real" worker.
-<warn>As long as the "real" workers should only be used via the load balancer 
worker,
-there is no need to also put them into the <b>worker.list</b> property.</warn>
-</p>
-
-<subsection name="lb Worker properties">
+<p>A load balancer is a worker that does not directly communicate with Tomcat.
+Instead it is responsible for the management of several "real" workers,
+called members or sub workers of the load balancer.</p>
 <p>
-The load-balancing worker does not really communicate with Tomcat workers.
-Instead it is responsible for the management of several "real" workers. 
 This management includes:
 </p>
-
 <ul>
 <li>
 Instantiating the workers in the web server.
 </li>
 <li>
-Using the worker's load-balancing factor, perform weighed-round-robin load 
balancing where 
-high lbfactor means stronger machine (that is going to handle more requests)
+Using the worker's load-balancing factor, perform weighted load balancing
+(distributing load according to defined strengths of the targets).
+</li>
+<li>
+Keeping requests belonging to the same session executing on the same Tomcat
+(session stickyness).
 </li>
 <li>
-Keeping requests belonging to the same session executing on the same Tomcat 
worker.
+Identifying failed Tomcat workers, suspending requests to them and instead
+falling-back on other workers managed by the load balancer.
 </li>
 <li>
-Identifying failed Tomcat workers, suspending requests to them and instead 
falling-back on 
-other workers managed by the lb worker.
+Providing status and load metrics for the load balancer itself and all
+members via the status worker interface.
+</li>
+<li>
+Allowing to dynamically reconfigure load-balancing via the status worker
+interface.
 </li>
 </ul>
-
 <p>
-The overall result is that workers managed by the same lb worker are 
load-balanced (based on their lbfactor and current user session) and also 
fall-backed so a single Tomcat process death will not "kill" the entire site.
+Workers managed by the same load balancer worker are load-balanced
+(based on their configured balancing factors and current request or session 
load)
+and also secured against failure by providing failover to other members of the 
same
+load balancer. So a single Tomcat process death will not "kill" the entire 
site.
+</p>
+<p>Some of the features provided by a load balancer are even interesting, when
+only working with a single member worker (where load balancing is not 
possible).</p>
+
+<subsection name="Basic Load Balancer Properties">
+<p>A worker is configured as a load balancer by setting its worker 
<code>type</code>
+to <b>lb</b>.
 </p>
-<warn>
-If you want to use session stickiness, you must set different jvmRoute 
attributes
-in the Engine element in Tomcat's server.xml. Furthermore the names of the 
workers
-which are managed by the balancer have to be equal to the jvmRoute of the 
Tomcat
-instance they connect with.
-</warn>
 <p>
-The following table specifies some properties that the lb worker can accept:
+The following table specifies some properties used to configure a load 
balancer worker:
+</p>
 <ul>
-<li><b>balance_workers</b> is a comma separated list of workers that the load 
balancer need to manage. 
-These workers do not need to appear in the worker.list property. This 
directive can be used multiple times for the same load balancer.</li>
-<li><b>sticky_session</b> specifies whether requests with SESSION ID's should 
be routed back to the same
-Tomcat worker. You can set sticky_session to False when Tomcat is using a 
Session Manager which
-can persist session data across multiple instances of Tomcat. By default 
sticky_session is set to True.</li>
+<li><b>balance_workers</b> is a comma separated list of names of the member 
workers of the
+load balancer. These workers are typically of type <b>ajp13</b>. The member 
workers do
+not need to appear in the <code>worker.list</code> property themselves, adding 
the
+load balancer to it suffices.</li>
+<li><b>sticky_session</b> specifies whether requests with SESSION ID's should 
be routed
+back to the same Tomcat instance that created the session. You can set 
sticky_session to
+<b>False</b> when Tomcat is using a session manager which can share session 
data across
+multiple instances of Tomcat - or if your application is stateless.
+By default sticky_session is set to <b>True</b>.</li>
+<li><b>lbfactor</b> can be added to each member worker to configure individual
+strengths for the members. A higher <code>lbfactor</code> will lead to more
+requests being balanced to that worker. The factors must be given by integers 
and the
+load will be distributed proportional to the factors given. Higher factors 
lead to
+more requests.</li>
 </ul>
-</p>
 
 <source>
-  # The worker balance1 while use "real" workers worker1 and worker2
+  # The load balancer worker balance1 will distribute
+  # load to the members worker1 and worker2
+  worker.balance1.type=lb
   worker.balance1.balance_workers=worker1, worker2
+  worker.worker1.type=ajp13
+  worker.worker1.host=myhost1
+  worker.worker1.port=8009
+  worker.worker2.type=ajp13
+  worker.worker1.host=myhost2
+  worker.worker1.port=8009
 </source>
 
-</subsection>
-
-<subsection name="Advanced lb Worker properties">
-<p>
-With JK 1.2.x, new load-balancing and fault-tolerant support has been added via
-2 new properties, <b>redirect</b> and <b>activation</b>.
-</p>
+<warn>
+Session stickyness is not implemented using a tracking table for sessions.
+Instead each Tomcat instance gets an individual name and adds its name at
+the end of the session id. When the load balancer sees a session id, it
+finds the name of the Tomcat instance and sends the request via the correct
+member worker. For this to work you must set the name of the Tomcat instances
+as the value of the <code>jvmRoute</code> attribute in the Engine element of
+each Tomcat's server.xml. The name of the Tomcat needs to be equal to the name
+of the corresponding load balancer member. In the above example, Tomcat on host
+"myhost1" needs <code>jvmRoute="worker1"</code>, Tomcat on host "myhost2"
+needs <code>jvmRoute="worker2"</code>.
+</warn>
 
-<p>
-Let's take an example environment:
+<p>For a complete reference of all load balancer configuration
+attributes, please consult the worker <a 
href="../reference/workers.html">reference</a>.
 </p>
+</subsection>
 
-<p>
-A cluster with two nodes (worker1+worker2), running a webserver + tomcat 
tandem on each node and 
-a loadbalancer in front of the nodes.
-</p>
+<subsection name="Advanced Load Balancer Worker Properties">
+<p>The load balancer supports complex topologies and failover configurations.
+Using the member attribute <code>distance</code> you can group members.
+The load balancer will always send a request to a member of lowest distance.
+Only when all of those are broken, it will balance to the members of the
+next higher configured distance. This allows to define priorities between
+Tomcat instances in different data center locations.
+</p>
+<p>When working with shared sessions, either by using session replication
+or a persisting session manager (e.g. via a database), one often splits
+up the Tomcat farm into replication groups. In case of failure of a member,
+the load balancer needs to know, which other members share the session.
+This is configured using the <code>domain</code> attribute. All workers
+with the same domain are assumed to share the sessions.</p>
+<p>For maintenance purposes you can tell the load balancer to not
+allow any new sessions on some members, or even not use them at all.
+This is controlled by the member attribute <code>activation</code>.
+The value <b>Active</b> allows normal use of a member, <b>disabled</b>
+will not create new sessions on it, but still allow sticky requests,
+and <b>stopped</b> will no longer send any requests to the member.
+Switching the activation from "active" to "disabled" some time before
+maintenance will drain the sessions on the worker and minimize disruption.
+Depending on the usage pattern of the application, draining will take from
+minutes to hours. Switching the worker to stopped immediately before
+maintenance will reduce logging of false errors by mod_jk.</p>
+<p>Finally you can also configure hot spare workers by using
+<code>activation</code> set to <b>disabled</b> in combination with
+the attribute <code>redirect</code> added to the other workers:</p>
 
 <source>
   # The advanced router LB worker
   worker.list=router
+  worker.router.type=lb
+  worker.router.balance_workers=worker1,worker2
 
-  # Define a worker using ajp13
-  worker.worker1.port=8009
-  worker.worker1.host=node1.domain.org
+  # Define the first member worker
   worker.worker1.type=ajp13
-  worker.worker1.lbfactor=1
+  worker.worker1.host=myhost1
+  worker.worker1.port=8009
   # Define preferred failover node for worker1
   worker.worker1.redirect=worker2
 
-  # Define another worker using ajp13
-  worker.worker2.port=8009
-  worker.worker2.host=node2.domain.org
+  # Define the second member worker
   worker.worker2.type=ajp13
-  worker.worker2.lbfactor=1
+  worker.worker2.host=myhost2
+  worker.worker2.port=8009
   # Disable worker2 for all requests except failover
   worker.worker2.activation=disabled
-  
-  # Define the LB worker
-  worker.router.type=lb
-  worker.router.balance_workers=worker1,worker2
 </source>
 
 <p>
-The <b>redirect</b> flag on worker1 tells the <b>lb_worker</b> to redirect the 
requests
-to worker2 only if worker1 is in error state. In other cases worker2 will not 
receive
-any requests, thus acting like a hot standby.
-</p>
-
-
+The <code>redirect</code> flag on worker1 tells the load balancer
+to redirect the requests to worker2 in case that worker1 has a problem.
+In all other cases worker2 will not receive any requests, thus acting
+like a hot standby.
+</p>
+
+<p>A final note about setting <code>activation</code> to <b>disabled</b>:
+The session id coming with a request is send either
+as part of the request URL (<code>;jsessionid=...</code>) or via a cookie.
+When using bookmarks or browsers that are running since a long time,
+it is possible to send a request carrying an old and invalid session id
+pointing at a disabled member.
+Since the load balancer does not have a list of valid sessions, it will
+forward the request to the disabled member. Thus draining takes longer than
+expected. To handle such cases, you can add a Servlet filter to your web
+application, which checks the request attribute <code>JK_LB_ACTIVATION</code>.
+This attribute contains one of the strings "ACT", "DIS" or "STP". If you
+detect "DIS" and the session for the request is no longer active, delete the
+session cookie and redirect using a self-referential URL. The redirected
+request will then no longer carry session information and thus the load
+balancer will not send it to the disabled worker. The request attribute
+<code>JK_LB_ACTIVATION</code> has been added in version 1.2.32.</p>
 </subsection>
 
 <subsection name="Status Worker properties">
 <p>
 The status worker does not communicate with Tomcat.
-Instead it is responsible for the load balancer management. 
+Instead it is responsible for the worker management. It is
+especially useful when combined with load balancer workers.
 </p>
 <source>
   # Add the status worker to the worker list

Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1078872&r1=1078871&r2=1078872&view=diff
==============================================================================
--- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Mon Mar  7 18:04:44 2011
@@ -44,6 +44,9 @@
   <br />
   <subsection name="Native">
     <changelog>
+      <update>
+        Docs: Improve load balancer documentation. (rjung)
+      </update>
       <add>
         LB: Forward worker activation state as request attribute
         "JK_LB_ACTIVATION". Possible values are "ACT" (active),



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to