InfraGuard

Einen Datenbank-Collector registrieren

Registrieren Sie einen access=database-Collector als je Host eigene db@alias-Zeilen, um Service ▸ Datenbank und die Alarme zu speisen — das Passwort wird mit Crypt gespeichert oder über cred_ref=env:PREFIX wiederverwendet.

Überblick — was diese Seite leistet

Verwaltung ▸ Collectors ist die Collector-Registry von InfraGuard (die Tabelle infr_collector). Sie holt fest verdrahtete Zugangsdaten und Host-Zuordnungen aus dem Code heraus und speichert sie als Daten. Collectors werden über die Zugriffsmethode (access) abstrahiert.

access Zweck Speist
web Endpunkt des Remote-Agents (tlx-Sonde · run_report) Infrastruktur ▸ Zustand
database Direkte Verbindung zu einer registrierten DB, um Lastmetriken zu erfassen Service ▸ Datenbank · Infrastruktur ▸ Alarme
agent Stellvertretender Collector im internen Netz (Redis + nginx-vts) Service ▸ Sitzungen (Redis) · Service ▸ Web

Dieser Artikel behandelt den access=database-Collector. Die InfraGuard-Anwendung verbindet sich in regelmäßigen Abständen mit einer registrierten DB und liest SHOW GLOBAL STATUS · information_schema.processlist · information_schema.tables, wobei sie eine Zeitreihe nach infr_db_metric schreibt. Ihre Datenzeilen werden dabei niemals gelesen oder geschrieben — nur Last- und Strukturmetriken.

DB-Collectors sind die Quelle für die Ansicht zur DB-Lastüberwachung und die Alarme. Registrieren Sie hier eine DB, dann erscheint sie automatisch in beiden.

Wann Sie das brauchen

Aufbau

Die Collector-Liste zeigt Karten, gruppiert nach Zugriffsmethode. access=database-Zeilen werden in eine einzige Gruppenkarte „Datenbanken“ zusammengefaltet (um einen Wildwuchs an Karten zu vermeiden). Über [Bearbeiten] auf der Gruppenkarte öffnet sich der Gruppeneditor (2 Reiter).

Reiter des Gruppeneditors

Reiter Inhalt
Allgemein (gemeinsame Verbindungsvorgaben) driver · port · database · username · Schwelle für Rückstau (slow_time) · schedule · cred_ref — gelten für jeden DB-Eintrag
Datenbanken (Eintrags-Array) Je Eintrag: alias · Anzeigename · host/IP · driver (Überschreibung) · Ausführungsschalter · Passwort (nur schreibend)

Auch wenn die Oberfläche nur eine Gruppenkarte zeigt, werden beim Speichern alle Einträge jeweils als eigene db@{alias}-Zeile per Upsert geschrieben (access=database). Die Erfassungskette, Service ▸ Datenbank und die Alarmzuordnung arbeiten sämtlich pro Collector. Wird ein Eintrag entfernt, wird auch dessen db@-Zeile gelöscht.

Felder je Collector (infr_collector)

Spalte Bedeutung
key Eindeutiger Schlüssel. DB-Einträge lauten db@{alias} (z. B. db@blue) — unveränderlich (Alarme adressieren über den Schlüssel)
title Anzeigename (Vorgabe {alias} DB)
access Fest auf database
kind Fest auf metrics
host_alias Der Alias des Eintrags (Host-Bezeichnung)
feeds_table Fest auf infr_db_metric
cred_ref Verweis auf Zugangsdaten (z. B. env:STATS_DB) — leer bedeutet Rückfall auf config + secret_enc
config {driver, host, port, database, username, sample:{slow_time_sec, connect_timeout}} (ohne Geheimnis)
secret_enc DB-Passwort (Crypt · nur schreibend · wird niemals an den Browser zurückgegeben)
is_run Ob der Zeitplan aktiv ist

So gehen Sie vor

1. Eine neue DB registrieren (Gruppeneditor)

  1. Öffnen Sie Verwaltung ▸ Collectors.
  2. Klicken Sie auf der Gruppenkarte „Datenbanken“ auf [Bearbeiten] → Reiter Allgemein und tragen Sie die gemeinsamen Werte ein.
    • driver: mysql oder mariadb
    • port: Vorgabe 3306
    • database: nur das Standardschema beim Verbinden — leer lassen, um sich mit information_schema zu verbinden (den Erfassungsumfang bestimmen die Rechte des Kontos)
    • username: das Überwachungskonto (z. B. infra_ro)
    • Schwelle für Rückstau (slow_time): Abfragen, die länger als diese Anzahl Sekunden laufen, zählen als „wartend/aufgestaut“ (1–60 s, Vorgabe 2)
    • cred_ref: env:PREFIX, um Zugangsdaten aus .env wiederzuverwenden
  3. Reiter Datenbanken → [DB hinzufügen] → je Eintrag: alias (erforderlich) · host/IP · optional ein Passwort.
  4. [Speichern]. Jeder Eintrag wird als db@{alias}-Zeile angelegt bzw. aktualisiert.

2. Umgang mit dem Geheimnis — zwei Wege

(A) Das Passwort direkt eingeben — im Passwortfeld eingetippt, wird es verschlüsselt in secret_enc abgelegt. Liste und API-Antworten geben den Klartext niemals preis; zurückgegeben werden nur die booleschen Werte has_secret/has_db_pw.

Das Passwort ist nur schreibend. Beim Bearbeiten bleibt der vorhandene Wert erhalten, wenn Sie das Passwortfeld leer lassen (kein Überschreiben). Um es ausdrücklich zu entfernen, verwenden Sie die Löschoption.

(B) Zugangsdaten aus .env wiederverwenden (cred_ref=env:PREFIX) — speichern Sie das Passwort nicht in der DB, sondern verweisen Sie auf einen bereits in .env vorhandenen Zugangsdatensatz. DbCollectorService::resolveConn() liest diese Schlüssel:

In config eingetragene Werte haben Vorrang; leere werden aus den PREFIX_*-Umgebungsvariablen ergänzt (host/port/database/username/password).

3. Serverweit wartende Abfragen — das PROCESS-Recht

Die beiden Kernmetriken (Verbindungsauslastung = Threads_running/Threads_connected/max_connections sowie QPS · Rate langsamer Abfragen = ΔQuestions/ΔSlow_queries) lassen sich mit einem einfachen Konto (USAGE) erfassen. Die serverweite Aggregation wartender Abfragen und die Größenanalyse aller Schemata erfordern jedoch zusätzliche Rechte.

Ein Skript für ein Konto mit minimalen Rechten, das einmalig als root auf jedem Ziel-DB-Host auszuführen ist: sql/infr_db_monitor_grant.sql.

-- Dediziertes Nur-Lese-Konto (schränken Sie den Quell-Host auf die IP des InfraGuard-Anwendungsservers ein)
CREATE USER 'infra_ro'@'%' IDENTIFIED BY 'CHANGE_ME_TO_A_STRONG_SECRET';

-- Globale Beobachtungsrechte (KEIN Datenzugriff)
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'infra_ro'@'%';

-- Größenanalyse der Schemata (alle DBs · nur lesend). Für nur eine DB auf design.* einschränken
GRANT SELECT ON *.* TO 'infra_ro'@'%';

-- Begrenzung des Schadensradius — verhindert das Monopolisieren von Verbindungen (Lehre aus dem Vorfall [1040] vom 2026-08-06)
ALTER USER 'infra_ro'@'%' WITH MAX_USER_CONNECTIONS 5;
FLUSH PRIVILEGES;

MariaDB 10.5+ kann BINLOG MONITOR statt REPLICATION CLIENT verwenden. PROCESS und SELECT sind identisch.

4. Die Erfassung ausführen und prüfen

Die Erfassung übernimmt der artisan-Befehl infr:collect-db. Der Scheduler-Bereich des Entwicklungs-Launchers (composer dev) ruft ihn jede Minute auf.

# Einen Collector sofort einmalig abtasten (unter Umgehung der Sperre aus der Betriebsrichtlinie)
php artisan infr:collect-db --key=db@blue --force

# Alle registrierten DBs (is_run=1) gemäß der Richtlinie erfassen
php artisan infr:collect-db

Ob erfasst wird, entscheidet die Betriebsrichtlinie.

Richtlinienschlüssel Vorgabe Bedeutung
db_collect_mode economy economy = nur erfassen, solange ein Konsolenbenutzer aktiv ist (Präsenz) · always = immer
db_collect_interval_sec 60 Erfassungsintervall (Sekunden, mindestens 10)
presence_window_sec — Zeitfenster, in dem ein Benutzer nach der letzten Aktivität weiterhin als „anwesend“ gilt

Verwenden Sie --key, um einen bestimmten Datenbank-Collector zu testen. Die Schaltflächen [Testen] / [Code abgleichen] gelten nur für access=web-Collectors und nicht für Datenbank-Collectors — prüfen Sie mit dem obigen Befehl.

5. Statusschwellen

DbCollectorService::statusOf() entscheidet anhand der Schwellenwerte aus der Betriebsrichtlinie zwischen up und degraded.

Schwellenschlüssel Vorgabe Bei Überschreitung
db_degrade_conn_pct 80 Verbindungsauslastung (%) erreicht oder überschritten → degraded
db_degrade_running 40 threads_running erreicht oder überschritten → degraded
db_degrade_waiting 5 Anzahl wartender Abfragen erreicht oder überschritten → degraded
db_degrade_slow_qps 1 Rate langsamer Abfragen (/s) erreicht oder überschritten → degraded

Datenquellen

Ziel Tabelle / Quelle Hinweise
Collector-Registry infr_collector (Migrationen 000201 + 000680) access · config (JSON) · secret_enc (Crypt)
Erfasste Zeitreihe infr_db_metric (Migration 000681) abgeleitet aus SHOW GLOBAL STATUS · Deltas von qps/slow_qps
Status der entfernten DB SHOW GLOBAL STATUS · SHOW VARIABLES max_connections direkte Verbindung zu jeder registrierten DB
Wartende Abfragen information_schema.processlist serverweit mit dem PROCESS-Recht
Schemagröße information_schema.tables langer Cache über 30 Minuten (umgeht langsame Abfragen)

Keine Verbindungslecks. DbCollectorService::withConn() erzeugt je Messung eine Laufzeitverbindung und schließt sie sofort im finally per DB::purge. Ein PDO-Timeout (Vorgabe 5 s) verhindert, dass Web-Requests und geplante Aufgaben an entfernter Latenz hängen bleiben. Starten Sie niemals einen Daemon mit Endlosschleife aus dem Scheduler — er erschöpft den gemeinsam genutzten MySQL-Verbindungspool (der Vorfall [1040] Too many connections vom 2026-08-06).

Zugriff

Das vollständige Schema finden Sie unter Zugriffsstufen.

Fehlerbehebung und FAQ

Verwandte Themen

수집기 관리 — 데이터베이스 그룹
수집기 관리 — 데이터베이스 그룹