Failover Squid via HAProxy

Failover Squid via HAProxy #


At the moment I’m using Squid quite a bit as a forward proxy. The application in question pulls content from remote sites and does some processing on it. It’s handy to have a copy of the site ’nearby’ in case further processing is needed. So, the content is pulled through Squid for later use. Obviously, a single squid instance is no good. If it goes down, everything grinds to a halt. I’m a huge fan of HAProxy, so I though it’s active/passive setup might be a good fit here.

The configuration of the health checks took me a little while to figure out, but apart from that it’s pretty straightforward.

Here’s the relevant chunk of the config.

frontend squid-frontend
  bind *:3128
  mode http
  default_backend squid-backend

backend squid-backend
  balance roundrobin
  option httpchk GET HTTP/1.0
  server squid-1 check inter 60000
  server squid-2 check inter 60000 backup

listen squid-responder
  bind *:1080
  mode http
  monitor-uri /

First of all, we have a frontend listening on port 3128, as squid would be. This is a http mode frontend and it sends all of the traffic to the backend ‘squid-backend’.

Next, we have the backend ‘squid-backend’. There are two servers in this backend. Normally, squid-1 is the active backend and all traffic coming into ‘squid-frontend’ will hit this server. If squid-1 goes down all of the traffic is routed to ‘squid-2’ instead. The ‘backup’ keyword is what turns this active/passive behaviour on.

The problem then is, how do we do a health check on each squid instance? To test squid properly, you need to make a request through squid to something else. This is where the ‘squid-responder’ block comes in. The only function of this listener is as a ‘remote’ url to pull through squid. So, we set our httpchck to make a GET request to HAProxy itself, but it will be routed through the relevant squid server.

The one downside with this setup is that, on the failure of your active squid server, you failover to a cold cache. Hopefully that’ll be rare enough that it won’t make too much of an impact.

Note : this is where I found the solution to this problem, from Willy himself -