1
0
mirror of https://github.com/apache/httpd.git synced 2025-07-30 20:03:10 +03:00

Removes a lengthy and unnecessary discussion of the various methods of

load balancing. Removes a RewriteMap prg load balancing script, and
replaces it with a RewriteMap rnd example of the same, as well as an
admonition to use mod_proxy_balancer instead.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@835364 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Rich Bowen
2009-11-12 12:30:05 +00:00
parent bf553f4e74
commit c32c165396
4 changed files with 100 additions and 317 deletions

View File

@ -34,6 +34,7 @@ configuration.</div>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#sharding">URL-based sharding accross multiple backends</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#on-the-fly-content">On-the-fly Content-Regeneration</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#load-balancing">Load Balancing</a></li>
</ul><h3>See also</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Module documentation</a></li><li><a href="intro.html">mod_rewrite introduction</a></li><li><a href="remapping.html">Redirection and remapping</a></li><li><a href="access.html">Controlling access</a></li><li><a href="avoid.html">When not to use mod_rewrite</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
@ -133,6 +134,54 @@ RewriteRule ^page\.<strong>html</strong>$ page.<strong>cgi</strong> [
</dd>
</dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="load-balancing" id="load-balancing">Load Balancing</a></h2>
<dl>
<dt>Description:</dt>
<dd>
<p>We wish to randomly distribute load across several servers
using mod_rewrite.</p>
</dd>
<dt>Solution:</dt>
<dd>
<p>We'll use <code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> and a list of servers
to accomplish this.</p>
<div class="example"><pre>
RewriteEngine on
RewriteMap lb rnd:/path/to/serverlist.txt
RewriteRule ^/(.*) http://${lb:servers}/$1 [P,L]
</pre></div>
<p><code>serverlist.txt</code> will contain a list of the servers:</p>
<div class="example"><pre>
## serverlist.txt
servers one.example.com|two.example.com|three.example.com
</pre></div>
<p>If you want one particular server to get more of the load than the
others, add it more times to the list.</p>
</dd>
<dt>Discussion</dt>
<dd>
<p>Apache comes with a load-balancing module -
<code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> - which is far more flexible and
featureful than anything you can cobble together using mod_rewrite.</p>
</dd>
</dl>
</div></div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/rewrite/avoid.html" title="English">&nbsp;en&nbsp;</a></p>

View File

@ -142,4 +142,55 @@ RewriteRule ^page\.<strong>html</strong>$ page.<strong>cgi</strong> [
</section>
<section id="load-balancing">
<title>Load Balancing</title>
<dl>
<dt>Description:</dt>
<dd>
<p>We wish to randomly distribute load across several servers
using mod_rewrite.</p>
</dd>
<dt>Solution:</dt>
<dd>
<p>We'll use <directive
module="mod_rewrite">RewriteMap</directive> and a list of servers
to accomplish this.</p>
<example><pre>
RewriteEngine on
RewriteMap lb rnd:/path/to/serverlist.txt
RewriteRule ^/(.*) http://${lb:servers}/$1 [P,L]
</pre></example>
<p><code>serverlist.txt</code> will contain a list of the servers:</p>
<example><pre>
## serverlist.txt
servers one.example.com|two.example.com|three.example.com
</pre></example>
<p>If you want one particular server to get more of the load than the
others, add it more times to the list.</p>
</dd>
<dt>Discussion</dt>
<dd>
<p>Apache comes with a load-balancing module -
<module>mod_proxy_balancer</module> - which is far more flexible and
featureful than anything you can cobble together using mod_rewrite.</p>
</dd>
</dl>
</section>
</manualpage>

View File

@ -51,7 +51,6 @@
<li><img alt="" src="../images/down.gif" /> <a href="#structuredhomedirs">Structured Homedirs</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#dynamic-mirror">Dynamic Mirror</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#retrieve-missing-data">Retrieve Missing Data from Intranet</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#load-balancing">Load Balancing</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#new-mime-type">New MIME-type, New Service</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#autorefresh">Document With Autorefresh</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#mass-virtual-hosting">Mass Virtual Hosting</a></li>
@ -482,163 +481,6 @@ RewriteRule ^/home/([^/]+)/.www/?(.*) http://<strong>www2</strong>.quux-corp.dom
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="load-balancing" id="load-balancing">Load Balancing</a></h2>
<dl>
<dt>Description:</dt>
<dd>
<p>Suppose we want to load balance the traffic to
<code>www.example.com</code> over <code>www[0-5].example.com</code>
(a total of 6 servers). How can this be done?</p>
</dd>
<dt>Solution:</dt>
<dd>
<p>There are many possible solutions for this problem.
We will first discuss a common DNS-based method,
and then one based on <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>:</p>
<ol>
<li>
<strong>DNS Round-Robin</strong>
<p>The simplest method for load-balancing is to use
DNS round-robin.
Here you just configure <code>www[0-9].example.com</code>
as usual in your DNS with A (address) records, e.g.,</p>
<div class="example"><pre>
www0 IN A 1.2.3.1
www1 IN A 1.2.3.2
www2 IN A 1.2.3.3
www3 IN A 1.2.3.4
www4 IN A 1.2.3.5
www5 IN A 1.2.3.6
</pre></div>
<p>Then you additionally add the following entries:</p>
<div class="example"><pre>
www IN A 1.2.3.1
www IN A 1.2.3.2
www IN A 1.2.3.3
www IN A 1.2.3.4
www IN A 1.2.3.5
</pre></div>
<p>Now when <code>www.example.com</code> gets
resolved, <code>BIND</code> gives out <code>www0-www5</code>
- but in a permutated (rotated) order every time.
This way the clients are spread over the various
servers. But notice that this is not a perfect load
balancing scheme, because DNS resolutions are
cached by clients and other nameservers, so
once a client has resolved <code>www.example.com</code>
to a particular <code>wwwN.example.com</code>, all its
subsequent requests will continue to go to the same
IP (and thus a single server), rather than being
distributed across the other available servers. But the
overall result is
okay because the requests are collectively
spread over the various web servers.</p>
</li>
<li>
<strong>DNS Load-Balancing</strong>
<p>A sophisticated DNS-based method for
load-balancing is to use the program
<code>lbnamed</code> which can be found at <a href="http://www.stanford.edu/~riepel/lbnamed/">
http://www.stanford.edu/~riepel/lbnamed/</a>.
It is a Perl 5 program which, in conjunction with auxiliary
tools, provides real load-balancing via
DNS.</p>
</li>
<li>
<strong>Proxy Throughput Round-Robin</strong>
<p>In this variant we use <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>
and its proxy throughput feature. First we dedicate
<code>www0.example.com</code> to be actually
<code>www.example.com</code> by using a single</p>
<div class="example"><pre>
www IN CNAME www0.example.com.
</pre></div>
<p>entry in the DNS. Then we convert
<code>www0.example.com</code> to a proxy-only server,
i.e., we configure this machine so all arriving URLs
are simply passed through its internal proxy to one of
the 5 other servers (<code>www1-www5</code>). To
accomplish this we first establish a ruleset which
contacts a load balancing script <code>lb.pl</code>
for all URLs.</p>
<div class="example"><pre>
RewriteEngine on
RewriteMap lb prg:/path/to/lb.pl
RewriteRule ^/(.+)$ ${lb:$1} [P,L]
</pre></div>
<p>Then we write <code>lb.pl</code>:</p>
<div class="example"><pre>
#!/path/to/perl
##
## lb.pl -- load balancing script
##
$| = 1;
$name = "www"; # the hostname base
$first = 1; # the first server (not 0 here, because 0 is myself)
$last = 5; # the last server in the round-robin
$domain = "foo.dom"; # the domainname
$cnt = 0;
while (&lt;STDIN&gt;) {
$cnt = (($cnt+1) % ($last+1-$first));
$server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
print "http://$server/$_";
}
##EOF##
</pre></div>
<div class="note">A last notice: Why is this useful? Seems like
<code>www0.example.com</code> still is overloaded? The
answer is yes, it is overloaded, but with plain proxy
throughput requests, only! All SSI, CGI, ePerl, etc.
processing is handled done on the other machines.
For a complicated site, this may work well. The biggest
risk here is that www0 is now a single point of failure --
if it crashes, the other servers are inaccessible.</div>
</li>
<li>
<strong>Dedicated Load Balancers</strong>
<p>There are more sophisticated solutions, as well. Cisco,
F5, and several other companies sell hardware load
balancers (typically used in pairs for redundancy), which
offer sophisticated load balancing and auto-failover
features. There are software packages which offer similar
features on commodity hardware, as well. If you have
enough money or need, check these out. The <a href="http://vegan.net/lb/">lb-l mailing list</a> is a
good place to research.</p>
</li>
</ol>
</dd>
</dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="new-mime-type" id="new-mime-type">New MIME-type, New Service</a></h2>

View File

@ -477,165 +477,6 @@ RewriteRule ^/home/([^/]+)/.www/?(.*) http://<strong>www2</strong>.quux-corp.dom
</section>
<section id="load-balancing">
<title>Load Balancing</title>
<dl>
<dt>Description:</dt>
<dd>
<p>Suppose we want to load balance the traffic to
<code>www.example.com</code> over <code>www[0-5].example.com</code>
(a total of 6 servers). How can this be done?</p>
</dd>
<dt>Solution:</dt>
<dd>
<p>There are many possible solutions for this problem.
We will first discuss a common DNS-based method,
and then one based on <module>mod_rewrite</module>:</p>
<ol>
<li>
<strong>DNS Round-Robin</strong>
<p>The simplest method for load-balancing is to use
DNS round-robin.
Here you just configure <code>www[0-9].example.com</code>
as usual in your DNS with A (address) records, e.g.,</p>
<example><pre>
www0 IN A 1.2.3.1
www1 IN A 1.2.3.2
www2 IN A 1.2.3.3
www3 IN A 1.2.3.4
www4 IN A 1.2.3.5
www5 IN A 1.2.3.6
</pre></example>
<p>Then you additionally add the following entries:</p>
<example><pre>
www IN A 1.2.3.1
www IN A 1.2.3.2
www IN A 1.2.3.3
www IN A 1.2.3.4
www IN A 1.2.3.5
</pre></example>
<p>Now when <code>www.example.com</code> gets
resolved, <code>BIND</code> gives out <code>www0-www5</code>
- but in a permutated (rotated) order every time.
This way the clients are spread over the various
servers. But notice that this is not a perfect load
balancing scheme, because DNS resolutions are
cached by clients and other nameservers, so
once a client has resolved <code>www.example.com</code>
to a particular <code>wwwN.example.com</code>, all its
subsequent requests will continue to go to the same
IP (and thus a single server), rather than being
distributed across the other available servers. But the
overall result is
okay because the requests are collectively
spread over the various web servers.</p>
</li>
<li>
<strong>DNS Load-Balancing</strong>
<p>A sophisticated DNS-based method for
load-balancing is to use the program
<code>lbnamed</code> which can be found at <a
href="http://www.stanford.edu/~riepel/lbnamed/">
http://www.stanford.edu/~riepel/lbnamed/</a>.
It is a Perl 5 program which, in conjunction with auxiliary
tools, provides real load-balancing via
DNS.</p>
</li>
<li>
<strong>Proxy Throughput Round-Robin</strong>
<p>In this variant we use <module>mod_rewrite</module>
and its proxy throughput feature. First we dedicate
<code>www0.example.com</code> to be actually
<code>www.example.com</code> by using a single</p>
<example><pre>
www IN CNAME www0.example.com.
</pre></example>
<p>entry in the DNS. Then we convert
<code>www0.example.com</code> to a proxy-only server,
i.e., we configure this machine so all arriving URLs
are simply passed through its internal proxy to one of
the 5 other servers (<code>www1-www5</code>). To
accomplish this we first establish a ruleset which
contacts a load balancing script <code>lb.pl</code>
for all URLs.</p>
<example><pre>
RewriteEngine on
RewriteMap lb prg:/path/to/lb.pl
RewriteRule ^/(.+)$ ${lb:$1} [P,L]
</pre></example>
<p>Then we write <code>lb.pl</code>:</p>
<example><pre>
#!/path/to/perl
##
## lb.pl -- load balancing script
##
$| = 1;
$name = "www"; # the hostname base
$first = 1; # the first server (not 0 here, because 0 is myself)
$last = 5; # the last server in the round-robin
$domain = "foo.dom"; # the domainname
$cnt = 0;
while (&lt;STDIN&gt;) {
$cnt = (($cnt+1) % ($last+1-$first));
$server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
print "http://$server/$_";
}
##EOF##
</pre></example>
<note>A last notice: Why is this useful? Seems like
<code>www0.example.com</code> still is overloaded? The
answer is yes, it is overloaded, but with plain proxy
throughput requests, only! All SSI, CGI, ePerl, etc.
processing is handled done on the other machines.
For a complicated site, this may work well. The biggest
risk here is that www0 is now a single point of failure --
if it crashes, the other servers are inaccessible.</note>
</li>
<li>
<strong>Dedicated Load Balancers</strong>
<p>There are more sophisticated solutions, as well. Cisco,
F5, and several other companies sell hardware load
balancers (typically used in pairs for redundancy), which
offer sophisticated load balancing and auto-failover
features. There are software packages which offer similar
features on commodity hardware, as well. If you have
enough money or need, check these out. The <a
href="http://vegan.net/lb/">lb-l mailing list</a> is a
good place to research.</p>
</li>
</ol>
</dd>
</dl>
</section>
<section id="new-mime-type">
<title>New MIME-type, New Service</title>