Einleitung
Eines der Features von Nagios is die Fähigkeit Dienst-Überprüfungen parallel auszuführen. Dieses Kapite der Dokumentation versucht im Detail zu erklären, was dies bedeutet und wie es die definierten Dienste beeinflusst.
Wie parallele Überprüfungen funktionieren
Bevor man erklären kann, wie parallele Überprüfungen funktionieren, muss man zuerst ein bisschen davon verstehen, wie Nagios Ereignisse plant. Alle interne Ereignisse in Nagios (z.B. Rotation der Log-Datei, Überprüfung von externen Befehlen, Dienst-Überprüfungen, usw.) werden in einer Warteschlange platziert. Für jeden Eintrag in dieser Ereignis-Warteschlange wird die Ausführung zu einem angegebenen Zeitpunkt geplant. Nagios tut sein bestes, um sicherzustellen, dass alle Ereignisse genau dann ausgeführt werden, wenn sie es sollen. Trotzdem kann es passieren, dass sich die Ausführung verzögert, wenn Nagios noch mit einem anderen internen Ereignis beschäftigt ist.
Dienst-Überprüfungen ist eine Art von Ereignissen, die über die Ereignis-Warteschlange von Nagios geplant werden. Wenn es an der Zeit ist eine Dienst-Überprüfung auszuführen, startet Nagios (über den fork()-Aufruf) einen neuen Prozess, damit dieser den Dienst (z.B. über irgendein Plugin) überprüft. Nagios wartet allerdings nicht auf die Beendigung der Dienst-Überprüfung! Stattdessen geht Nagios sofort zu dem nächsten Dienst über, der sich in der nächsten Position der Warteschlange befindet.
Was passiert also, wenn eine Dienst-Überprüfung fertig ausgeführt wurde? Der Prozess der von Nagios für die Überprüfung gestartet wurde sendet eine Nachricht an Nagios zurück, die das Ergebnis der Dienst- Überprüfung enthält. Anschliessend ist es an Nagios das Ergebnis der Dienst-Überprüfung zu überprüfen und zu verarbeiten, wenn der nächste Zeitpunkt dafür ist.
Damit Nagios überhaupt irgendwelche Überwachungen durchführen kann, muss es die Ergebnisse der Dienst-Überprüfungen
die fertiggestellt wurden verarbeiten. Dies wird von einem Dienst, dem sogenannten "service reaper", erledigt.
"Service Reaper" sind eine Art von Ereignissen, die durch die Warteschlange von Nagios geplant werden. Die Frequenz
mit der die Reaper-Ereignisse werden durch die service_reaper_frequency-Option
in der Haupt-Konfigurationsdatei festgelegt.
Wenn ein Reaper-Ereignis ausgeführt wird, überprüft es ob irgendwelche Nachrichten existieren, die das Ergebnis
einer Dienst-Überprüfung enthalten. Dieser Ergebnisse der Dienst-Überprüfungen werden anschliessend von dem Kern
der Dienst-Überwachungs-Logik verarbeitet.
An dieser Stelle erkennt Nagios, ob z.B. Host-Überprüfungen ausgeführt oder Benachrichtigungen versandt werden
müssen. Wenn das Ergebnis der Dienst-Überprüfung verarbeitet wurde, plant Nagios den Zeitpunkt der nächsten
Überprüfung und platziert die Überprüfung in der Warteschlange.
Der letzte Schritt vervollständigt den Zyklus der Dienst-Überprüfungen!
For diejenigen, die es genauer wissen wollen, aber nicht in den Quellcode geschaut haben; Nagios benutzt "message queues" um die Kommunikation zwischen Nagios und den Prozessen die die Überprüfungen ausführen zu ermöglichen.
Potentielle Stolperfallen...
Man sollte realisieren, das es einige potentielle Stolperfallen gibt um Dienst-Überprüfungen parallel auszuführen. Da durch die Parallelisierung mehr als nur eine Überprüfung zur gleichen Zeit laufen können, können sich diese u.U. gegenseitig behindern. Man muss sich die Arten der Überprüfungen genauer anschauen, um die richtigen Schritte zu unternehmen, um eventuelle Abarten im Betrieb zu erkennen. Dies ist z.B. wichtig, wenn man mit mehr als einer Überprüfung parallel auf Hardware (z.B. ein Modem) zugreifen will. Genauso sollte darauf geachtet werden, dass ein entsprechender Daemon parallele Verbindungen unterstützt, wenn z.B. durch parallele Überprüfungen gleichzeitig auf einen entfernten Host mit Hilfe eines Daemons zugegriffen wird.
Glücklicherweise gibt es ein paar Dinge, die man unternehmen kann, damit einige Typen von Überprüfungen nicht miteinander kollidieren...
Ausserdem sollte man beachten, wie parallele Dienst-Überprüfungen die lokalen System-Ressourcen auf dem Host,
auf dem Nagios installiert ist, beeinflussen. Führt man zu viele Dienst-Überprüfungen parallel aus kann dieses
die CPU und den Speicher vielleicht zu stark fordern. Die inter_check_delay_method
versucht die Last auf der Maschine gleichmässig zu halten, indem die Überprüfungen gleichmässig über einen
Zeitraum verteilt werden (wenn man hier die "smart"-Methode benutzt), doch dies ist keine Garantie für ein
gutes Lastverhalten des Monitoring-Servers. Um kontrollieren zu können, wie viele Überprüfungen parallel
laufen dürfen, nutzt man die max_concurrent_checks-Variable.
Mit diesem Wert sollte man ein bisschen, auf Basis der Gesamtanzahl der zu überwachenden Dienste, den zur
Verfügung stehenden System-Ressourcen und anderen Prozessen die auf dem gleichen Server laufen, herumprobieren.
Weitere Informationen wie man den ideealen Wert für die max_concurrent_checks-Variable für das eigene
Setup herausfindet, findet man in dem Dokumentations-Kapitel über die
Planung der Dienst-Überprüfungen.
Was wird nicht parallel ausgeführt?
Es ist wichtig sich daran zu erinnern, dass ausschliesslich die Ausführung von Dienst-Überprüfungen parallelisiert werden können - und zwar aus einem guten Grund. Andere Teile von Nagios können in keiner sicheren Art und Weise parallel ausgeführt werden. Vor allem Event-Handler, Kontakt-Benachrichtigungen, die Verarbeitung der Ergebnisse der Dienst-Überprüfungen und Host-Überprüfungen können nicht parallelisiert werden. Aus den folgenden Gründen:
Event Handler werden aufgrund ihres Zwecks nicht parallel ausgeführt. Ein Grossteil der Macht von Event Handlern liegt in der Fähigkeit proaktiv Probleme zu lösen. Ein Beispiel ist z.B. der erneute Start des Web-Servers, wenn der HTTP-Dienst nicht mehr verfügbar ist. Um zu verhindern, dass mehrere Event Handler parallel (ohne Kenntnis von dem jeweils anderen Event Handler) versuchen das gleiche Problem zu beheben, wurden Event Handler nicht parallelisiert.
Benachrichtigungen erfolgen auch nicht parallel, aufgrund der möglichen Benachrichtigungs-Methoden,
die evtl. eingesetzt weden. Falls eine Benachrichtigung z.B. eine Nachricht über ein Modem versendet,
benötigt dieses einen exklusiven Zugriff aud das Modem, während die Benachrichtigung erfolgt. Falls nun
mehrere dieser Benachrichtigungen parallel ausgeführt würden, würde nur eine Benachrichtigung erfolgreich
abgeschlossen werden, da alle anderen Benachrichtigungs-Prozesse kein Zugriff auf das Modem gehabt hätten.
Es gibt zwar wege um dieses herumzukommen, z.B. indem an eine "abwarten und erneut versuchen"-Methode
in das Benachrichtigungs-Skript implementiert. Ethan Galstad hat sich aber dafür entschieden, sich nicht
darauf zu verlassen, dass die User das dafür nötige Feature in ihren Skripten implementiert haben.
Ein schneller Hinweis:
falls Dienst-Überprüfungen über ein Modem ausgeführt werden, sollte man sicherstellen, dass die Skripte für
die Benachrichtigung eine Möglichkeit haben den Zugriff auf das Modem mehrfach zu versuchen. Dies ist nötig,
da u.U. eine Dienst-Überprüfung zu dem gleichen Zeitpunkt ausgeführt wird wie eine Benachrichtigung über
ein Modem!
Verarbeitung von Ergebnissen von Dienst-Überprüfungen wurde nicht parallelisiert. Dies wurde so entschieden um Situationen zu verhinden, in denen parallele Benachrichtigungen darüber versandt werden, das ein Host down geht, unerreichbar oder wiederhergestellt wird.