[Seaside] Load Balancing Multiple Seaside Images with mod_proxy_balancer [was: Server Identification in Session Keys]

Sven Van Caekenberghe sven at beta9.be
Sat Aug 21 12:57:37 UTC 2010


Great writeup, Philippe, this should definitively go into the book.

I would also vote for including the Seaside-Cluster package into the main Seaside release (it is very small).

Yesterday, I got the following config working, which is very similar to yours:

<VirtualHost *:80>

  DocumentRoot /home/sven/html
  <Directory /home/sven/html>
    Order deny,allow
    Allow from all
  </Directory>

  ProxyRequests Off
  ProxyPreserveHost On
  ServerName smalltalk.wolf359.be

  BalancerMember balancer://seaside-cluster http://127.0.0.1:8081 route=R1 
  BalancerMember balancer://seaside-cluster http://127.0.0.1:8082 route=R2

  ProxyPass /server-status !
  ProxyPass /balancer-manager !
  ProxyPass /files/RedditFileLibrary !
  ProxyPass / balancer://seaside-cluster/ nofailover=on stickysession=_s 
  ProxyPassReverse / balancer://seaside-cluster/ 
  ProxyStatus On

  <Location /balancer-manager>
    SetHandler balancer-manager
    Order deny,allow
    Allow from all
  </Location>

  <Location /server-status>
    SetHandler server-status
    Order deny,allow
    Allow from all
  </Location>

  ErrorLog /home/sven/logs/apache_error.log
  LogLevel warn
  CustomLog /home/sven/logs/apache_access.log combined

</VirtualHost>

I had some trouble with the balancer member's routes not being picked up, I had to write them outside a <Proxy>. 
That was on the following system:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.1 LTS"

Server version: Apache/2.2.14 (Ubuntu)
Server built:   Apr 13 2010 19:29:28

But maybe I just got apache into a strange state ;-)
My ProxyPassReverse is different, I am not sure which one is correct.

I start each node as follows:

#!/bin/bash

VM=/home/sven/bin/squeak
VM_PARAMS="-mmap 32m -vm-display-none -vm-sound-none"
IMAGE=/home/sven/smalltalk/seaside-sven-1/deploy-seaside-sven-clustered.image
USER=sven
ARGS=/home/sven/smalltalk/seaside-sven-1/node1.st

exec setuidgid $USER $VM $VM_PARAMS $IMAGE $ARGS

With node1.st like this:

(WAComancheAdaptor default) stop; port: 8081; start.
WAAdmin makeAllClusteredWith: 'R1'.

This way, the image itself stays identical.
I also serve some static files directly with apache.
They are easily generated with <YourFileLibrarySubclass> deployFiles.

My 2c,

Sven

On 21 Aug 2010, at 11:22, Philippe Marschall wrote:

> Hi
> 
> There are several ways to load balance Seaside images, one way is
> Apache 2.2 and mod_proxy_balancer [1]. Compared to other solutions
> it's relatively easy to set up, doesn't modify the response and is
> free of cost. It only needs one small additional Seaside package with
> two classes. Additionally mod_proxy_balancer has some advanced
> features like a manager application, configurable scheduler algorithm
> and load factor.
> 
> When load balancing multiple Seaside images care must be taken that
> all requests that require a particular session are processed by the
> same image because that session is only available in this image
> (unless you're on GemStone). This has to work with and without session
> cookies. This is referred to as sticky sessions because a session
> sticks to its image. mod_proxy_balancer does this by associating each
> image with and id called route or jvmRoute. Seaside has to append this
> route to the session id. mod_proxy_balancer reads the route from the
> request and proxies to the right image. This has the advantage that
> mod_proxy_balancer does not have to keep track of all the sessions and
> does not have to modify the response. Additionally since the mapping
> is defined statically in the the Apache configuration it survives
> server restarts.
> 
> First you need to define your cluster of images. We'll use two images,
> the first one on port 8080 with the route "first" the second on port
> 9090 with route "second". You can of course chose other routes as long
> as they're unique.
> 
> <Proxy balancer://mycluster>
>    BalancerMember http://127.0.0.1:8080  route=first
>    BalancerMember http://127.0.0.1:9090  route=second
> </Proxy>
> 
> Then we'll need to define the actual proxy configuration, this is very
> similar to a single Seaside image behind an Apache.
> 
> ProxyPass / balancer://mycluster/ stickysession=_s|_s nofailover=On
> ProxyPassReverse / http://127.0.0.1:8080/
> ProxyPassReverse / http://127.0.0.1:9090/
> 
> Note that we configure _s to be the session id for the the URL and the cookie.
> 
> Finally we can optionally add the balancer manager:
> 
> ProxyPass /balancer-manager !
> <Location /balancer-manager>
>    SetHandler balancer-manager
> </Location>
> 
> Putting everything together it looks something like this (we also
> configures server-status):
> 
> <VirtualHost *>
> 
>        ProxyRequests Off
>        ProxyStatus On
>        ProxyPreserveHost On
>        ProxyPass /balancer-manager !
>        ProxyPass /server-status !
>        ProxyPass / balancer://mycluster/ STICKYSESSION=_s|_s
>        ProxyPassReverse / http://127.0.0.1:8080/
>        ProxyPassReverse / http://127.0.0.1:9090/
> 
>        <Proxy balancer://mycluster>
>                BalancerMember http://127.0.0.1:8080  route=first
>                BalancerMember http://127.0.0.1:9090  route=second
>        </Proxy>
> 
>        <Location /balancer-manager>
>                SetHandler balancer-manager
> 
>                Order Deny,Allow
>                Deny from all
>                Allow from 127.0.0.1
>                Allow from localhost
>        </Location>
> 
>        <Location /server-status>
>                SetHandler server-status
> 
>                Order Deny,Allow
>                Deny from all
>                Allow from 127.0.0.1
>                Allow from localhost
>        </Location>
> 
> </VirtualHost>
> 
> Now all that is left is configuring Seaside. First you need to load
> Seaside-Cluster from [2] (only works with Seaside 3.0). Then you need
> to configure each image individually with the correct route. It's
> important that this matches your Apache configuration from above. The
> easiest way to do this is
> 
> WAAdmin makeAllClusteredWith: 'first'
> 
> in the image on port 8080 and
> 
> WAAdmin makeAllClusteredWith: 'second'
> 
> in the image on port 9090.
> 
> That's it, your sticky session cluster ready to go. You can find the
> manager at http://127.0.0.1/balancer-manager and the server status on
> http://127.0.0.1/server-status
> 
> 
> [1] http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html
> [2] http://www.squeaksource.com/ajp/
> 
> Cheers
> Philippe
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside



More information about the seaside mailing list