Backup des Routers

Der Router stellt die zentrale Netzwerkkomponente mit vielerlei Funktionalität dar. Ein Ausfall dieser Komponente ist zwar nicht wirklich tragisch, aber die bösen Kommentare aus der Familie häufen sich mit der Dauer eines solchen Ausfalls. Und richtig ist ja auch, dass das Internet für die gesamte Familie eine beständig wichtiger werdende Rolle einnimmt.

Lange Rede, kurzer Sinn: Es schien mir lohnend zu sein, den gesamten Router redundant auszulegen. Das leichteste Form der Redundanz ist die Verdoppelung des Rechners, der als Router dient. Und so habe ich mir zwei identische Siemens Scenic xB PIII zugelegt. Alle Komponenten wurden ebenfalls doppelt identisch ausgelegt, insbesondere natürlich die Festplatten. Die Verbindung zwischen den beiden Rechnern erfolgt über drei Kabel:

  1. Über ein Stromkabel: Der sekundäre Rechner hängt am Netzteil des primären, kann also immer nur dann angeschaltet werden, wenn der primäre läuft - exakt das, was wir brauchen...
  2. Über ein serielles Kabel: Dieses dient dazu, den sekundären Rechner aufzuwecken. Er ist wie der primäre per BIOS so konfiguriert, dass er bei Aktivität auf der seriellen Schnittstelle startet. (Man beachte, dass auf dem primären Rechner die erste ser. Schnittstelle durch das Modem belegt ist. Für die hier benötigte Verbindung braucht man also eine weitere ser. Schnittstelle, die der Scenic aber mit an Board hat.)
  3. Über ein crossover-Ethernetkabel, welches die jeweils zweite Netzwerkkarte (eth1) der beiden Rechner miteinander verbindet. Die Transferrate beträgt dabei sinnvollerweise mindestens 100MBit/s.

Damit steht das physische Backup vollständig zur Verfügung, bleibt das datentechnische.

Einsatz des Backups

Das Backup wird folgendermaßen gestartet: Die ISDN-Telefonanlage ruft jede Nacht den ASCOM-Teleswitch an und startet damit den Router (s. Beschreibung des Stromsparers). Ausgenutzt wird dabei die Weckfunktion der Auerswald Telefonanlage.

Der primäre Rechner prüft, ob der Zeitpunkt, zu dem er gestartet wurde, zwischen 4:00 und 4:59 liegt. Wenn ja, startet er über die serielle Verbindung der beiden Scenics den sekundären Rechner. Dieser erledigt dann den Rest. Nach Beendigung des Datentransfers schaltet sich der sekundäre Rechner wieder ab. Der primäre verzeichnet dann keine Netzwerkaktivität mehr und schaltet sich wie unter "Stromsparer" beschrieben selbstständig ab.

Kopie der Daten

Die Daten des primären Rechners werden per rsync auf den sekundären transferiert. Natürlich soll das automatisch geschehen (nämlich nachts, wenn ansonsten keine Aktivität auf dem Router zu erwarten ist) und nachvollziehbar in dem Sinne, dass man einfach prüfen kann, ob alles glatt lief. Zu diesem Zweck werden nach dem Transfer die Log-Daten, die der sekundäre Rechner sammelt, auf den primären zurück gespiegelt. Insgesamt sind damit beide Rechner so identisch wie nur irgend möglich.

Hier nun das Programm mocs (my own computer synchronization), welches in die normale init-Prozedur über

-rwxr-xr-x  1 root root 3214 2006-12-08 20:26 init.d/mocs
lrwxrwxrwx  1 root root   14 2006-06-17 00:26 rc2.d/S99mocs -> ../init.d/mocs

eingebunden wurde. Die Idee dabei: Die Existenz einer bestimmten Datei sagt dem Programm, ob es als Master oder als Client aufgerufen wurde. Dabei ist der Master der passive Teil, der nur die Aufgabe hat, den Client zu wecken. Letzterer "saugt" dann die Daten vom Master. Die Datei, die das Verhalten steuert, heißt /var/lib/mocs/i_am_the_client. Diese sollte logischerweise eben nur auf dem Client existieren.

Wenn der Client nun geweckt wird und seine normale Startprozedur durchläuft, kommt er an deren Ende zu mocs und beendet erst mal alle seine Dienste wieder (STOPSERVICES). Sodann kopiert er per rsync alle Daten (mit wenigen Ausnahmen unter RSYNCFILTER) vom Master zu sich. Abschließend wird - wiederum per rsync - das Verzeichnis /var/lib/mocs auf den Master zurück gespiegelt, damit wir dort die erwähnte Möglichkeit des Erfolg Prüfens haben.

Hier nun das kleine Script:

#
# my own computer synchronization
#
# es gibt zwei Möglichkeiten für den ausführenden Rechner:
# entweder ist er Master oder aber er ist Client.
# Entschieden wird dies anhand der Existenz der Datei
# /var/lib/mocs/i_am_the_client
# Der Master ist der Hauptrechner, den es zu kopieren gilt. Er
# verhält sich hier passiv.
# Der Client jedoch kopiert die seit dem letzten Lauf angefallenen
# Änderungen zu sich herüber. Damit sollte man immer gewährleisten
# können, dass beide Rechner identisch sind. Sie sind dann aber auch
# vollkommen identisch - mit Ausnahme der Dateien/Verzeichnisse, die
# in der Exclusion-Liste (RSYNCFILTER) gefhrt werden.
#
# Vor dem Kopieren werden die Prozesse in $STOPSERVICES beendet.
# Es handelt sich dabei um die Services in /etc/init.d. Die Stop-
# Reihenfolge ist gemäß der Auflistung
#

MOCS=mocs
CLIENTIP="10.0.0.13"
SERVERIP="10.0.0.12"
LIBDIR=/var/lib/$MOCS
RUNFILE=$LIBDIR/pid
LOGFILE=$LIBDIR/lastlog
ERRFILE=$LIBDIR/errlog
RESFILE=$LIBDIR/result
SWITCHER=$LIBDIR/i_am_the_client
###------- hier ggf. anpassen, wenn die Struktur sich ändert ----------
RSYNCFILTER="--exclude=lost+found/ --exclude=/proc --exclude=/sys --exclude=/tmp --exclude=$LIBDIR --exclude=/dev/pts"

STOPSERVICES="apache2 ASCOMkeepalive atd bacula-fd bind9 capi4hylafax capiutils courier-authdaemon courier-imap cron dhcp3-
server fetchmail hotplug hotplug-net hylafax inetd isdnutils klogd lpd lwresd mysql netatalk nfs-common nfs-kernel-server n
tp-server portmap postfix postgresql ppp samba shorewall spamassassin sudo sysklogd wnt xfree86-common"
###--------------------------------------------------------------------


startclient() {
        # Client aufwecken zwischen 4:00 und 4:59 (morgens)
        HOUR=`date +%k`
        test $HOUR -eq 4 && echo a >/dev/ttyS1
}

stopprocesses() {
        for service in $STOPSERVICES; do
                /etc/init.d/$service stop >>$LOGFILE 2>>$ERRFILE
        done
}

changemyip() {
        ifconfig eth1 up $CLIENTIP >>$LOGFILE 2>>$ERRFILE
        ethtool -s eth1 autoneg off duplex full speed 100 >>$LOGFILE 2>>$ERRFILE
        ethtool eth1 >>$LOGFILE
        hostname klang
}

noserver() {
        MSG="

    This has been mocs -- you can stop me by deleting $SWITCHER
            "
        echo "$MSG" >/dev/tty1
        echo "$MSG" >/dev/tty2
        echo "$MSG" >/dev/tty3
        exit 1
}


waitforserver() {
        MSG="

   This is mocs -- you can stop me by deleting $SWITCHER

            "
        echo "$MSG" >/dev/tty1
        echo "$MSG" >/dev/tty2
        echo "$MSG" >/dev/tty3

        TIMEOUT=60
        TIMEWAIT=5
        WAITCNT=`expr $TIMEOUT / $TIMEWAIT`
        RES=1
        CNT=0
        while [ ! $RES -eq 0 ]; do
                ping -c 1 $SERVERIP >/dev/null 2>&1
                RES=$?
                CNT=`expr $CNT + 1`
                test $CNT -gt $WAITCNT && noserver
                sleep $TIMEWAIT
        done

        # wir hätten gerne die aktuelle Zeit
        ntpdate $SERVERIP
}

copystuff() {
        >$LOGFILE
        >$ERRFILE
        stopprocesses
        changemyip
        waitforserver
        rsync -azv $RSYNCFILTER --delete $SERVERIP:/ / >>$LOGFILE 2>>$ERRFILE
        echo $? >$RESFILE
        date >>$RESFILE
        rsync -az --exclude=`basename $SWITCHER` --delete $LIBDIR/ $SERVERIP:$LIBDIR
        halt
}

case $1 in
        start)  if [ ! -d $LIBDIR ]; then mkdir $LIBDIR; fi
                if [ -f $SWITCHER ]; then copystuff;
                else startclient;
                fi
                ;;
        stop)   ;;
        *)      echo "usage: $0 [start|stop]" >&2;;
esac

Im Fall des Falles, wenn also der sekundäre Rechner den primären ersetzen soll, müssen folgende Aktionen ausgeführt werden:

  1. Alle Kabel des primären Rechners müssen auf den sekundären umgesteckt werden.
  2. Die Datei /var/lib/mocs/i_am_the_client muss gelöscht werden.

(Nach Wiederinstandsetzung des primären Rechners kann er als sekundärer eingesetzt werden. Die Datei /var/lib/mocs/i_am_the_client muss dann wieder erzeugt und die drei Kabel zu ihm gelegt werden.)

Einschränkungen

Man sollte sich im Klaren sein, dass die vorliegende Form des Backups nicht zu einer 100% garantierten Datensicherung führt und dass damit keine Hochverfügbarkeitslösung existiert.

Sollte während des Datensicherungsvorgangs von einem auf den anderen Rechner der Blitz einschlagen, sind im Zweifel alle Festplatten hinüber und man hat statt einer Datendopplung gar nichts mehr. Außerdem hat man natürlich auf jeden Fall die Zeitverzögerung zwischen Datenerzeugung und deren Kopie auf das Backupsystem von ca. einem halben Tag. Sollte das primäre System tatsächlich abrauchen, sind die neuesten Daten futsch. Wenn man sich über beides im Klaren ist, kann man sich aber durchaus bewusst für eine solche Lösung entscheiden. Besonders dann, wenn die Kiste nicht wirklich als Fileserver dient, wie das bei uns der Fall ist.

Auch eine Hochverfügbarkeit ist nicht gegeben. Aber im Zweifel kann man durch Umstecken der Kabel innerhalb weniger Minuten auf den Ersatzrechner umswitchen. Während dann der Backup-Rechner im Einsatz ist, kann der primäre Rechner wieder instand gesetzt werden. Das gilt im Übrigen auch z.B. für ein Betriebssystemupdate.