Weave Net

Load Balancing and Fault Resilience with weaveDNS

It is permissible to register multiple containers with the same name: weaveDNS returns all addresses, in a random order, for each request. This provides a basic load balancing capability.

Expanding the overview example, let us start an additional pingme container on a second host, and then run some ping tests.

host2$ weave launch $HOST1
host2$ eval $(weave env)
host2$ docker run -dti --name=pingme alpine:latest

root@ubuntu:/# ping -nq -c 1 pingme
PING pingme.weave.local (10.32.0.2) 56(84) bytes of data.
...
root@ubuntu:/# ping -nq -c 1 pingme
PING pingme.weave.local (10.40.0.1) 56(84) bytes of data.
...
root@ubuntu:/# ping -nq -c 1 pingme
PING pingme.weave.local (10.40.0.1) 56(84) bytes of data.
...
root@ubuntu:/# ping -nq -c 1 pingme
PING pingme.weave.local (10.32.0.2) 56(84) bytes of data.
...

Notice how the ping reaches different addresses.

However, due to RFC 3484 address selection most DNS resolver libraries prefer certain addresses over others, to the point where in some circumstances the same address is always chosen. To avoid this behaviour, applications may want to perform their own address selection, e.g. by choosing a random entry from the result of getaddrinfo().

Fault Resilience

WeaveDNS removes the addresses of any container that dies. This offers a simple way to implement redundancy. E.g. if in our example we stop one of the pingme containers and re-run the ping tests, eventually (within ~30s at most, since that is the weaveDNS cache expiry time) we will only be hitting the address of the container that is still alive.

See Also