summaryrefslogtreecommitdiffstats
path: root/rubbos/app/tomcat-connectors-1.2.32-src/docs/generic_howto/loadbalancers.html
blob: 06a1ee5a9d5455bb41fd76c8657874fff498f699 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<html><head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>The Apache Tomcat Connector - Generic HowTo - LoadBalancer HowTo</title><meta name="author" value="Mladen Turk"><meta name="email" value="mturk@apache.org"><link href="../style.css" type="text/css" rel="stylesheet"></head><body bgcolor="#ffffff" text="#000000" link="#525D76" alink="#525D76" vlink="#525D76"><table border="0" width="100%" cellspacing="4"><!--PAGE HEADER--><tr><td colspan="2"><!--TOMCAT LOGO--><a href="http://tomcat.apache.org/"><img src="../images/tomcat.gif" align="left" alt="Apache Tomcat" border="0"></a><!--APACHE LOGO--><a href="http://www.apache.org/"><img src="http://www.apache.org/images/asf-logo.gif" align="right" alt="Apache Logo" border="0"></a></td></tr><!--HEADER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><tr><!--LEFT SIDE NAVIGATION--><td width="20%" valign="top" nowrap="true"><p><strong>Links</strong></p><ul><li><a href="../index.html">Docs Home</a></li></ul><p><strong>Reference Guide</strong></p><ul><li><a href="../reference/workers.html">workers.properties</a></li><li><a href="../reference/uriworkermap.html">uriworkermap.properties</a></li><li><a href="../reference/status.html">Status Worker</a></li><li><a href="../reference/apache.html">Apache HTTP Server</a></li><li><a href="../reference/iis.html">IIS</a></li></ul><p><strong>Generic HowTo</strong></p><ul><li><a href="../generic_howto/quick.html">For the impatient</a></li><li><a href="../generic_howto/workers.html">All about workers</a></li><li><a href="../generic_howto/timeouts.html">Timeouts</a></li><li><a href="../generic_howto/loadbalancers.html">Load Balancing</a></li><li><a href="../generic_howto/proxy.html">Reverse Proxy</a></li></ul><p><strong>Webserver HowTo</strong></p><ul><li><a href="../webserver_howto/apache.html">Apache HTTP Server</a></li><li><a href="../webserver_howto/iis.html">IIS</a></li><li><a href="../webserver_howto/nes.html">Netscape/SunOne/Sun</a></li></ul><p><strong>AJP Protocol Reference</strong></p><ul><li><a href="../ajp/ajpv13a.html">AJPv13</a></li><li><a href="../ajp/ajpv13ext.html">AJPv13 Extension Proposal</a></li></ul><p><strong>Miscellaneous Documentation</strong></p><ul><li><a href="../miscellaneous/faq.html">Frequently asked questions</a></li><li><a href="../miscellaneous/changelog.html">Changelog</a></li><li><a href="http://issues.apache.org/bugzilla/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=Tomcat+Connectors&amp;long_desc_type=substring&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;keywords_type=allwords&amp;keywords=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=&amp;emailassigned_to2=1&amp;emailreporter2=1&amp;emailcc2=1&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=">Current Tomcat Connectors bugs</a></li><li><a href="../miscellaneous/doccontrib.html">Contribute documentation</a></li><li><a href="../miscellaneous/jkstatustasks.html">JK Status Ant Tasks</a></li><li><a href="../miscellaneous/reporttools.html">Reporting Tools</a></li><li><a href="http://tomcat.apache.org/connectors-doc-archive/jk2/index.html">Old JK/JK2 documentation</a></li></ul><p><strong>News</strong></p><ul><li><a href="../news/20110701.html">2011</a></li><li><a href="../news/20100101.html">2010</a></li><li><a href="../news/20090301.html">2009</a></li><li><a href="../news/20081001.html">2008</a></li><li><a href="../news/20070301.html">2007</a></li><li><a href="../news/20060101.html">2006</a></li><li><a href="../news/20050101.html">2005</a></li><li><a href="../news/20041100.html">2004</a></li></ul></td><!--RIGHT SIDE MAIN BODY--><td width="80%" valign="top" align="left"><table border="0" width="100%" cellspacing="4"><tr><td align="left" valign="top"><h1>The Apache Tomcat Connector - Generic HowTo</h1><h2>LoadBalancer HowTo</h2></td><td align="right" valign="top" nowrap="true"><small><a href="printer/loadbalancers.html"><img src="../images/printer.gif" border="0" alt="Printer Friendly Version"><br>print-friendly<br>version
                    </a></small></td></tr></table><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote> 
<br>
<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>
This management includes:
</p>
<ul>
<li>
Instantiating the workers in the web server.
</li>
<li>
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>
Identifying failed Tomcat workers, suspending requests to them and instead
falling-back on other workers managed by the load balancer.
</li>
<li>
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>
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>

<table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Basic Load Balancer Properties"><strong>Basic Load Balancer Properties</strong></a></font></td></tr><tr><td><blockquote>
<p>A worker is configured as a load balancer by setting its worker <b class="code">type</b>
to <b>lb</b>.
</p>
<p>
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 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 <b class="code">worker.list</b> 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 <b class="code">lbfactor</b> 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>

<div class="example"><pre>
  # 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
</pre></div>

<p><font color="#ff0000">
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 <b class="code">jvmRoute</b> 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 <b class="code">jvmRoute="worker1"</b>, Tomcat on host "myhost2"
needs <b class="code">jvmRoute="worker2"</b>.
</font></p>

<p>For a complete reference of all load balancer configuration
attributes, please consult the worker <a href="../reference/workers.html">reference</a>.
</p>
</blockquote></td></tr></table>

<table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Advanced Load Balancer Worker Properties"><strong>Advanced Load Balancer Worker Properties</strong></a></font></td></tr><tr><td><blockquote>
<p>The load balancer supports complex topologies and failover configurations.
Using the member attribute <b class="code">distance</b> 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 <b class="code">domain</b> 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 <b class="code">activation</b>.
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
<b class="code">activation</b> set to <b>disabled</b> in combination with
the attribute <b class="code">redirect</b> added to the other workers:</p>

<div class="example"><pre>
  # The advanced router LB worker
  worker.list=router
  worker.router.type=lb
  worker.router.balance_workers=worker1,worker2

  # Define the first member worker
  worker.worker1.type=ajp13
  worker.worker1.host=myhost1
  worker.worker1.port=8009
  # Define preferred failover node for worker1
  worker.worker1.redirect=worker2

  # Define the second member worker
  worker.worker2.type=ajp13
  worker.worker2.host=myhost2
  worker.worker2.port=8009
  # Disable worker2 for all requests except failover
  worker.worker2.activation=disabled
</pre></div>

<p>
The <b class="code">redirect</b> 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 <b class="code">activation</b> to <b>disabled</b>:
The session id coming with a request is send either
as part of the request URL (<b class="code">;jsessionid=...</b>) 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 <b class="code">JK_LB_ACTIVATION</b>.
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
<b class="code">JK_LB_ACTIVATION</b> has been added in version 1.2.32.</p>
</blockquote></td></tr></table>

<table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Status Worker properties"><strong>Status Worker properties</strong></a></font></td></tr><tr><td><blockquote>
<p>
The status worker does not communicate with Tomcat.
Instead it is responsible for the worker management. It is
especially useful when combined with load balancer workers.
</p>
<div class="example"><pre>
  # Add the status worker to the worker list
  worker.list=jkstatus
  # Define a 'jkstatus' worker using status
  worker.jkstatus.type=status
</pre></div>
<p>Next thing is to mount the requests to the jkstatus worker. For Apache
web servers use the:</p>
<div class="example"><pre>
  # Add the jkstatus mount point
  JkMount /jkmanager/* jkstatus 
</pre></div>
<p>To obtain a higher level of security use the:</p>
<div class="example"><pre>
  # Enable the JK manager access from localhost only
 &lt;Location /jkmanager/&gt;
    JkMount jkstatus
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
 &lt;/Location&gt;
</pre></div>

</blockquote></td></tr></table>

</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>
        Copyright &copy; 1999-2011, Apache Software Foundation
        </em></font></div></td></tr></table></body></html>