Skalierbarkeit und Hochverfügbarkeit sind zwei Themen, bei denen Wunschvorstellung und Realität oft weit auseinanderdriften. Nagios und Icinga mitsamt einer ganzen Phalanx an Erweiterungen werden in diesem Vortrag unter die Lupe genommen. Dabei sollen mit Fokus auf genannte Themen deren Möglichkeiten, aber auch deren Grenzen aufgezeigt werden. Vorgestellt werden Szenarien mit und ohne Cluster-Software so wie auch Stolpersteine beim Einsatz selbiger. Unter die Lupe genommen werden Verursacher von Engpässen, System- und I/O-Last. Gezeigt wird dabei, welche Auswirkungen diese in großen Szenarien haben - und wie sich deren Einfluss verringern lässt.
Der Vortrag will nicht zuletzt auch einen Blick über den Tellerrand hinaus wagen, ein Denkanstoß für die weitere Entwicklung sein und auch der Frage nach der Realisierbarkeit von Umgebungen mit Millionen von Servicechecks nachgehen.
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
OSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas Gelf
1. Monitoring at large
Die Welt ist nicht genug
OSMC 2011
Referent: Thomas Gelf
Nürnberg, 29.11.2011
2. Ich und mein Job
Was Handfestes, Sicheres
An der frischen Luft
3. Thema: Skalierbarkeit und Hochverfügbarkeit
Schwerpunkt: Nagios/Icinga
Probleme und Grenzen derselben
Vergleich mit dem Mitbewerb
Ziel dieser Präsentation:
– Anregungen liefern
4. Kampf zwischen zwei Fronten
Beim Kunden
vertrete ich eine
OSS-Lösung
In den OSS-
Projekten vertrete
ich den Kunden
7. Neue alte Ansätze
Verworfene oder
vergessene Ideen, Ansätze
und Methoden müssen
nicht immer schlecht sein
Dumm darf man sein, man
muss sich nur zu helfen
wissen...
...besonders wenns mal
irgendwo klemmt und
kratzt
16. Erster Schritt: Systemtuning
Man sollte seine Hardware kennen
Wichtig für Nagios und Icinga:
– Disk I/O
– Fork Performance
– Und natürlich: RAM. Vor allem wenn IDO/NDO zum
Einsatz kommt
17. Disk I/O
Es geht nichts über viele Spindeln, die an einem
schnellen batteriegepufferten Controller in einem RAID
10 am lokalen Bus hängen
Controller-BIOS
Passender I/O-Scheduler im Kernel
– Per Kernel-Parameter (elevator)
– Pro device im SYS Filesystem
18. Schneller Überblick: Durchsatz und Latenzen
Kein Benchmark, aber erste Werte mit Aussagekraft:
~ # hdparm t /dev/sda
Timing buffered disk reads: 1134 MB in 3.00 seconds = 377.48
MB/sec
~ # dd if=/dev/zero of=/root/tomtest bs=512 count=1000
oflag=direct
1000+0 Datensätze ein
1000+0 Datensätze aus
512000 Bytes (512 kB) kopiert, 0,0786434 s, 6,5 MB/s
19. Fork performance
Sollte man messen, um Vergleichswerte zu haben
Kann die Ursache von Performance-Problemen in Vms
sein
Quick & Dirty Beispiele:
while true ; do date ; done | uniq c
for i in 1 2 3 4 5; do taskset c 0 spawn 5; done
Immer nur im Vergleich interessant!
20. Problem: Shell Skripts
"Ich benutze doch nicht Perl, wenn ich es mit einem
Shellskript..."
for i in `seq 1 24`; do
XY=`snmpget ... | grep ... | wc l`
OUT="$OUT, $XY"
Verschärft das Problem
Aber: es gibt auch Perl-Checks, die `snmpwalk ...`
nutzen
21. Regelmäßige Benchmarks ein- und durchführen
Benchmarking neuer Hardware-Plattformen
Benchmarking in unterschiedlichen Konfigurationen
Ergebnisse zum Vergleichen aufbewahren
Mein Favorit: Phoronix Test Suite
23. Der Reaper ist ein Problem...
...das andere nicht haben
Shinken macht es vor!
Es gibt mittlerweile auch einen Lösungsansatz dafür im
Icinga-GIT
Dazu später mehr
24. Wieviel kann ich eigentlich rausholen?
Faire Benchmarks sind schwierig
Glaube keinem, den du nicht selbst...
cached_*_check_horizon
Man kann's auch übertreiben:
26. Hochverfügbarkeit
Im Grunde simpel. Eine Variante:
– Zwei System überwachen sich gegenseitig
– Beide nutzen dieselbe Konfiguration
• Eines pollt aktiv, ein Eventhandler aktiviert/deaktiviert
die eigenen Checks
• Oder auch: beide immer aktiv, nur die Notifications
werden ein- und ausgeschaltet
Elegantere Lösungen in Merlin, Shinken...
27. HA-Cluster
Vereinfacht den Failover, der Cluster macht alles
Verkompliziert alles, man muss den Cluster verstehen
Pacemaker / Corosync, andere
Shared Storage nötig, DRBD oder ClusterFS
So viel wie möglich immer auf allen Knoten aktiv!
So wenig I/O als möglich auf dem Shared Storage
– RRDs
– retention.dat, object.cache
28. Datenbank hat eigene Replikationsmechanismen
Es macht Sinn, diese zu benutzen
Für jeden Master kann ein ido2db Daemon ständig
laufen
idomod findet bei einem Clusterschwenk schon einen
laufenden Daemon vor
29. Aktive Checks skalieren nicht...
…aber auch Umgebungen mit rein passiven Checks
stoßen an Grenzen
Mit NDO/IDO noch früher
30. Mehrere Instanzen pro Server
Mehrere kleine Icingas arbeiten besser als ein großer
Passive Check-Ergebnisse werden in einen „zentralen“
gekippt
Lässt sich mit LConf schön steuern
31. Der Scheduler
In der Nagios/Icinga-Welt zentral
Wird von Shinken besser gelöst
32. Neue Ansätze: icingamq
Verteilt Checks über X Check-Daemons
Hierarchien sind möglich
Entlastet den Core
Noch pre-beta Status
33. Was man mit icingamq noch so anstellen könnte
Man erhält alle Events aus dem Core
Eine Graphing-Lösung könnte sich an den Bus hängen
Damit entfällt der Umweg über die Perfdata-Dateien
SLA-Reporting auslagern
35. Die status.dat
Für kleinere Umgebungen wunderbar
Ist da auch performant sein
Skaliert aber leider per Design nicht
36. MK Livestatus
Guter Ansatz
Beeindruckende Zahlen
Aufgaben wie z.B. die Sortierung sind komplex
Oder: „Zeige mir abhängig von meinen Berechtigungen
jene Services, welche in den letzten X Stunden am
meisten Probleme verursacht haben – sortiert nach
Anzahl der Probleme“
37. Relationale Datenbanken
Können skalieren, müssen aber nicht
Schema von NDO/IDO ist ein Problem
– NDO wurde wohl erdacht, um bequem Objekte
abzulegen...
– ...und nicht um dem Query-Designer das Leben leicht zu
machen
Merlin ist ein Beispiel dafür, dass es eleganter geht
Man könnte viel, viel mehr Informationen rausholen
Es gibt nicht nur relationale Datenbanken
38. Plugins tunen!
Die Hauptarbeit wird immer noch von den Plugins
erledigt
Hier hat man die Möglichkeit, vieles zu drehen
41. Wie häufig wird der Host geprüft?
Standard-Template: 5 min, 1 min, 10 attempts
Es dauert 10 Minuten bis ich weiß, dass der Host down
ist
In der Zeit hat bereits 20x mein Telefon geklingelt
In anspruchsvolleren Umgebungen prüfen wir 1x pro
Minute...
...und auch das ist eigentlich recht wenig
42. ICMP type 8: Echo request
12.000 Hosts aktiv im Minutentakt zu pingen...
– Bedeutet für den Nagios/Icinga-Core sehr viele Forks pro
Sekunde
– Mein Laptop kann in der Sekunde 500x date aufrufen
– Mein Laptop kann aber auch 17.000x in der Sekunde in
einem banalen Skript mein Loopback pingen, auf die
Antwort warten, die Dauer berechnen und das Datum
ausgeben
– Mein Laptop kann noch sehr viel mehr in der Sekunde,
wenn er Pings parallel und asynchron ausführt
43. Warum schreiben wir nicht einen Daemon...
...der unsere Hosts per ICMP überwacht...
...und stellen all unsere Host-Checks auf PASSIV um?
Lassen JEDEN Host im 5-Sekunden-Takt pingen
Beschleunigen den Rhythmus auf eine Sekunde wenn
eine Antwort nicht innerhalb von einer Sekunde
ankommt
Liefern im 5-Minuten-Rhythums Performance-Daten an
Nagios
44. Wieviel Traffic bedeutet...
...ein Rhythmus von 5 sec, 1 sec, 5 attempts...
...für 12.000 Hosts?
???
Ungefähr 2,5 Mbit/s Nutzdaten bei 64 Byte Payload
Etwa 5 Mbit/s samt IPv6-Header und Ethernetframe
45. Und könnte man...
...diesen Ansatz nicht auch für check_tcp und
check_udp nutzen?
Für HTTP-Checks?
Oder für „teure“ Plugins wie die vmWare Checks?
46. Kleinvieh macht auch Mist
Ein gutes Beispiel für teure Checks sind sämtliche
Interface-Table Check-Varianten
Snmpwalk, jedesmal
Ein Walk besorgt sich immer einen Wert nach dem
anderen
Einige Switches antworten sehr langsam
47. Wie läuft das ab?
OID: ifTable / ifXTable
– ifIndex, ifInOctets, ifInUcastPkts, ifInNUcastPkts,
ifInDiscards, ifDescr, ifOutErrors, ifOutQLen, ifSpecific,
ifType, ifMtu, ifSpeed, ifPhysAddress, ifAdminStatus,
ifOperStatus, ifLastChange
Jedesmal wird die vollständige Tabelle abgeholt
Schnell mal 1000+ sequentielle SNMP-Requests pro
Switch und Check
Aber brauchen wir das wirklich?
48. Switch-Überwachung – ein anderer Ansatz
Ein SNMP-Paket pro Switch im 10 Sekunden-Takt
Portstatus-Änderungen können so bei 48 Ports in
weniger als einer Minute erkannt werden...
...und das ohne nennenswerte Last
49. Vorschlag, das eleganter zu lösen
IfIndexes ändern sich nie oder nur bei Reboot
– Merken, sysUptime überwachen!
Descriptions und Aliases kann ich ab und an mal
abfragen
ifStatus will ich mit höherer Frequenz:
– snmpbulkget, nicht walk
Octets, Errors: längere Intervalle
50. Embedded Perl nutzen
Zahlt sich aus
Macht aber erst mal Arbeit
Es ist nicht schwer, Plugins entsprechend anzupassen
Man muss es aber machen
Speicher im Auge behalten!
51. Mir gefällt check_mk...
Bedeutet aber im Grunde, dass ich MK konfiguriere,
nicht mehr Nagios oder Icinga
Der Core wird sukzessive reduziert
Was vielleicht gar nicht so schlecht ist
Grundsatzentscheidung
52. Agenten nehmen Last weg
check_by_ssh & check_cache
check_mk
…
Bedeuten aber grundsätzlich erst mal
Konfigurationsoverhead
53. Bottleneck xDO
Muss jedes Check-Result in die DB?
Eigentlich reichen ja die Status-Änderungen
Wie weiß ich dann aber, ob alles noch läuft?
54. Vertrauen ist gut...
Status ist rot oder grün
Seit Zeitpunkt X
Und das bleibt so, bis es sich ändert
55. ...Kontrolle ist besser
Die lässt sich aber auch anders lösen
Prüfen, ob externe Komponenten sauber arbeiten
56. Und meine Trendgrafiken?
Müssen die wirklich durch den Core?
Wunschliste: Subscriptions für Events
Thema für icingamq, mod_gearman, Shinken...
57. Benachrichtigungen
Könnte man doch auch modularisieren
Ist im Core recht starr
Es gibt Addons...
...die aber gezwungen sind, suboptimal zu arbeiten
58. WENN wir dann so was haben...
...könnten wir die aktuellen Stati ja in einen Key/Value
Store blasen
Stichwort NoSQL
Dort würde ich mir auch on-the-fly Aggregationen /
Summaries wünschen
59. Wichtig: gefühlte Performance im Frontend
Beispiel Icinga-Web 1.5
– Eigentlich schneller als der Vorgänger, ABER...
– Parallele Requests
– Teure Abfragen
63. ABER:
SELECTs können grundsätzlich parallel laufen, aber:
– Sobald eine Schreibquery auf eine langsame Abfrage
wartet, müssen alle darauffolgende SELECTs warten
– Transaction Isolation Level
– Readonly-Slaves helfen nur bedingt
– Jeder Slave muss ALLE Schreib-Transaktionen in einem
einzigen Thread ausführen
64. Meine persönliche Meinung:
Wir brauchen unbedingt ein neues Schema
Vielleicht wäre das ein Thema für die Roadmap von
Icinga 2.0?
Aus dem Icinga-Projekt sollten die Impulse und
Vorgaben kommen
Ein modularer Aufbau ermöglicht Drittanwendungen,
dem Core Arbeit abzunehmen