Package: txLoadBalancer
ContentsIntroductionUsageFeaturesPerformanceChangesIntroductionThis is a pure python TCP load balancer. It takes inbound TCP connections and
connects them to one of a number of backend servers.txLoadBalancer is a fork of Anthony Baxter’s PythonDirector. It removed all
threading and asyncore code and the admin UI with the Twisted-based analogs. It
also significantly reorganized the API and provided many new features (see
below).Usage$ twistd -noy ./bin/txlb.tacThis will use the default configuration file in ./etc/config.xml; you can edit
the .tac file to point to the config you prefer. Be sure to edit the
config.xml file to properly reflect your services in need of load-balancing.To enable the admin interface, your config file must have the admin section
defined, with the required fields. For an example, be sure to see
./etc/config.xml. For more details, please see the configuration information in
the ./doc directory.If you are creating your own script and don’t want to use txlb.tac, you can
import the application setup functions in txlb.application.If you want to “embed” a load-balancer in your Twisted application, see the
example ./bin/txlbWeb.tac.FeaturesIt is a pure-Twisted TCP loadbalancer.Thanks to Twisted, it’s async i/o based, so much less overhead than
fork/thread based balancers.It has multiple scheduling algorithms (random, round robin, leastconns,
weighted). If a server fails to answer, it’s removed from the pool - the
client that failed to connect gets transparently failed over to a new host.Provides an optional builtin webserver for a built-in admin UI.Seperate management timer services that perform such tasks as periodically
readding failed hosts to the rotation, updated on-disk config files with
changes made to the running server.A built-in SSH server for managing (and modifying) a running load-balancer
instance.A Twisted API for adding a load-balancing service to your Twisted application
without the need to run a separate load-balancer.The application uses an XML-based configuration file.Performance(This section is currently incomplete)Duncan’s notes from 2008, tested on a 2 CPU Sun Netra 240:a single apache instance on Solaris 10
* starting threads:
* max threads2 load-balanced apache instances on Solaris 10twisted.web instances on Solaris 10 (same docroot)2 load-balanced twisted.web instancesPythonDirector 1.0.0 proxies for 2 load-balanced twisted.web instancesAnthony’s original notes on performance:On my notebook, load balancing an apache on the same local ethernet
(serving a static 18K text file) gets 155 connections per second and
2850 kbytes/s throughput (apachebench -n 2000 -c 10). Connecting directly
to the apache gets 180 conns/sec and 3400kbytes/s. So unless you’re
serving really really stupidly high hit rates it’s unlikely to be
pythondirector causing you difficulties. (Note that 155 connections/sec
is 13 million hits per day…)Running purely over the loopback interface to a local apache seems to
max out at around 350 conns/second.ChangesFrom txLoadBalancer 1.0.1 to 1.1.0Massive API changes: competely reorganzied the code base.Integrated patches from Apple’s Calendar Server project.A new API for creating load-balanced services within a Twisted application
(without the need to run a separate load-balancingn daemon).Added support for live interaction with load-balancer via SSH connection to
running Python interpretter (Twisted manhole).The ability to start listening on a new port without restaring the
application.Added a weighted load balance scheduler.From txLoadBalancer 0.9.1 to 1.0.1100% Twisted: removed all threading and asyncore code completely.Significan API changes.Dropped the web API.From PyDirector 1.0.0 to 1.1.1 (AKA txLoadBalancer 0.9.1)Added support for Twisted, providing the option for all management, admin and
load-balancing to utilize the Twisted reactor, skipping threading and asycore
altogether.From PyDirector 0.0.7 to 1.0.0Very few, mostly this is to update the project to ‘stable’ status.The networking code now uses twisted if available, and falls back
to asyncore.From PyDirector 0.0.6 to 0.0.7You can specify a hostname of ‘*’ to the listen directive for both
the scheduler and the administrative interface to mean ‘listen on
all interfaces’. Considerably more obvious than ‘0.0.0.0’. Thanks
to Andrew Sydelko for the idea.New “leastconnsrr” scheduler - this is leastconns, with a roundrobin
as well. Previously, leastconns would keep the list of hosts sorted,
which often meant one system got beaten up pretty badly.Twisted backend group selection works again.The client address is now passed to the scheduler’s getHost() method.
This allows the creation of “sticky” schedulers, where a client is
(by preference) sent to the same backend server. The factory function
for schedulers will change to allow things like “roundrobin,sticky”.From PyDirector 0.0.5 to 0.0.6fixed an error in the (hopefully rare) case where all backend servers
are down.the main script uses resource.setrlimit() to boost the number of open
filedescriptors (solaris has stupidly low defaults)when all backend servers are down, the manager thread goes into a much
more aggressive mode re-adding them.handle comments in the config fileFrom PyDirector 0.0.4 to 0.0.5bunch of bugfixes to the loggingre-implemented the networking code using the ‘twisted’ framework; a simple
loopback test with asyncore based pydir:Requests per second:    107.72
Transfer rate:          2462.69 kb/s receivedthe same test with twisted-based pydir:Requests per second:    197.90
Transfer rate:          4519.69 kb/s receivedFrom PyDirector 0.0.3 to 0.0.4can now specify more than one listener for a service‘client’ in the config XML is now ‘host’fixed a bug in leastconns and roundrobin scheduler if all backends
were unavailable.whole lotta documentation added.running display in web api now shows count of total connectionsrunning display now has refresh and auto-refreshcompareconf module - takes a running config and a new config and
emits the web api commands needed to make the running config match
the new configfirst cut at enabling https for web interface (needs m2crypto)From PyDirector 0.0.2 to 0.0.3delHost hooked uprunning.xml added - XML dump of current configcentralised logging - the various things that write logfile
entries need to be made consistent, and a lot of additional
logging needs to be added.Python2.1 compatibility fix: no socket.gaierror exception on 2.1From PyDirector 0.0.1 to 0.0.2refactored web publishing (babybobo)package-ised and distutil-ised the code