...

Redis Monitoring mit Prometheus und Grafana: Anleitung

Redis Monitoring mit Prometheus und Grafana liefert mir belastbare Metriken zu Speicher, Latenz, Befehlsrate, Replikation und Cache-Effizienz, damit ich Leistung und Stabilität einer Instanz frühzeitig absichere. Ich nutze dafür einen Exporter, den Prometheus regelmäßig abfragt, und werte die Daten in Grafana-Dashboards aus, um Trends, Schwellen und Anomalien schnell zu erkennen.

Zentrale Punkte

Ich fasse die wichtigsten Eckdaten zusammen, damit du den Aufbau sicher planst. Ein Exporter stellt Redis-Daten im Prometheus-Format bereit. Prometheus sammelt sie in festen Intervallen. Grafana zeigt daraus verständliche Diagramme. Ich ergänze Alerting, damit Probleme nicht im Verborgenen bleiben.

  • Exporter: Redis-Metriken im Prometheus-Format bereitstellen
  • Prometheus: Scrape-Intervalle wählen, Targets prüfen
  • Grafana: Dashboards importieren, Farben und Schwellen setzen
  • Metriken: Speicher, Latenz, Befehlsrate, Cache-Hit-Rate beobachten
  • Alerting: Trends auswerten, Rauschen vermeiden

Setup-Überblick: Exporter, Prometheus, Grafana einrichten

Ich starte mit dem Exporter, weil er die Metriken liefert, die Prometheus versteht. Danach trage ich das Target in Prometheus ein und wähle ein passendes Scrape-Intervall. Zum Schluss importiere ich in Grafana ein bekanntes Redis-Dashboard und passe die Panels auf meine Umgebung an. Für den schnellen Einstieg hilft mir ein bewährter Grafana-Prometheus-Stack, der schon Basisintegration und Visualisierung mitbringt. So nutze ich in kurzer Zeit ein schlüssiges Monitoring, ohne auf wichtige Details zu verzichten.

Installation des Redis Exporters

Ich setze einen eigenständigen redis_exporter neben die Instanz und teste zuerst lokal, ob die Metriken erreichbar sind. Für geschützte Instanzen definiere ich Benutzer und Passwort, damit der Exporter sich sauber anmeldet. Anschließend überprüfe ich, ob redis_up den Wert 1 liefert und ob redis_uptime_in_seconds plausibel ist. Ich achte darauf, dass der Exporter nur die nötigen Berechtigungen erhält. So stelle ich sicher, dass die Messdaten verlässlich und sicher bereitstehen.

Exporter-Optionen und Lastabschätzung

Ich wäge bewusst ab, welche Collector-Optionen ich aktiviere. Commandstats, Keyspace- und Replication-Metriken sind Standard. Zusätzliche Prüfungen wie Key-Scans oder Pattern-basierte Checks aktiviere ich selektiv, damit sie im Betrieb keine unnötige Last erzeugen. In Lasttests messe ich die Exporter-Kosten: CPU und Speicher des Exporters selbst, zusätzliche Netzlast durch Scrapes und zusätzliche CPU-Last auf Redis durch INFO-Abfragen. Als Richtwert plane ich bei 15–30 Sekunden Scrapes und gängigen Collector-Sets mit < 1–2% Overhead auf einer produktiven Instanz. Steigt der Overhead, reduziere ich die Collector-Tiefe oder verlängere Intervalle.

Ich achte zudem auf Label-Kardinalität: Features, die pro DB, pro Command oder pro Role viele Zeitreihen erzeugen, dimensioniere ich bewusst. Für hunderte Instanzen multiplizieren sich Time Series schnell. Ich setze harte Grenzen: keine dynamischen Labels (z. B. Client-IDs), keine per-Key-Metriken in Prometheus. Für sporadische Key-Analysen nutze ich eigene Punktmessungen oder Werkzeuge, die nicht im Main-Loop von Prometheus laufen.

Prometheus-Konfiguration: Scrape-Intervalle und Labels

Ich wähle das Intervall so, dass Last und Detailtiefe zusammenpassen. Für viele Workloads reichen 30 Sekunden, für sehr dynamische Systeme setze ich 15 Sekunden. Ich vergabe eindeutige Labels pro Instanz, etwa cluster, role, env, damit Abfragen und Alerts klar zuordenbar bleiben. Die Targets überwache ich über den Status in Prometheus, denn dort sehe ich Ausfälle sofort. Rate-Funktionen nutze ich konsequent, um aus Zählern pro Sekunde sinnvolle Metriken zu berechnen.

Recording Rules, Retention und Langzeittrends

Ich definiere Recording Rules für häufig benötigte Ableitungen, damit Dashboards und Alarme schnell und stabil laufen. Beispiele sind Befehlsrate, Netzwerkdurchsatz, Fragmentierungsquote und Cache-Hit-Rate. So reduziere ich teure Abfragen zur Laufzeit und halte Panels reaktiv. Für Kapazität plane ich eine ausreichende Retention: Kurzfristig (z. B. 15–30 Tage) behalte ich hochaufgelöste Daten, langfristig lagere ich verdichtete Metriken aus oder nutze Downsampling. Trends über Quartale helfen mir, Wachstums- und Saisonalitätseffekte valide zu bewerten.

Ich dokumentiere meine Naming- und Label-Konventionen und ergänze external_labels pro Prometheus-Instanz. Damit kann ich Metriken auch nach einem Umzug oder bei föderierten Setups korrekt zuordnen. Für besonders volatile Umgebungen nutze ich Service Discovery mit stabilen Labeln und spreche Targets über Service-Objekte statt Pod-IPs an.

Grafana-Dashboards: Panels, Farben, Variablen

Ich baue Dashboards so, dass Trends auf den ersten Blick sichtbar sind. Farben und Warnschwellen hebe ich deutlich hervor, vor allem bei Speicher, Latenz und Befehlsrate. Variablen für Cluster, Rollen und Namespaces erleichtern mir das Umschalten zwischen Instanzen. Annotations kennzeichnen Deployments oder Rollbacks, damit ich Metrikspitzen im zeitlichen Kontext bewerte. Jede Kachel beantwortet eine konkrete Frage, statt nur Zahlen zu zeigen.

Dashboards für SLOs und operative Drilldowns

Ich trenne bewusst zwischen Übersichts- und Drilldown-Dashboards. Die Übersicht deckt SLO-nahe Kennzahlen ab: Befehlsrate, p95/p99-Latenz (sofern messbar), Cache-Hit-Rate, Evictions, Replikationsstatus und Fehler. Für die Analyse nutze ich Drilldowns mit Commandstats, Netzwerkdurchsatz, Blocked Clients, CPU-Anteilen und DB-Keyspace-Struktur (Keys, Keys mit TTL, avg_ttl). Variablen für env, cluster, role, instance und db erlauben mir Kontextwechsel ohne Panel-Duplikate. Ich definiere einheitliche Farbcodes (z. B. Grün = gesund, Gelb = Vorsicht, Rot = kritisch), damit Teams ohne Erklärung verstehen, was Handlungsbedarf hat.

Kernmetriken verstehen und richtig einordnen

Ich konzentriere mich auf die Kennzahlen, die Ursachen sichtbar machen. Speicherwerte zeigen mir, wie nah ich am Limit arbeite. Befehlsraten und Latenz deuten auf Überlast oder ineffiziente Muster hin. Verbindungen und Replikation verraten, ob Clients blockieren oder Knoten aus dem Takt geraten. Die Cache-Hit-Rate zeigt mir, ob der Cache groß genug ist und ob die Datenlebensdauer passt.

Metrik PromQL-Beispiel Bedeutung Richtwert/Signal
redis_up redis_up == 1 Exporter erreicht Redis 0 signalisiert Ausfall
redis_memory_used_bytes avg(redis_memory_used_bytes) by (instance) Tatsächlicher Heap-Bedarf > 80% des Limits kritisch
redis_memory_used_rss_bytes (rss / used) > 1.5 Speicherfragmentierung Quotient dauerhaft hoch = Handlungsbedarf
redis_commands_total rate(redis_commands_total[5m]) Befehle pro Sekunde Starker Anstieg + Latenz = Engpass
redis_connected_clients max(redis_connected_clients) by (instance) Gleichzeitige Verbindungen Nah am maxclients-Limit gefährlich
Hits/Misses sum(rate(redis_keyspace_hits_total[5m])) / (sum(rate(redis_keyspace_hits_total[5m])) + sum(rate(redis_keyspace_misses_total[5m]))) Cache-Effizienz < 0.9 deutet auf Fehlkonfiguration

Ich ergänze bei Bedarf Metriken zu Replikation, etwa ob der Slave im Sync hängt oder der Link Status kippt. Für Cluster-Setups werte ich pro Rolle getrennt aus, um Lese- und Schreibpfade zu vergleichen. Anomalien prüfe ich immer im Kontext von Deployments und Traffic-Spitzen. Erst Trends liefern mir belastbare Aussagen, einzelne Peaks eher selten. So treffe ich rationale Entscheidungen statt Bauchgefühl.

Persistenz, Evictions und Netzwerk im Blick

Ich überwache Persistenz (RDB/AOF) separat: Status der letzten Hintergrundspeicherung, Dauer der letzten Laufzeit, Änderungen seit dem letzten Snapshot und ob AOF aktiv ist. Häufige oder lange Persistenzläufe deuten auf I/O-Engpässe oder zu knappe Ressourcen hin. Steigt die Latenz parallel an, prüfe ich I/O-Sättigung, Komprimierung und Speicherplatz.

Bei Evictions alarmiere ich nicht erst bei absoluten Zahlen, sondern bei einer Rate, die zusammen mit einer sinkenden Hit-Rate oder steigender Latenz auf Speichermangel hinweist. Ich werte auch Expired Keys aus: Viele Expirations sind nicht zwingend schlecht, aber plötzliche Sprünge deuten auf falsche TTL-Batches oder ungleichmäßige Löschmuster hin.

Für das Netzwerk nutze ich Ein- und Ausgabebytes pro Sekunde, um Bandbreitenbedarf und Skalen zu verstehen. Ein stark wachsendes Output-Volumen bei gleichbleibender Befehlsrate deutet auf größere Antworten (z. B. HSCAN/SMEMBERS) oder unkomprimierte Payloads hin. Zusätzlich beobachte ich abgelehnte Verbindungen und Blocked Clients: Beides ist ein klares Zeichen, dass either Threads oder I/O-Pfade gesättigt sind.

Replikation und Hochverfügbarkeit richtig messen

Ich messe Lag als Differenz der Replikations-Offsets oder über die Zeit seit dem letzten erfolgreichen I/O-Kontakt zum Master. Eine anhaltend hohe Lücke zeigt, dass Slaves hinterherhinken und Reads dort veraltet sein können. Den Link-Status und laufende Voll-/Teilsynchronisationen prüfe ich mit eigenen Panels und Alarmschwellen. Für Cluster- oder Sentinel-Setups tracke ich Rollenwechsel, Anzahl der angeschlossenen Replikas und Backlog-Größen. Wichtige Indikatoren sind steigende Partial-Resyncs (instabile Links) und wiederholte Full-Resyncs (I/O- oder Netzwerkprobleme).

Alerting-Strategie mit PromQL

Ich baue Alarme so, dass sie Trends und nicht bloß Spitzen melden. Speicher über 80% für 10 Minuten löst eher aus als ein 30-Sekunden-Peak. Eine Cache-Hit-Rate unter 90% über 15 Minuten weist auf falsche TTLs oder zu wenig Speicher hin. Verbindungsfehler und steigende Latenz kombiniere ich zu einem Hinweis auf Überlast. Wiederkehrendes Rauschen reduziere ich über for-Dauern, Smoothing und sinnvolle Schwellwerte.

Alarm-Design: Praxisbeispiele und Korrelation

  • Verfügbarkeit: redis_up == 0 (sofort), ergänzt um Exporter- und Scrape-Fehler, damit ich Netzwerkprobleme von Redis-Ausfällen unterscheiden kann.
  • Speicher: used_bytes/maxmemory > 0.8 für 10m und parallel steigende Evictions-Rate: priorisiere Skalierung/TTL-Anpassung.
  • Replikation: Lag über Schwellwert für 5–10m oder wiederholte Full-Resyncs innerhalb 30m: prüfe Netzwerk und Backlog-Größe.
  • Clients: Anteil blockierter Clients > X% der Gesamtclients für 5m: suche große BLPOP/BLOCK-Operationen oder langsame Lua-Skripte.
  • Persistenz: letzter BGSAVE/AOF-Status fehlgeschlagen oder Dauer über Normalwert + 50% für 10m: prüfe I/O-Subsystem.

Ich korreliere Alarme über gemeinsame Labels (cluster, role, env) und ergänze Runbook-Links in den Alarmtexten. Das Team weiß dadurch sofort, welche Checks und Kommandos als Nächstes auszuführen sind. Für Staging/Canary-Umgebungen setze ich niedrigere Prioritäten, damit die On-Call-Belastung beherrschbar bleibt.

Kapazitätsplanung und Tuning in der Praxis

Ich plane Kapazität, indem ich Trends aus Speicher, Commands und Latenz gemeinsam bewerte. Wächst die Datenmenge konstanter als der Hit-Ratio stabil bleibt, erhöhe ich Speicher oder passe TTLs an. Bei Fragmentierung senke ich Overhead durch restriktive Allokatoren oder gezieltes Rewriting. Eviction-Policy und maxmemory wähle ich passend zum Workload, etwa allkeys-lfu für häufig genutzte Schlüssel. Für langfristige Planung hilft mir fundiertes Performance Monitoring, das Workload-Muster klarzeigt.

Runbooks, Tests und Chaos-Übungen

Ich dokumentiere Runbooks zu den wichtigsten Alarmen: Welche Logs und Kommandos prüfe ich? Welche Metriken bewerte ich zuerst? Wer eskaliert wann? Ich übe Failover und Reparaturszenarien regelmäßig. In kontrollierten Tests simuliere ich Netzwerkflaps, I/O-Drosselung, Speicherknappheit und abgelehnte Verbindungen. Ich verifiziere, dass Alarme auslösen, Dashboards die Muster sichtbar machen und das Team in der erwarteten Zeit reagieren kann.

Ich halte zusätzlich Baseline-Messwerte je Umgebung fest: typische Befehlsrate, durchschnittlicher Speicher, übliche Persistenzdauer, normale Replikations-Lag. Abweichungen vom Baseline-Korridor erkenne ich dadurch schneller und kann Tuningmaßnahmen fundiert priorisieren.

Kubernetes- und Cloud-Umgebungen sauber integrieren

Ich betreibe den Exporter als Sidecar oder als eigenständiges Deployment und beschreibe Targets per ServiceMonitor. Labels wie cluster und role lege ich konsistent fest, damit Dashboards korrekt filtern. Für Cluster-Endpunkte wähle ich ein zentrales Scrape-Ziel, um doppelte Messungen zu vermeiden. Auto-Discovery spart mir Pflegeaufwand bei dynamischen Pods. Persistente Volumes und passende Requests verhindern Speicherknappheit zur Unzeit.

Kardinalität, Service Discovery und Mandantenfähigkeit

Ich designe Discovery-Regeln so, dass nur relevante Endpunkte eingesammelt werden. Ich filtere mit Label-Selektoren und verwende dedizierte Namespaces für Infra-Komponenten. Für Multi-Tenant-Setups halte ich eine klare Trennung der Labels env, team, service ein. Kardinalität bleibt unter Kontrolle, indem ich die Anzahl dynamischer Labelwerte begrenze und Aufrufe mit hoher Varianz (z. B. per-DB je Instanz) nur dort aktiviere, wo sie wirklich benötigt werden.

Ich plane Ressourcen für Exporter und Prometheus konservativ: Requests/ Limits passend zum Peak-Scrape-Volumen, PDBs für Hochverfügbarkeit und Node-Affinity für Latenz-sensitive Datenpfade. Bei Bedarf skaliere ich Prometheus horizontal (Sharding) und entlaste über Recording Rules und längere Scrape-Intervalle für wenig dynamische Metriken.

Sicherheit und Zugriff auf Metriken

Ich sichere Redis per TLS und Authentifizierung, damit keine Fremden Metriken oder Daten abgreifen. Der Exporter erhält nur die nötigen Rechte und keine sensiblen Befehle. Netzrichtlinien begrenzen den Zugriff auf Prometheus und den Exporter-Port. Secrets lege ich getrennt ab und rotiere sie regelmäßig. So bleibt die Messinfrastruktur verlässlich und Angriffsflächen klein.

Compliance und Datenhygiene in Metriken

Ich achte darauf, dass keine personenbezogenen Daten oder sensiblen Inhalte in Labels oder Metriken landen. Panels und Variablen enthalten ausschließlich technische Identifikatoren. Für Debug-Daten, die vorübergehend sensibler sind, definiere ich kurze Retention und strikt eingeschränkte Zugriffsrechte. Ich nutze in Grafana Folder- und Team-Rechte, damit nur befugte Personen operative Dashboards sehen.

Häufige Fehler und Troubleshooting

Ich prüfe zuerst redis_up, wenn im Dashboard Werte fehlen. Bleibt der Wert 0, stimmt oft der Connect-String oder die Firewall nicht. Weicht rss stark von used ab, liegt Fragmentierung nahe oder ein Nebeneffekt des Betriebssystems. Bei niedriger Hit-Rate schaue ich auf TTLs, Key-Größe und Zugriffsmuster. Für eine schnelle Ursachenanalyse hilft mir der RedisInsight Guide, der Abfragen und Hot Keys sichtbar macht.

Zeigen sich anhaltende Blockierungen (blocked clients), suche ich nach langen Skripten, großen Multi/Exec-Transaktionen oder überdimensionierten SCAN/SMEMBERS-Aufrufen. Bei abgelehnten Verbindungen prüfe ich maxclients, Netzwerk-Limits und ob zu viele Langläufer-Connections Ressourcen binden. Bei Replikationsproblemen untersuche ich Link-Flaps, Backlog-Größen, Paketverluste und Disk-I/O. Persistenzfehler deuten oft auf vollen Speicherplatz, I/O-Drosselung oder fehlschlagende Forks hin.

Versionsspezifische Hinweise und Tuning

Ich berücksichtige Redis-Versionen bei der Interpretation: Neuere Versionen bringen optimierte I/O-Pfade, veränderte Default-Policies und zusätzliche Metriken. Ich validiere nach Upgrades, ob Dashboards weiterhin alle Felder erhalten und ob sich Basiswerte (z. B. CPU-Verbrauch) verschoben haben. Bei aktivem TLS plane ich etwas mehr CPU ein und überwache, ob Latenz und Throughput stabil bleiben. Bei hohem Lua-/Script-Anteil beachte ich, dass lange Single-Thread-Operationen Metrikspitzen verursachen können – erkennbar über erhöhte Blockierungen und Latenz in zeitlicher Nähe zu Script-Ausführungen.

Schritt-für-Schritt: Vom ersten Metric bis zum Dashboard

Ich richte den Exporter ein und teste die Endpoint-Antwort lokal. Dann trage ich das Target in Prometheus ein und prüfe den Status. Als Nächstes importiere ich ein Dashboard und kontrolliere, ob Commands, Speicher und Clients sinnvoll erscheinen. Danach setze ich Alerts für Speicher, Cache-Hit-Rate, Latenz und Replikation. Zum Schluss dokumentiere ich Schwellen und Runbooks, damit das Team in Störfällen schnell handelt.

Zusammenfassung

Ich baue Redis Monitoring mit Exporter, Prometheus und Grafana so auf, dass ich Ursachen statt Symptome sehe. Metriken zu Speicher, Befehlsrate, Verbindungen, Replikation und Cache-Hit-Rate liefern mir die entscheidenden Hinweise. Klare Dashboards und durchdachte Alerts machen Lastspitzen, Fehlkonfigurationen und Engpässe sichtbar, bevor Nutzer es merken. Saubere Labels, sinnvolle Intervalle und sichere Zugriffe halten den Betrieb verlässlich. Wer diese Schritte beherzigt, erhält einen dauerhaften Blick auf Leistung und Stabilität seiner Redis-Instanzen und trifft bessere Architektur- und Kapazitätsentscheidungen.

Aktuelle Artikel