CARP on backup doesn't relinquish MASTER
Rudy Rucker
crapsh at monkeybrains.net
Tue Jun 12 23:08:52 UTC 2007
I noticed that if I reboot a server that is the MASTER, the carp0 on the
BACKUP box goes into MASTER mode and stays that way -- even when the
real master machine has finished rebooting. Is this a desired trait to
prevent CARP from switching IPs out of control?
Any how, I wrote a cronjob that runs once an hour on the slave. If if
finds itself in the MASTER mode on a carp device, it up/down's the
interface to get it back into the BACKUP mode.
Rudy
#!/bin/sh
#
------------------------------------------------------------------------------
# should_be_backup_carp.sh
#
------------------------------------------------------------------------------
# Check to make sure a carp device is in the backup state.
# Run this as an hourly CRON on the 'backup' machine.
#
# If the Backup machine is found in the 'MASTER' state, this script will
cycle
# the CARP device in an attempt to let the other device regain MASTER
status.
# (for some reason, when the MASTER reboots, it does not reassert itself as
# the MASTER on my system.)
#
# If you accidentally install this script on the MASTER server, you will get
# some not so good results. :)
#
# THIS SOFTWARE IS PROVIDED BY Rudy ``AS IS'' AND WARRANTIES ARE DISCLAIMED.
# Rudy Rucker, Jr. - 2007
# Usage:
# Check carp0 (default) only:
# 0 * * * * /path/should_be_backup_carp.sh
# Check multiple devices:
# 0 * * * * /path/should_be_backup_carp.sh carp0 carp2 ...
#
------------------------------------------------------------------------------
if [ -n "$1" ]; then
for D in $@; do
_DEV=$D
export _DEV
$0
done
exit;
fi
DEV=${_DEV:=carp0}
#DEBUG=YES
STATE=`/sbin/ifconfig ${DEV:?"Error you must define a DEV"} 2> /dev/null
| /usr/bin/grep vhid | /usr/bin/awk '{print $2}'`
STATE=${STATE:?"Error finding state for $DEV."}
if [ $STATE = 'MASTER' ]; then
echo "${HOST:=`/bin/hostname`} is $STATE on $DEV."
echo "This script is going to cycle interface in attempt to relinquish
MASTER status."
echo "If this is not desired on $HOST, remove $0 from the crontab."
echo
echo "IFCONFIG before cylce:"
/sbin/ifconfig $DEV
/sbin/ifconfig $DEV down;
sleep 3;
echo
echo "IFCONFIG during cylce:"
/sbin/ifconfig $DEV
/sbin/ifconfig $DEV up;
sleep 3;
echo
echo "IFCONFIG after cylce:"
/sbin/ifconfig $DEV
elif [ $STATE != 'BACKUP' ]; then
echo "Something is ill configured with $0"
echo "${HOST:=`/bin/hostname`} is $STATE on $DEV."
echo
echo "I don't know what the state '$STATE' is all about."
elif [ -n "$DEBUG" ]; then
echo "${HOST:=`/bin/hostname`} is $STATE on $DEV."
fi
More information about the freebsd-net
mailing list