Load Balancing with Apache

At last night’s Burlington, Vermont PHP Users Group meeting I gave a presentation on Load Balancing with Apache:

I’ve posted the example configuration files for reference.

Basic load balancing:

# Create a load balancer named "web-nodes"
<Proxy balancer://web-nodes>
# Add three load balancer members
BalancerMember http://www1.example.com
BalancerMember http://www2.example.com
BalancerMember http://www3.example.com
</Proxy>
# Send all requests to the "web-nodes" balancer
ProxyPass / balancer://web-nodes

Sticky sessions in PHP:

# Create a load balancer named "web-nodes"
<Proxy balancer://web-nodes>
# Add three load balancer members
BalancerMember http://www1.example.com
BalancerMember http://www2.example.com
BalancerMember http://www3.example.com
# Use the PHPSESSID for sticky sessions
ProxySet stickysession=PHPSESSID
</Proxy>
# Send all requests to the "web-nodes" balancer
ProxyPass / balancer://web-nodes

Create your own sticky sessions:

# Set a cookie
Header add Set-Cookie "NODE=%{BALANCER_WORKER_ROUTE}e; path=/" \
env=BALANCER_ROUTE_CHANGED
# Create a load balancer named "web-nodes"
<Proxy balancer://web-nodes>
# Add three load balancer members
BalancerMember http://www1.example.com route=1
BalancerMember http://www2.example.com route=2
BalancerMember http://www3.example.com route=3
# Use the NODE cookie for sticky sessions
ProxySet stickysession=NODE
</Proxy>
# Send all requests to the "web-nodes" balancer
ProxyPass / balancer://web-nodes

Route based on HTTP method:

# Enable mod_rewrite
RewriteEngine On
# Send POST, PUT, and DELETEs to "write" balancer
RewriteCond %{REQUEST_METHOD} ^(POST|PUT|DELETE)$
RewriteRule ^/(.*)$ balancer://write$1 [P]
# Send GET, HEAD, and OPTIONS to "read" balancer
RewriteCond %{REQUEST_METHOD} ^(GET|HEAD|OPTIONS)$
RewriteRule ^/(.*)$ balancer://read$1 [P]
# Modify HTTP response headers (e.g. Location)
ProxyPassReverse / balancer://write
ProxyPassReverse / balancer://read

Distributed load testing with Tsung:

<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<!-- Client side setup -->
<clients>
<client host="test-a" weight="1" maxusers="10000" cpu="4" />
<client host="test-b" weight="1" maxusers="10000" cpu="4" />
</clients>
<!-- Server side setup -->
<servers>
<server host="www" port="80" type="tcp" />
</servers>
<!-- Load setup -->
<load>
<arrivalphase phase="1" duration="5" unit="minute">
<users arrivalrate="200" unit="second" />
</arrivalphase>
</load>
<!-- Session setup -->
<session name="default" probability="100" type="ts_http">
<thinktime value="1" random="true" />
<request>
<http method="GET" url="/" />
</request>
</session>
<!-- Monitoring setup -->
<monitoring>
<monitor host="www" type="munin" />
<monitor host="www1" type="munin" />
<monitor host="www2" type="munin" />
<monitor host="www3" type="munin" />
</monitoring>
</tsung>
view raw tsung.xml hosted with ❤ by GitHub

I cover load balancing and distributed load testing in more detail in my upcoming book, Scaling CouchDB.

One Comment

  1. Posted March 31, 2011 at 8:39 am | Permalink

    Thats really great!

    Thanks