Background Information...

My company currently runs several "clusters" of application servers behind load balancers, which are each in turn sitting behind a "cluster" of squid machines configured as accelerators. each squid cluster is then sitting behind a load balancer that is hit by our clients.

To elaborate: The hostname appAA resolves to a load balancer which proxies to appAA-squid1, appAA-squid2, appAA-squid2, etc... Each of the appAA-squidX machines is configured as a standalone accelerator (using cache_peer ... parent no-query originserver) for appAA-backend. appAA-backend resolves to a load balancer which proxies to appAA-backend1, appAA-backend2, appAA-backend3, etc... Likewise for appBB, appCC, appDD, etc...

None of these squid instances know anything about each other. in the case of appAA-squidX vs appBB-squidX this is a good thing, because the entire point of isolating these apps is for QoS commitments, and ensuring that heavy load or catastrophic failure on one app doesn't affect another app.

In the case of appAA-squidX vs appAA-squidY it definitely seems like cache peering would be advantageous here.


The Problem(s)...

Our operations team is pretty adamant about software/configs deployed to boxes in a clustering needing to be the same for every box in the cluster. The goal is understandable: they don't want to need custom install steps for every individual machine. So while my dev setup of a 5 machine squid cluster each with 4 distinct "cache_peer ... sibling" lines works great so far, i can't deploy a unique squid.conf for each machine in a cluster.

I could probably put a hack into our build system to check the current hostname at installation time and remove any cache_peer lines refering to that hostname -- but before i jumped through those hoops i wanted to sanity check that there wasn't an easier way to do this in squid.

is there any easy way to reuse the same cache_peer config options on multiple instances, but keep squid smart enough that it doesn't bother trying to peer with itself?

(I had a glimmer of an idea about using ACL rules for this, but didn't work it through all the way because it seemed like at best that would cause squid to deny requests from itself, not prevent it from attempting the request in the first place)

I have a hard time imaging that i'm the first person to have this problem, but i couldn't find any obvious solutions in the mail archives.


A slightly bigger problem is what to do when the cluster changes, either because a machine is removed for maintenance issues or because a machine is added due to because of increases in load. In our current setup this is a no-brainer: tell the load balancer when you add/remove a machine and everything just works -- none of the boxes know anything about each other, and they all run identical configs.

In order to setup sibling peering, it seems like i would need to deploy/reload configs (with an updated list of cache_peer directives) to every machine in the cluster anytime a new box is added or removed in order for all of the siblings to know about each other.

Is there an easier way to coordinate the "discovery" of new siblings automatically?

An ideal situation would be to use a DNS hostname in the cache_peer line that resolves to multiple IPs and have squid re-resolve the hostname periodically and update the list of peers based on *all* the addresses associated with that name -- but from what i can tell squid will just picking a single address (DNS Round-Robin style).


Any advice or suggestions for managing peers like this would be appreciated.


-Hoss

Reply via email to