Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 Nov 2005 15:26:35 -0800
From:      Danny Howard <dannyman@toldme.com>
To:        DAve <dave.list@pixelhammer.com>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: Carp and Apache
Message-ID:  <20051104232635.GT18563@ratchet.nebcorp.com>
In-Reply-To: <435D5303.3030906@pixelhammer.com>
References:  <435D5303.3030906@pixelhammer.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Dave,

Yes.

The trick with CARP is that it is an IP-level heartbeat, so if you are
running Apache, you want to "carp up" after you start apache, and "carp
down" before you stop Apache.

>From some test boxes, web0:
ifconfig_fxp1="inet 192.168.1.210 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
cloned_interfaces="carp0 carp1"

Then, web0 application config file:
export CARP_PASS="mekmitasdigoat"
# MASTER
export CARP_carp0_IP=192.168.1.206
export CARP_carp0_VHID=1
# SLAVE
export CARP_carp1_IP=192.168.1.207
export CARP_carp1_VHID=2
export CARP_carp1_SKEW=100

Next, the Application "control" script:
# CARP
carp_ifs=`ifconfig -l | tr ' ' '\n' | grep carp`

# Set up CARP
for carp_if in $carp_ifs; do
        eval   carp_ip=\$CARP_${carp_if}_IP
        eval carp_vhid=\$CARP_${carp_if}_VHID
        eval carp_skew=\$CARP_${carp_if}_SKEW

        if [ -n "$carp_vhid" ]; then
                carp_vhid="vhid $carp_vhid"
        fi
        if [ -n "$carp_skew" ]; then
                carp_skew="advskew $carp_skew"
        fi

        if [ -n "${carp_ip}" -a -n "${carp_vhid}" ]; then
                ifconfig $carp_if pass "$CARP_PASS" $carp_vhid $carp_skew $carp_ip
                ifconfig $carp_if down
        else
                echo "WARNING: $carp_if but missing CARP_${carp_if}_IP or CARP_${carp_if}_VHID!"
        fi
done

[... later ...]
if [ $status -eq 0 ]; then
  echo "Apache successfully ${cmd}ed"
  echo "Ready to CARP UP!"
  if [ -n "${carp_ifs}" ]; then
        for carp_if in $carp_ifs; do
                eval   carp_ip=\$CARP_${carp_if}_IP
                eval carp_vhid=\$CARP_${carp_if}_VHID
                if [ -n "${carp_ip}" -a -n "${carp_vhid}" ]; then
                        ifconfig $carp_if up
                fi
        done
        sysctl net.inet.carp.preempt=1
  fi
else
  echo "Apache failed to $cmd"
  exit 2
fi


Okay, so that's really quite a mess, but basically:
* Set cloned_interfaces in rc.conf to create carp<n> at boot.
* One IP alias and VHID per CARP IP.
* Set up the backup server with higher advskew.
* For availability, teach you apachectl script to ifconfig the carp
  interfaces, ifconfig down, start apache, ifconfig up, and ifconfig
  down before stopping / restarting apache.

Cheers,
-danny

-- 
http://dannyman.toldme.com/



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20051104232635.GT18563>