I understand that, to get failover on an HAProxy load balancing setup, you need two machines running HAproxy (and route it to several webserver instances). But in this case, say abcd.com, how do we split/route this traffic to 2 IP addresses instead of one? DNS usually resolves domain names to a single IP. How do we do this in using free/cheap tools/services?
If you have so much load that you need to load balance across two haproxy instances then DNS round robin isn't a bad idea (I would be surprised if you have this load though). DNS round robin won't provide good failover though.
At Stack Overflow we use
heartbeat to provide a single virtual IP, this IP is active on only one haproxy host at a time (if it goes down, the other takes over this IP). You could use heartbeat to have an IP on each machine and then DNS round robin between the two. If one were to fail, then the other would have both of those IPs.
HAProxy is using about 1-5% CPU on our physical server to balance our traffic which has a single
Intel(R) Xeon(R) CPU E5504 @ 2.00GHz. So HAProxy can generally handle a lot of traffic easily.
As Kyle says, heartbeat can be used to make two haproxy servers act as a fail-over pair. However whilst many people do use heartbeat for the job, keepalived is suggest by haproxy's author.
He outlines the details on the haproxy mailing list: http://www.formilux.org/archives/haproxy/1003/3259.html
In brief it goes like this:
heartbeat is cluster oriented. It ensure only one server has access to a resource (i.e. SAN storage)
keepalived is network oriented. It ensures that at least one server has the IP in question.
You might find what you are looking for here: http://blog.haproxy.com/2014/01/17/emulating-activepassing-application-clustering-with-haproxy/