InfraGuard

Sitzungen (Redis)

Überwachen Sie den Zustand des Redis-Sitzungs- und Cache-Speichers je Knoten (Kapazität, Durchsatz, Trefferquote, Speicherverwaltung, Keyspace) — gelesen aus einem vom Collector befüllten Read-Model, ohne direkte Redis-Verbindung.

Übersicht — was dieser Bildschirm leistet

Service ▸ Sitzungen (Redis) überwacht auf einem Bildschirm den Zustand des Sitzungs- und Cache-Speichers Ihrer registrierten Redis-Knoten. Er überträgt die Erzählung von Service ▸ Datenbank auf Redis und liest dabei entlang zweier Achsen:

  1. Kapazitätsgrenze und aktueller Zustand — eine Ringanzeige der Speichersättigung (used_memory ÷ Kapazitätsgrenze), die Client-Verbindungen (connected / maxclients) und die blockierten Clients.
  2. Durchsatz — Operationen pro Sekunde (instantaneous_ops_per_sec), Trefferquote im jüngsten Zeitfenster (Δhits / Δ(hits+misses)) und Netz-E/A (ein/aus in kbps).

Ein aufklappbares Detail-Panel ergänzt eine Zeitreihe zur Speicherverwaltung (Überlagerung der Kapazitätsgrenze und Markierungen für Verdrängungsereignisse) sowie die Keyspace- und Sitzungsanalyse.

Dieser Bildschirm verbindet sich nie direkt mit Redis. Ein repräsentativer Collector im internen Netz (scripts/infr_redis_vts_collector.cjs, ein pm2-Cron, der jede Minute läuft) führt auf jedem Knoten redis-cli INFO aus und lädt Momentaufnahmen in die zentrale MySQL-Tabelle infr_redis_metric; die Anwendung liest sie lediglich. Die Anwendung hält keine Redis-Zugangsdaten und betreibt keinen dauerhaft laufenden Daemon (so werden die Fallen von Verbindungslecks und fest einprogrammierten Zugangsdaten vermieden).


Wann Sie ihn nutzen


Aufbau

KPIs im Kopfbereich

KPI Bedeutung
Knoten Redis-Knotenkarten mit einer Probe im jüngsten Zeitfenster (30 Min.)
Aktiv / Beeinträchtigt / Ausgefallen Anzahl der Knoten mit up / degraded / down
Ops/s gesamt Summe von instantaneous_ops_per_sec über alle Knoten
Schlüssel gesamt Summe von keyspace_keys über alle Knoten

Knotenkarten (zwei Achsen)

Jeder Knoten ist eine Karte. Die Kopfzeile zeigt Instanzname bzw. Alias, die Redis-Version und die Rolle (master/replica); der Rumpf trägt die beiden Achsen.

① Kapazität · frei (linke Ringanzeige) — der Wert in der Mitte ist used_pct (belegt ÷ Kapazitätsgrenze). Kennzahlenleiste:

Kennzahl Feld Hinweise
Clients connected_clients / maxclients Verbindungen gegenüber dem Limit; nahe am Limit werden neue Verbindungen abgewiesen
Blockiert blocked_clients Clients, die auf BLPOP·BRPOP·WAIT warten (0 ist gesund)

② Durchsatz (rechts) — Sparkline und Leiste:

Kennzahl Feld Hinweise
Ops/s instantaneous_ops_per_sec Pro Sekunde verarbeitete Befehle
Trefferquote Δhits / Δ(hits+misses) Cache-Trefferquote im jüngsten Zeitfenster (fällt bei dünner Datenlage auf den Wert seit Start zurück)
Netz-E/A instantaneous_input_kbps + output_kbps Netzwerk ein/aus pro Sekunde

Effizienzwerte (Kartenfuß)

Der Fragmentierungswert (frag_score) wird nur berechnet, wenn used_memory mindestens 64 MB beträgt. Auf kleinen Instanzen dominiert der feste Overhead des Allokators das Verhältnis und erzeugt Fehlalarme; unterhalb dieser Schwelle bleibt er deshalb sowohl aus der Bewertung als auch aus dem Status ausgeschlossen.

Leiste zum Sitzungslebenszyklus

Eine Leiste über die volle Breite des Kartenfußes stellt mit Ablauf → Fluss → kumuliert abgelaufen dar. Links stehen Schlüssel, die aktuell eine laufende TTL tragen (keyspace_expires, kurz vor dem natürlichen Ablauf); rechts die seit dem Start abgelaufenen Schlüssel (expired_keys, der Sitzungsumschlag). Eine Füllung nahe ≈100 % bedeutet einen reinen Sitzungsspeicher.

Detail (aufklappen)

Zwei Blöcke öffnen sich aufklappbar (das Masonry-Layout ordnet sich bei Höhenänderungen neu).

Erklärende Popover (edu)

Wenn Sie mit dem Zeiger über das Symbol neben einer Kennzahl fahren, öffnet sich ein eigens gestaltetes Popover, das Ursachen und Abhilfen erläutert (tiefer gehende Konzepte in Redis-Tuning erklärt):

Popover Inhalt
SLOWLOG 7 Ursachen für sich anhäufende langsame Befehle (O(N)-Befehle · große Schlüssel · Speicherdruck · Fork-Stockungen · Lua · Pipelines · große DEL)
Trefferquote Grundlage der Keyspace-Trefferquote und wie Sie sie anheben (Working Set resident halten · TTL abstimmen · Stampedes abfedern)
Fragmentierung Gesunder Bereich von RSS / used (1,0–1,5) · activedefrag · Warnung bei Swapping (< 1,0)
Logische Datenbanken Konzept der nummerierten Redis-Datenbanken (0–15) · Trennung nach Zweck · Portierbarkeit auf Cluster
Ablauf · Verdrängung Ablauf (normale Lebensdauer) gegenüber Verdrängung (Speicherdruck) · wie Sie sie lesen

So gehen Sie vor

  1. Polling — nach dem Laden ruft die Seite alle 30 Sekunden /service/session/live ab, um KPIs und Karten zu aktualisieren (der Server hält das Dashboard 20 Sekunden im Cache).
  2. Karten umsortieren — ziehen Sie die Karten in die gewünschte Reihenfolge (SortableJS; die Reihenfolge bleibt in localStorage erhalten).
  3. Detail aufklappen — öffnen Sie über [Aufklappen] auf der Karte die Blöcke zu Speicherverwaltung und Keyspace.
  4. Mit edu lernen — fahren Sie über das Symbol einer Kennzahl, um das Popover zu Ursache und Abhilfe zu sehen.
  5. Vollbild — die Vollbildschaltfläche neben der LIVE-Anzeige im Kopfbereich blendet die obere Navigation aus und wechselt in den Dashboard-Modus (ESC beendet ihn).

Erscheint keine Karte, wurden noch keine Redis-Knoten registriert oder erfasst. Registrieren Sie unter Verwaltung ▸ Collectors die redis_host-Knoten am Collector redis_vts und rollen Sie den Collector per pm2 auf dem repräsentativen Host aus.


Datenquellen

Read-Model infr_redis_metric

Die Anwendung bildet diese Tabelle als schreibgeschütztes Modell im Legacy-Stil ab (App\Models\Infr\InfrRedisMetric, $timestamps=false). Es gibt dafür bewusst keine Migration — der Collector legt sie mit CREATE TABLE IF NOT EXISTS selbst an, sodass ein Schema::create auf Anwendungsseite kollidieren würde.

Disziplin des Builders App\Services\Redis\RedisMetricService::dashboard():

-- Konzeptionell (tatsächlich Eloquent). Das jüngste Fenster gesammelt holen, in PHP gruppieren.
SELECT * FROM infr_redis_metric
 WHERE sampled_at >= (NOW() - INTERVAL 30 MINUTE)
 ORDER BY sampled_at;

Collector — scripts/infr_redis_vts_collector.cjs

Ein einzelner repräsentativer Host im internen Netz läuft als pm2-Cron, tastet je Durchlauf das Redis mehrerer Knoten (redis-cli -h {ip} INFO) sowie das nginx-vts ab, lädt die Daten direkt in das zentrale MySQL und beendet sich danach (nicht resident → je Durchlauf ein frischer Prozess, keine Lecks). Die Konfiguration steht ausschließlich im CONFIG-Block am Dateianfang (keine Umgebungsvariablen, keine fest einprogrammierten Zugangsdaten).

# Auf dem repräsentativen Host ausrollen (Durchlauf jede Minute, nicht resident)
npm i mysql2                 # die einzige npm-Abhängigkeit (für das Laden). redis-cli über das Betriebssystempaket installieren.
pm2 start infr_redis_vts_collector.cjs --name infr-collector \
  --no-autorestart --cron-restart "* * * * *"
pm2 save

Instanz-Join (Alias / Integer-Fremdschlüssel)

Beim Schreiben schlägt der Collector den Knoten-Alias in infr_instance nach und schreibt direkt eine instance_id (Integer). Die Anwendung verknüpft vorrangig über metric.instance_id = infr_instance.id (Integer-Vergleich — unabhängig von der Kollation und über den Primärschlüssel indiziert). Nicht oder erst später registrierte Instanzen fallen auf node_alias (kleingeschrieben) → infr_instance.alias zurück; das Nachfüllen durch infr:link-metrics (leader-gesteuert, alle 5 Minuten) trägt instance_id später nach.

Berechnung der Kapazitätsgrenze (cap)

Die 100-%-Basislinie von Ringanzeige und Speicherdiagramm wird in dieser Reihenfolge bestimmt.

cap-Art Bedingung Grenze Geschätzt frei (est_free)
maxmemory maxmemory > 0 Der eingestellte maxmemory-Wert (harte Grenze) maxmemory − used
budget maxmemory nicht gesetzt Gesamt-RAM − Datenbank-Buffer-Pool − Betriebssystemreserve budget − used

Statusbestimmung und Schwellenwerte

statusOf() stuft jeden Knoten als up / degraded / down ein.

Status Bedingung
down Erfassung fehlgeschlagen (ok=0) oder stale (letzte Probe älter als redis_stale_min)
degraded Einer oder mehrere der unten genannten Gründe
up Kein Grund

Gründe und Schwellenwerte für degraded (Verwaltung ▸ Betriebsrichtlinie, infr_setting group=ops):

Grund Bedingung Schwellenwert-Schlüssel Standard
Speichersättigung used_pct ≥ redis_mem_pct 85
Fragmentierung frag_score ≥ redis_frag_ratio 1.6
Blockierte Clients blocked_clients ≥ redis_blocked 1
Replikat-Verbindung getrennt master_link_status = down — —
RDB-Speichern fehlgeschlagen rdb_last_bgsave_status = err — —

Die Trefferquote ist KEINE Statusachse. Ein Sitzungsspeicher verfehlt bei jeder neuen Anmeldung, jedem Ablauf und jeder Abmeldung, weshalb eine Trefferquote von 40–60 % normal ist (etwa 44,75 % auf einem völlig gesunden Sitzungsknoten). Früher erzeugte eine Trefferquote unter redis_hit_rate_min (Standard 50) ein falsch-rotes degraded; heute wird die Trefferquote nur noch auf dem Karten-KPI, der Stufenanzeige und im edu-Popover angezeigt und färbt niemals einen Knoten rot. Echte Cache-Probleme (Speichersättigung, Verdrängung, Fragmentierung) erfassen mem_saturation/fragmentation unabhängig von der Arbeitslast.


Zugriff

Dieser Bildschirm kennt keine destruktive Aktion und schreibt daher kein eigenes Audit-Protokoll (Änderungen an Collectors und Richtlinien werden auf den jeweiligen Verwaltungsbildschirmen protokolliert).


Fehlersuche und FAQ

Es erscheinen keine Karten („Keine Redis-Knoten erfasst“)

infr_redis_metric enthält keine jüngeren Proben. Prüfen Sie, ob (1) Sie unter Verwaltung ▸ Collectors redis_host-Knoten am Collector redis_vts registriert haben, (2) infr_redis_vts_collector.cjs auf dem repräsentativen Host unter pm2 läuft und (3) der repräsentative Host den Redis-Port jedes Knotens über redis-cli erreicht.

Ein Knoten zeigt „Ausgefallen (stale)“

Die letzte Probe ist älter als redis_stale_min (Standard 5 Min.). Wahrscheinlich ist der pm2-Prozess des repräsentativen Collectors gestorben oder sein Cron steht still. Prüfen Sie das mit pm2 list / pm2 logs infr-collector.

Die Grenze der Ringanzeige wirkt falsch / der freie Speicher scheint riesig

Knoten ohne maxmemory nutzen ein Budget als Grenze (Gesamt-RAM − Datenbank-Buffer-Pool − 20 % Betriebssystemreserve). Für eine harte Grenze setzen Sie maxmemory in Redis — dieser Wert wird dann unmittelbar zur Grenze.

Der Block Keyspace / Sitzungen ist leer

Das Detail je Datenbank (raw.keyspace) und die Kennzahlen der Sitzungsdatenbank füllt der erweiterte Collector. Rollen Sie einen älteren Collector erneut aus (dabei werden total_system_memory, keyspace_keys und die raw-Spalten je Datenbank idempotent ergänzt), dann erscheint der Block. Fehlen die Daten, blendet sich der Abschnitt still aus.

Die Trefferquote ist niedrig — ist das ein Problem?

Bei einer Sitzungslast nicht (siehe die Warnung oben). Handelt es sich um einen reinen Cache und die Trefferquote ist niedrig, ist das Working Set möglicherweise nicht resident oder die TTL zu kurz — siehe das Thema Trefferquote in Redis-Tuning erklärt.

Der Fragmentierungswert wird nicht angezeigt

Liegt used_memory unter 64 MB, wird das Fragmentierungsverhältnis vom festen Overhead beherrscht und ist bedeutungslos; es bleibt daher aus Bewertung und Status ausgeschlossen.


Verwandte Themen

Redis 세션 관제 — 수용률·처리량·적중률
Redis 세션 관제 — 수용률·처리량·적중률