github keyoxide mastodon linkedin email
Using Heartbeat to Share a Single Virtual IP (VIP) Between Two Servers
May 5, 2012
2 minutes read

Just did a high availability cluster setup a few weeks ago and though the web servers use the traditional heartbeat/ldirectord setup, there needed to be high availability between the two master/master database servers as well.

Yes, this can be done with ldirectord for MySQL, but if you also have other services like Memcached, or Redis, etc, you may just want to share a VIP between the servers.

This is especially true if you’re connecting to these servers internally. Connecting via the VIP will only connect to one server, so this is not a load-balancing setup, but rather simply a high availability solution (failover).

You just need to install heartbeat and add lines in /etc/hosts with each node’s real address (so they can talk to each other without DNS lookups and also so they use the right interface if it’s an actual resolving hostname that routes to a different one). Then configure the following files in /etc/ha.d:

authkeys:

auth 1
1 sha1 SoMeSeCrEtYoUcAnUsEtOkEePsAfE

This is just a key that authenticates other hosts. It must remain the same between all servers.

ha.cf:

logfacility     local0
auto_failback on
keepalive 2
deadtime 10
udpport 694
ucast eth0 db2.yourhostname.com
node    db1.yourhostname.com
node    db2.yourhostname.com

Here you specify options that determine things such as:

  • Automatically falling back to first host (auto_failback)
  • Delay between heartbeats (keepalive)
  • Amount of failed heartbeat time before server takes the IP (deadtime)
  • Port to connect on - no reason to change this (udpport)
  • Host to look for and what interface to use to connect (ucast)
  • Nodes within the cluster (can also be specified on one line for ugly configs)
haresources:
db1.yourhostname.com 200.200.200.200/26/eth0
This file should match on both hosts and contains the hostname (uname -n) of the main server followed by the shared IP (VIP)/prefix/interface. Normally, you include the actual resource which should be monitored at the end of the line. Since you're just moving an IP back and forth for this setup, you can leave the last field blank.

NOTE: Don’t forget to make your services listen on 0.0.0.0 !


Back to posts