Heartbeat & MON - Redundanz & Überwachung
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:
Auf dem Standbyslave:
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
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:
oder,
oder,
oder,
oder,
...
[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.
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.
master 172.17.10.30 apache mon
Man erstellt /etc/ha/authkeys (Mit gleichem Inhalt auf beiden Nodes):
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
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:
Manuelle Installation:
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:
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
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.
#!/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
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.
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