Heartbeat & MON - Redundanz & Überwachung

From Q
Jump to navigation Jump to search

Heartbeat - Server Redundanz

Heartbeat wird dazu genutzt die Funktion eines Servers zu überwachen und bei Ausfall auf einen zweiten Server umzuschalten. Es wird unterschieden zwischen Masterserver und Standbyslave. Zwischen den beiden Servern wird ein

Heartbeat, also ein Herzschlag ständig ausgetauscht. Dabei kann die Frequenz dieses Herzschlags frei eingestellt werden. Antwortet der Masterserver nach einer definierten Zeit nicht auf einen Heartbeat des Standbyslaves, nimmt der Standbyslave an dass der Masterserver nicht verfügbar ist. Der Standbyslave übernimmt die Aufgaben des Masters und greift sich die virtuelle IP, auf der vorher der Masterserver erreichbar war. Dies bewirkt eine gleichbleibende Erreichbarkeit für die Clients, die Dienste auf dem Masterserver benutzen.

Heartbeat sorgt auch dafür, dass der Masterserver seine eigentlichen Aufgaben nach Funktionswiederherstellung neu aufnimmt, und der Standbyslave wieder in Bereitschaft geht.

Konfiguration von Heartbeat

Zuerst muss man sich entscheiden ob man einen seriellen Heartbeat oder einen Heartbeat über das lokale Netzwerk (Crosslink) wählt. Wenn man sich für die serielle Verbindung entscheidet, benötigt man ein Nullmodemkabel. Nach Anschließen des Kabels überprüft man mit folgenden Befehlen ob die serielle Verbindung funktioniert:

Auf dem Masterserver:

# cat < /dev/ttyS0

Auf dem Standbyslave:

# echo "hello heartbeat" > /dev/ttyS0

Man sollte sehen wie die Nachrichten vom Master geechot werden.

Man stellt die erste Maschine (Master) auf 172.17.10.10, die zweite (Slave) auf 172.17.10.20. Es ist sicherzustellen, dass beide Maschinen wissen wo sich die andere befindet. Dies wird durch einen Eintrag in der /etc/hosts erledigt.

Ein Auszug aus

File: /etc/hosts

172.17.10.10 master 
172.17.10.20 slave

(Wenn man zwei Netzwerkkarten in den Servern hat, kann man mit einem Crosslinkkabel wie oben erwähnt einen nicht-seriellen Heartbeat bereitstellen)

Man installiert Heartbeat sowohl auf dem Master, als auch auf dem Slave:
je nach Distribution:

# emerge heartbeat

oder,

# dpkg -i heartbeat-0.4.9.2-1.i386.deb

oder,

# apt-get install heartbeat

oder,

# rpm -i heartbeat-0.4.9.2-1.i386.rpm

oder,

# yum insall heartbeat

...

[Nicht die Version 1.0.1 verwenden, weil diese stontih, pils, udp-snmp, libcrypto.... benötigt ]

Man erstellt eine Datei /etc/ha/ha.cf (/var/log/ha-log) auf dem Master und auf dem Slave.


File: /etc/ha/ha.cf

logfile /var/log/ha-log
keepalive 2
deadtime 10
serial  /dev/ttyS0
node master
node slave

Zu beachten ist /etc/ha/haresources .Der Inhalt muss genau gleich sein auf Master und Slave. In der haresources wird die virtuelle IP festgelegt. Wenn der Slave diesen Eintrag sieht weiß er, dass er solange der Master verfügbar ist keinen Failover auslösen soll.
Zudem wird noch festgelegt welche Dienste gestartet bzw. beendet werden sollen, in dem Fall apache und mon.

File: /etc/ha/haresources

master 172.17.10.30 apache mon

Man erstellt /etc/ha/authkeys (Mit gleichem Inhalt auf beiden Nodes):

File: /etc/ha/authkeys

auth 1
1 crc

MON - Überwachung von Dienste

MON ist ein Diensteüberwachungs-Dämon. Er kann sämtliche Dienste Dateien Verzeichnisse oder sonst was auf Berechtigungen, Existenz oder Funktion... im Prinzip lässt sich mit MON ein kompletter Server kinderleicht überwachen. Natürlich schickt MON Mails oder unternimmt sogar selbst etwas gegen unerwünschte Probleme...

Installation

Man lädt hier http://www.kernel.org/software/mon die mon packages runter und befolgt alle Schritte sowohl auf dem Master, als auch auf dem Slave.

Die Installation der Pakete erfolgt in /etc/ha.d/mon

# cd /etc/ha.d
# tar xzvf mon-0.99.2.tar.gz
# mv mon-0.99.2.tar.gz mon

Mon setzt einige externe Perlmodule vorraus. Also benutzt man den nächstgelegenen CPAN Mirror oder benutzt folgende Links:

http://search.cpan.org/author/PRYAN/Period-1.20/

http://search.cpan.org/CPAN/authors/id/J/JH/JHI/Time-HiRes-1.42.tar.gz

http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Convert-BER-1.3101.tar.gz%20

http://search.cpan.org/CPAN/authors/id/T/TR/TROCKIJ/Mon-0.11.tar.gz%20

Die Packages werden entpackt und danach installiert:

CPAN Installation:

# cpan install Time::Period
# cpan install Time::HiRes
# cpan install Convert::BER
# cpan install Mon::Client


Manuelle Installation:

# perl Makefile.pl
# make
# make test
# make install

Konfiguration

Man erstellt eine /etc/ha.d/mon/mon.cf.

Dieses Script wird versuchen die /test.html vom Apache Webserver alle 30 Sekunden zu laden. Es versucht darüberhinaus den Router zu pingen, um zu testen ob eine Verbindung besteht oder unterbrochen ist. Man ersetzt die 172.17.10.254 mit der Routeradresse die man überwachen will, oder man kommentiert die ganze Routerüberwachung einfach aus, falls man das nicht möchte. operator@yourdomain.com wird mit der eigenen Emailadresse ersetzt.

Als ergänzender Kommentar lässt sich sagen, dass man mit der Pingüberwachung natürlich auch die generelle Verfügbarkeit eines Servers und somit auch von Asterisk überwachen kann.

In die mon.cf werden folgende Zeilen eingetragen:

File: /etc/ha.d/mon/mon.cf
cfbasedir   = /etc/ha.d/mon/etc
alertdir    = /etc/ha.d/mon/alert.d
mondir      = /etc/ha.d/mon/mon.d
statedir        = /etc/ha.d/mon/state.d
logdir = /var/log/
maxprocs    = 20
histlength = 100
randstart = 10s

authtype = getpwnam

hostgroup web-fe 172.17.10.30
hostgroup routers 172.17.10.254

watch web-fe
    service http
        interval 30s
        monitor http.monitor -p 80 -u /test.html
        allow_empty_group
        period wd {Mon-Sun}
            alert bring-ha-down.alert -S "web server node member down" \
operator@yourdomain.com
            upalert mail.alert -S "web server is back up" \
operator@yourdomain.com
            alertevery 600s
                alertafter 2
watch routers
    service ping
        interval 10s
        monitor ping.monitor
        allow_empty_group
        period wd {Mon-Sun}
            alert bring-ha-down.alert -S "node member NIC down" \
operator@yourdomain.com
            upalert mail.alert -S "web server is back up" \
operator@yourdomain.com
            alertevery 10s

Wie man in der alert section oben sehen kann, habe ich ein alert script definiert, welches bring-ha-down.alert heißt.

Man erstellt dieses Script hier: /etc/ha.d/mon/alert.d/bring-ha-down.alert. Es wird den mail alert aufrufen und dann

heartbeat auf dieser Node beenden. Man muss es ausführbar machen.

/etc/ha.d/mon/alert.d/bring-ha-down.alert

/etc/ha.d/mon/alert.d/mail.alert $* /etc/rc.d/heartbeat stop


An dieser Stelle kopiert man üblicherweise das ganze /etc/ha.d/mon Verzeichnis einfach auf den Slave.

Apache

Man ändert die httpd.conf (üblicherweise /usr/local/apache/conf/httpd.conf oder /etc/httpd/httpd.conf)und erstellt einen virtuellen Host wie folgt: (ersetzen mit passenden Einstellungen)

Aussschnitt von

File: httpd.conf
NameVirtualHost 172.17.10.30
<VirtualHost 172.17.10.30>
    ServerAdmin operator@yourdomain.com
    DocumentRoot /usr/local/apache2/htdocs/
    ServerName yourserver.yourdomain.com
    ErrorLog logs/test-errors_log
    CustomLog logs/test-access_log common
</VirtualHost>

Wenn diese Node aktiv ist, wird Apache auf 172.17.10.30 test.html lauschen.

Man erstellt ein test.html file im httproot, welchs den Text Master auf der Node1 und den Text Slave auf der Node2 enthält und setzt dieses in den webroot (/usr/local/apache/htdocs or similar).

Auf diese Weise kann man leicht erkennen, welche Node gerade aktiv ist.

Start scripts

Man erstellt /etc/ha.d/mon/mon-start.

File: /etc/ha.d/mon/mon-start

#!/bin/bash
MON_HOME=/etc/ha.d/mon

case "$1" in
    start)
        if [ -f $MON_HOME/mon.pid ]; then
                echo "mon already started"
                exit
        fi
        echo "Starting Mon"
    $MON_HOME/mon -c $MON_HOME/mon.cf -L $MON_HOME -P $MON_HOME/mon.pid &
        ;;
    stop)
    if [ -f $MON_HOME/mon.pid ]; then
    echo "Stopping Mon"
        kill -9 `cat $MON_HOME/mon.pid`
        rm  -f $MON_HOME/mon.pid
    else
        echo "no server pid, server doesn't seem to run"
    fi

    ;;
    status)
        echo "doing good"
        ;;
    *)
    echo "Usage: $0 {start|stop|status|reload|restart}"
    exit 1
esac
exit 0

Während des Startvorgangs wird Heartbeat in /etc/rc.de/init.d oder /etc/ha.d/resource.d nach seinen Resourcescripts suchen. In /etc/ha.d/resource.d sind Links zu erstellen

# cd /etc/ha.d/resource.d
# ln -s ../mon/mon-start mon
# ln -s /etc/rc.d/apache apache

Gut, jetzt weiß Heartbeat wie es mon und apache starten und stoppen kann. Man muss überprüfen ob man Startscripts ähnlich diesem hat: start scripts

Den Cluster starten

Jetzt wo Heartbeat konfiguriert ist, wird es apache und mon auf dem Master starten. Auf dem Slave wird Heartbeat bei laufendem Master gestartet wodurch es automatisch in den Standby geht und geduldig wartet bis der Master down geht und der Slave zu seinem Auftritt kommt.

# /etc/rc.d/heartbeat start

Man führt denselben Befehl auf dem Slave aus

Man schaut sich den Log des Masters an /var/log/ha-log. Folgender ist ein guter Log:

/var/log/ha-log

heartbeat: ... info: Configuration validated. Starting heartbeat 0.4.9.2
heartbeat: ... info: heartbeat: version 0.4.9.2
heartbeat: ... info: Heartbeat generation: 7
heartbeat: ... notice: Starting serial heartbeat on tty /dev/ttyS0
heartbeat: ... info: Local status now set to: 'up'
heartbeat: ... info: Local status now set to: 'active'
heartbeat: ... info: Heartbeat restart on node master
heartbeat: ... info: Node master: status up
heartbeat: ... info: Running /etc/ha.d/rc.d/status status
heartbeat: ... info: Running /etc/ha.d/resource.d/IPaddr 172.17.10.30 status
heartbeat: ... info: Node master: status active
heartbeat: ... info: Resource acquisition completed.
heartbeat: ... info: Running /etc/ha.d/rc.d/status status
heartbeat: ... info: Running /etc/ha.d/rc.d/ip-request ip-request
heartbeat: ... info: Running /etc/ha.d/resource.d/IPaddr 172.17.10.30 status
heartbeat: ... info: Acquiring resource group: master 172.17.10.30 apache mon
heartbeat: ... info: Running /etc/ha.d/resource.d/IPaddr 172.17.10.30 start
heartbeat: ... info: ifconfig eth0:0 172.17.10.30 netmask 255.255.0.0  \
 broadcast 172.17.255.255
heartbeat: ... info: Sending Gratuitous Arp for 172.17.10.30 on eth0:0 [eth0]
heartbeat: ... info: Running /etc/ha.d/resource.d/apache  start
heartbeat: ... info: Running /etc/ha.d/resource.d/mon  start

Hier sind einige häufigere Troubleshooting Scenarios:

heartbeat: ... ERROR: Bad permissions on keyfile [/etc/ha.d/authkeys], 600 recommended.

Fehlerbehebung durch chmod 600 /etc/ha.d/authkeys

heartbeat: ... ERROR: Current node [mastah] not in configuration

Überprüfung des Hostnames notwendig, welcher identisch sein muss mit dem der in /etc/ha.d/ha.cf und /etc/ha.d/haresources definiert wurde.

heartbeat: ... Cannot locate resource script apache heartbeat: ... Cannot locate resource script mon

Es ist sicherzustellen dass in /etc/rc.d/init.d oder /etc/ha.d/resource.d Startscripte vorhanden sind, die das Start/Stop Argument nehmen und ausführbar sind. Vielleicht sollte man die Scripte manuell ausprobieren.

Wenn mon Heartbeat sofort beendet, bedeutet das möglicherweise dass man den http ping oder router ping nicht richtig konfiguriert hat und mon daher denkt, dass keine Antwort kommt.

Man muss überprüfen dass Heartbeat die virtuelle IP Adresse hochbringt. Folgendermaßen sollte der Master aussehen:

# ifconfig -a
eth0:0    Link encap:Ethernet  HWaddr ....
          inet addr:172.17.10.30  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:11 Base address:0x1000